com.javasbar.framework.testng.reporters.EmailableReporter Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of DolphinNG Show documentation
Show all versions of DolphinNG Show documentation
DolphinNG provides set of very useful addons for testNG. Most important features that it supports are
condensed smart reports, auto creation of jira ticets for test failures, linking test fails to jira tickets,
progress reporting during test runs.
package com.javasbar.framework.testng.reporters;
import org.testng.IReporter;
import org.testng.IResultMap;
import org.testng.ISuite;
import org.testng.ISuiteResult;
import org.testng.ITestClass;
import org.testng.ITestContext;
import org.testng.ITestNGMethod;
import org.testng.ITestResult;
import org.testng.Reporter;
import org.testng.internal.Utils;
import org.testng.log4testng.Logger;
import org.testng.reporters.util.StackTraceTools;
import org.testng.xml.XmlSuite;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Collection;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
/**
* Source: EmailableReporter
*
* Reported designed to render self-contained HTML top down view of a testing
* suite.
*
* @author Paul Mendelson
* @version $Revision: 719 $
* @since 5.2
*/
public class EmailableReporter implements IReporter
{
private static final Logger L = Logger.getLogger(EmailableReporter.class);
// ~ Instance fields ------------------------------------------------------
private PrintWriter m_out;
private int m_row;
private int m_methodIndex;
private int m_rowTotal;
// ~ Methods --------------------------------------------------------------
/**
* Creates summary of the run
*/
public void generateReport(List xml, List suites, String outdir)
{
try
{
m_out = createWriter(outdir);
} catch (IOException e)
{
L.error("output file", e);
return;
}
startHtml(m_out);
generateSuiteSummaryReport(suites);
generateMethodSummaryReport(suites);
generateMethodDetailReport(suites);
endHtml(m_out);
m_out.flush();
m_out.close();
}
protected PrintWriter createWriter(String outdir) throws IOException
{
return new PrintWriter(new BufferedWriter(new FileWriter(new File(outdir, "emailable-report.html"))));
}
/**
* Creates a table showing the highlights of each test method with links to the method details
*/
protected void generateMethodSummaryReport(List suites)
{
m_methodIndex = 0;
m_out.println("");
startResultSummaryTable("passed");
for (ISuite suite : suites)
{
if (suites.size() > 1)
{
titleRow(suite.getName(), 4);
}
Map r = suite.getResults();
for (ISuiteResult r2 : r.values())
{
ITestContext testContext = r2.getTestContext();
String testName = testContext.getName();
resultSummary(testContext.getFailedConfigurations(), testName, "failed", " (configuration methods)");
resultSummary(testContext.getFailedTests(), testName, "failed", "");
resultSummary(testContext.getSkippedConfigurations(), testName, "skipped", " (configuration methods)");
resultSummary(testContext.getSkippedTests(), testName, "skipped", "");
resultSummary(testContext.getPassedTests(), testName, "passed", "");
}
}
m_out.println("");
}
/**
* Creates a section showing known results for each method
*/
protected void generateMethodDetailReport(List suites)
{
m_methodIndex = 0;
for (ISuite suite : suites)
{
Map r = suite.getResults();
for (ISuiteResult r2 : r.values())
{
ITestContext testContext = r2.getTestContext();
if (r.values().size() > 0)
{
m_out.println("" + testContext.getName() + "
");
}
resultDetail(testContext.getFailedConfigurations(), "failed");
resultDetail(testContext.getFailedTests(), "failed");
resultDetail(testContext.getSkippedConfigurations(), "skipped");
resultDetail(testContext.getSkippedTests(), "skipped");
resultDetail(testContext.getPassedTests(), "passed");
}
}
}
/**
* @param tests
*/
private void resultSummary(IResultMap tests, String testname, String style, String details)
{
if (tests.getAllResults().size() > 0)
{
StringBuffer buff = new StringBuffer();
String lastClassName = "";
int mq = 0;
int cq = 0;
for (ITestNGMethod method : getMethodSet(tests))
{
m_row += 1;
m_methodIndex += 1;
ITestClass testClass = method.getTestClass();
String className = testClass.getName();
if (mq == 0)
{
titleRow(testname + " — " + style + details, 4);
}
if (!className.equalsIgnoreCase(lastClassName))
{
if (mq > 0)
{
cq += 1;
m_out.println("" + "" + lastClassName + buff);
}
mq = 0;
buff.setLength(0);
lastClassName = className;
}
Set resultSet = tests.getResults(method);
long end = Long.MIN_VALUE;
long start = Long.MAX_VALUE;
for (ITestResult testResult : tests.getResults(method))
{
if (testResult.getEndMillis() > end)
{
end = testResult.getEndMillis();
}
if (testResult.getStartMillis() < start)
{
start = testResult.getStartMillis();
}
}
mq += 1;
if (mq > 1)
{
buff.append("");
}
String description = method.getDescription();
String testInstanceName = resultSet.toArray(new ITestResult[]{})[0].getTestName();
buff.append(""
+ qualifiedName(method)
+ " " + (description != null && description.length() > 0
? "(\"" + description + "\")"
: "")
+ "" + (null == testInstanceName ? "" : "
(" + testInstanceName + ")")
+ " " + ""
+ resultSet.size() + " " + (end - start)
+ " ");
}
if (mq > 0)
{
cq += 1;
m_out.println("" + "" + lastClassName + buff);
}
}
}
/**
* Starts and defines columns result summary table
*/
private void startResultSummaryTable(String style)
{
tableStart(style);
m_out.println(" Class "
+ "Method # of
Scenarios Time
(Msecs) ");
m_row = 0;
}
private String qualifiedName(ITestNGMethod method)
{
StringBuilder addon = new StringBuilder();
String[] groups = method.getGroups();
int length = groups.length;
if (length > 0 && !"basic".equalsIgnoreCase(groups[0]))
{
addon.append("(");
for (int i = 0; i < length; i++)
{
if (i > 0) addon.append(", ");
addon.append(groups[i]);
}
addon.append(")");
}
return "" + method.getMethodName() + " " + addon;
}
private void resultDetail(IResultMap tests, final String style)
{
if (tests.getAllResults().size() > 0)
{
int row = 0;
for (ITestNGMethod method : getMethodSet(tests))
{
row += 1;
m_methodIndex += 1;
String cname = method.getTestClass().getName();
m_out.println("" + cname + ":"
+ method.getMethodName() + "
");
int rq = 0;
Set resultSet = tests.getResults(method);
for (ITestResult ans : resultSet)
{
rq += 1;
Object[] parameters = ans.getParameters();
boolean hasParameters = parameters != null && parameters.length > 0;
if (hasParameters)
{
if (rq == 1)
{
tableStart("param");
m_out.print("");
for (int x = 1; x <= parameters.length; x++)
{
m_out
.print("Parameter #"
+ x + " ");
}
m_out.println(" ");
}
m_out.print("");
for (Object p : parameters)
{
m_out.println(""
+ (p != null ? Utils.escapeHtml(p.toString()) : "null") + " ");
}
m_out.println(" ");
}
List msgs = Reporter.getOutput(ans);
boolean hasReporterOutput = msgs.size() > 0;
Throwable exception = ans.getThrowable();
boolean hasThrowable = exception != null;
if (hasReporterOutput || hasThrowable)
{
String indent = " style=\"padding-left:3em\"";
if (hasParameters)
{
m_out.println("");
} else
{
m_out.println("");
}
if (hasReporterOutput)
{
if (hasThrowable)
m_out.println("Test Messages
");
for (String line : msgs)
{
m_out.println(line + "
");
}
}
if (hasThrowable)
{
boolean wantsMinimalOutput = ans.getStatus() == ITestResult.SUCCESS;
if (hasReporterOutput)
m_out.println(""
+ (wantsMinimalOutput ? "Expected Exception" : "Failure")
+ "
");
generateExceptionReport(exception, method);
}
if (hasParameters)
{
m_out.println(" ");
} else
{
m_out.println("");
}
}
if (hasParameters)
{
if (rq == resultSet.size())
{
m_out.println("");
}
}
}
m_out.println("");
}
}
}
protected void generateExceptionReport(Throwable exception, ITestNGMethod method)
{
generateExceptionReport(exception, method, exception.getLocalizedMessage());
}
private void generateExceptionReport(Throwable exception, ITestNGMethod method, String title)
{
m_out.println("" + Utils.escapeHtml(title) + "
");
StackTraceElement[] s1 = exception.getStackTrace();
Throwable t2 = exception.getCause();
if (t2 == exception)
{
t2 = null;
}
int maxlines = Math.min(100, StackTraceTools.getTestRoot(s1, method));
for (int x = 0; x <= maxlines; x++)
{
m_out.println((x > 0 ? "
at " : "") + Utils.escapeHtml(s1[x].toString()));
}
if (maxlines < s1.length)
{
m_out.println("
" + (s1.length - maxlines) + " lines not shown");
}
if (t2 != null)
{
generateExceptionReport(t2, method, "Caused by " + t2.getLocalizedMessage());
}
}
/**
* @param tests
* @return
*/
private Collection getMethodSet(IResultMap tests)
{
Set r = new TreeSet(new TestSorter());
r.addAll(tests.getAllMethods());
return r;
}
public void generateSuiteSummaryReport(List suites)
{
tableStart("param");
m_out.print("Test ");
tableColumnStart("Methods
Passed");
tableColumnStart("Scenarios
Passed");
tableColumnStart("# skipped");
tableColumnStart("# failed");
tableColumnStart("Total
Time");
tableColumnStart("Included
Groups");
tableColumnStart("Excluded
Groups");
m_out.println(" ");
NumberFormat formatter = new DecimalFormat("#,##0.0");
int qty_tests = 0;
int qty_pass_m = 0;
int qty_pass_s = 0;
int qty_skip = 0;
int qty_fail = 0;
long time_start = Long.MAX_VALUE;
long time_end = Long.MIN_VALUE;
for (ISuite suite : suites)
{
if (suites.size() > 1)
{
titleRow(suite.getName(), 7);
}
Map tests = suite.getResults();
for (ISuiteResult r : tests.values())
{
qty_tests += 1;
ITestContext overview = r.getTestContext();
startSummaryRow(overview.getName());
int q = getMethodSet(overview.getPassedTests()).size();
qty_pass_m += q;
summaryCell(q, Integer.MAX_VALUE);
q = overview.getPassedTests().size();
qty_pass_s += q;
summaryCell(q, Integer.MAX_VALUE);
q = getMethodSet(overview.getSkippedTests()).size();
qty_skip += q;
summaryCell(q, 0);
q = getMethodSet(overview.getFailedTests()).size();
qty_fail += q;
summaryCell(q, 0);
time_start = Math.min(overview.getStartDate().getTime(), time_start);
time_end = Math.max(overview.getEndDate().getTime(), time_end);
summaryCell(formatter.format(
(overview.getEndDate().getTime() - overview.getStartDate().getTime()) / 1000.)
+ " seconds", true);
summaryCell(overview.getIncludedGroups());
summaryCell(overview.getExcludedGroups());
m_out.println(" ");
}
}
if (qty_tests > 1)
{
m_out.println("Total ");
summaryCell(qty_pass_m, Integer.MAX_VALUE);
summaryCell(qty_pass_s, Integer.MAX_VALUE);
summaryCell(qty_skip, 0);
summaryCell(qty_fail, 0);
summaryCell(formatter.format((time_end - time_start) / 1000.) + " seconds", true);
m_out.println(" ");
}
m_out.println("");
}
private void summaryCell(String[] val)
{
StringBuffer b = new StringBuffer();
for (String v : val)
{
b.append(v + " ");
}
summaryCell(b.toString(), true);
}
private void summaryCell(String v, boolean isgood)
{
m_out.print("" + v + " ");
}
private void startSummaryRow(String label)
{
m_row += 1;
m_out.print("" + label
+ " ");
}
private void summaryCell(int v, int maxexpected)
{
summaryCell(String.valueOf(v), v <= maxexpected);
m_rowTotal += v;
}
/**
*
*/
private void tableStart(String cssclass)
{
m_out.println("");
m_row = 0;
}
private void tableColumnStart(String label)
{
m_out.print("" + label + " ");
}
private void titleRow(String label, int cq)
{
m_out.println("" + label + " ");
m_row = 0;
}
protected void writeStyle(String[] formats, String[] targets)
{
}
/**
* Starts HTML stream
*/
protected void startHtml(PrintWriter out)
{
out.println("");
out.println("");
out.println("");
out.println("TestNG: Unit Test ");
out.println("");
out.println("");
out.println("");
}
/**
* Finishes HTML stream
*/
protected void endHtml(PrintWriter out)
{
out.println("");
}
// ~ Inner Classes --------------------------------------------------------
/**
* Arranges methods by classname and method name
*/
private class TestSorter implements Comparator
{
// ~ Methods -------------------------------------------------------------
/**
* Arranges methods by classname and method name
*/
public int compare(Object o1, Object o2)
{
int r = ((T) o1).getTestClass().getName().compareTo(((T) o2).getTestClass().getName());
if (r == 0)
{
r = ((T) o1).getMethodName().compareTo(((T) o2).getMethodName());
}
return r;
}
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy