Bret Pettichord writes:
> A question from one of my team mates:
>
> >For anyone currently using Selenium as part of their CI build:
> >Has anyone created a postresults servlet as described on the bottom of
> this page
http://selenium.thoughtworks.com/testrunner.html for writing
> Selenium test reports to a file?
Attached is the servlet I use to handle /postResults; I'm not sure who wrote
the original version. Note that this variant requires the resultsFileName
to be specified via an extra "resultsUrl" request-parameter; we invoke
Selenium as:
http://server/selenium/TestRunner.html?auto=true&resultsUrl=/postResults%3Fr
esultsFileName%3D/path/to/seleniumResults.html
NOTE: Support for "resultsUrl" is new (it wasn't in selenium-0.2) so for
simplicity, you may prefer to just hardcode a resultsFileName in the
servlet.
--
cheers, Mike
package au.com.someclient.selenium;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Writes the results of a Selenium test run to a file.
*/
public class SeleniumResultsServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String report = null;
try {
report = generateReport(unpackRequest(request));
}
catch (Exception e) {
reportError(e, HttpServletResponse.SC_BAD_REQUEST, response);
return;
}
String resultsFileName = request.getParameter("resultsFileName");
if (resultsFileName == null) {
getServletContext().log("WARNING: no resultsFileName specified");
}
else {
getServletContext().log("writing results to " + resultsFileName);
try {
Writer resultsFileWriter = new FileWriter(resultsFileName);
resultsFileWriter.write(report);
resultsFileWriter.close();
}
catch (IOException e) {
reportError(e, HttpServletResponse.SC_INTERNAL_SERVER_ERROR, response);
return;
}
}
response.getWriter().write(report);
}
private String getMandatoryParameter(HttpServletRequest request, String name) {
String paramValue = request.getParameter(name);
if (paramValue == null) {
throw new IllegalArgumentException("missing parameter: <" + name + ">");
}
return paramValue;
}
private SeleniumResults unpackRequest(HttpServletRequest request) {
SeleniumResults results = new SeleniumResults();
results.status = getMandatoryParameter(request,"result").toUpperCase();
results.totalTime = getMandatoryParameter(request,"totalTime");
results.numTestPasses = Integer.parseInt(getMandatoryParameter(request,"numTestPasses"));
results.numTestFailures = Integer.parseInt(getMandatoryParameter(request,"numTestFailures"));
results.numCommandPasses = Integer.parseInt(getMandatoryParameter(request,"numCommandPasses"));
results.numCommandFailures = Integer.parseInt(getMandatoryParameter(request,"numCommandFailures"));
results.numCommandErrors = Integer.parseInt(getMandatoryParameter(request,"numCommandErrors"));
results.suite = getMandatoryParameter(request,"suite");
results.testList = new ArrayList();
for (int i = 1;; i++) {
String testTable = request.getParameter("testTable." + i);
if (testTable == null) {
break;
}
results.testList.add(testTable);
}
return results;
}
private String generateReport(SeleniumResults results) {
StringWriter reportWriter = new StringWriter();
writeReport(results, new PrintWriter(reportWriter));
return reportWriter.toString();
}
private void writeReport(SeleniumResults results, PrintWriter writer) {
writer.println("<HTML>");
writer.println("<BODY>");
writer.println("<H2>Selenium Test Results</H2>");
writer.println("Result: " + results.status + "<br/>");
writer.println("Total time: " + results.totalTime + "<br/>");
writer.println("Tests passed: " + results.numTestPasses + "<br/>");
writer.println("Tests failed: " + results.numTestFailures + "<br/>");
writer.println("Commands passed: " + results.numCommandPasses + "<br/>");
writer.println("Commands failed: " + results.numCommandFailures + "<br/>");
writer.println("Command errors: " + results.numCommandErrors + "<br/>");
writer.println("<HR/>");
writer.println(results.suite);
writer.println("<HR/>");
for (Iterator i = results.testList.iterator(); i.hasNext();) {
String test = (String) i.next();
writer.println(test);
writer.println("<HR/>");
}
writer.println("</BODY>");
writer.println("</HTML>");
}
private void reportError(Throwable t, int errorCode, HttpServletResponse response) throws IOException {
response.setContentType("text/plain");
response.setStatus(errorCode);
PrintWriter out = response.getWriter();
t.printStackTrace(out);
}
private static final class SeleniumResults {
String status;
int numTestPasses;
int numTestFailures;
int numCommandPasses;
int numCommandFailures;
int numCommandErrors;
String totalTime;
String suite;
List testList;
}
}