TestHTMLReporter.java revision 0b2ac5eab08098da2c2b63d4a3f87ba72ad5d6a1
1336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beustpackage org.testng.reporters; 2336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 3336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beustimport java.util.Collection; 4336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beustimport java.util.Collections; 5336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beustimport java.util.Comparator; 6336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beustimport java.util.Date; 7336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beustimport java.util.List; 8336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 9336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beustimport org.testng.ITestContext; 10336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beustimport org.testng.ITestNGMethod; 11336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beustimport org.testng.ITestResult; 12336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beustimport org.testng.Reporter; 13336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beustimport org.testng.TestListenerAdapter; 14336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beustimport org.testng.internal.Utils; 15336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 16336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 17336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust/** 18336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust * This class implements an HTML reporter for individual tests. 19336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust * 20336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust * @author Cedric Beust, May 2, 2004 219a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm * @author <a href='mailto:the_mindstorm@evolva.ro'>Alexandru Popescu</a> 22336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust */ 23336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beustpublic class TestHTMLReporter extends TestListenerAdapter { 249a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm private static final Comparator<ITestResult> NAME_COMPARATOR= new NameComparator(); 259a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm private static final Comparator<ITestResult> CONFIGURATION_COMPARATOR= new ConfigurationComparator(); 269a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm 27336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust private ITestContext m_testContext = null; 28336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 29336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust ///// 30336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust // implements ITestListener 31336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust // 32336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust @Override 33336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust public void onStart(ITestContext context) { 34336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust m_testContext = context; 35336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 36336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 37336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust @Override 38336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust public void onFinish(ITestContext context) { 39336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust generateLog(m_testContext, 40336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust null /* host */, 419a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm m_testContext.getOutputDirectory(), 429a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm getConfigurationFailures(), 439a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm getConfigurationSkips(), 44336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust getPassedTests(), 45336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust getFailedTests(), 46336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust getSkippedTests(), 47336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust getFailedButWithinSuccessPercentageTests()); 48336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 49336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust // 50336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust // implements ITestListener 51336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust ///// 52336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 538199621f3dd6adcbc12e93c4ea5508cf9f4f9055the.mindstorm private static String getOutputFile(ITestContext context) { 548199621f3dd6adcbc12e93c4ea5508cf9f4f9055the.mindstorm return context.getName() + ".html"; 55336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 56336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 57336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust public static void generateTable(StringBuffer sb, String title, 589a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm Collection<ITestResult> tests, String cssClass, Comparator<ITestResult> comparator) 59336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust { 60336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust sb.append("<table width='100%' border='1' class='invocation-").append(cssClass).append("'>\n") 61b1b620551c4ac0ab75d30158ec482e65cda30823Cédric Beust .append("<tr><td colspan='4' align='center'><b>").append(title).append("</b></td></tr>\n") 62336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust .append("<tr>") 63336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust .append("<td><b>Test method</b></td>\n") 64336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust .append("<td width=\"30%\"><b>Exception</b></td>\n") 6537d27f306eb39607b1ce933ee2fe3a1e2353c452Cédric Beust .append("<td width=\"10%\"><b>Time (seconds)</b></td>\n") 6637d27f306eb39607b1ce933ee2fe3a1e2353c452Cédric Beust .append("<td><b>Instance</b></td>\n") 67336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust .append("</tr>\n"); 68336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 69336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust if (tests instanceof List) { 709a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm Collections.sort((List<ITestResult>) tests, comparator); 71336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 72336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 73336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust // User output? 74336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust String id = ""; 75336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust Throwable tw = null; 76336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 77336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust for (ITestResult tr : tests) { 78336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust sb.append("<tr>\n"); 79336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 80336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust // Test method 81336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust ITestNGMethod method = tr.getMethod(); 82336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 83b1b620551c4ac0ab75d30158ec482e65cda30823Cédric Beust sb.append("<td title='").append(tr.getTestClass().getName()).append(".") 84b1b620551c4ac0ab75d30158ec482e65cda30823Cédric Beust .append(tr.getName()) 85b1b620551c4ac0ab75d30158ec482e65cda30823Cédric Beust .append("()'>") 869f2367a1c4b17a5b38fb6fa209b717fb42d4faccCédric Beust .append("<b>").append(tr.getName()).append("</b>"); 879f2367a1c4b17a5b38fb6fa209b717fb42d4faccCédric Beust 8837ac2350e62621bb857a4a77048e7e9d20ac14c5nullin // Test class 8937ac2350e62621bb857a4a77048e7e9d20ac14c5nullin String testClass = tr.getTestClass().getName(); 9037ac2350e62621bb857a4a77048e7e9d20ac14c5nullin if (testClass != null) { 9137ac2350e62621bb857a4a77048e7e9d20ac14c5nullin sb.append("<br>").append("Test class: " + testClass); 9237ac2350e62621bb857a4a77048e7e9d20ac14c5nullin 9337ac2350e62621bb857a4a77048e7e9d20ac14c5nullin // Test name 9437ac2350e62621bb857a4a77048e7e9d20ac14c5nullin String testName = tr.getTestName(); 9537ac2350e62621bb857a4a77048e7e9d20ac14c5nullin if (testName != null) { 9637ac2350e62621bb857a4a77048e7e9d20ac14c5nullin sb.append(" (").append(testName).append(")"); 9737ac2350e62621bb857a4a77048e7e9d20ac14c5nullin } 989f2367a1c4b17a5b38fb6fa209b717fb42d4faccCédric Beust } 99336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 100336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust // Method description 101336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust if (! Utils.isStringEmpty(method.getDescription())) { 10237ac2350e62621bb857a4a77048e7e9d20ac14c5nullin sb.append("<br>").append("Test method: ").append(method.getDescription()); 103336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 104336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 105336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust Object[] parameters = tr.getParameters(); 106336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust if (parameters != null && parameters.length > 0) { 1079f2367a1c4b17a5b38fb6fa209b717fb42d4faccCédric Beust sb.append("<br>Parameters: "); 108336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust for (int j = 0; j < parameters.length; j++) { 109336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust if (j > 0) sb.append(", "); 110336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust sb.append(parameters[j] == null ? "null" : parameters[j].toString()); 111336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 112336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 113336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 114336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust // 115336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust // Output from the method, created by the user calling Reporter.log() 116336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust // 117336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust { 118336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust List<String> output = Reporter.getOutput(tr); 119336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust if (null != output && output.size() > 0) { 120336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust sb.append("<br/>"); 121336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust // Method name 122336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust String divId = "Output-" + tr.hashCode(); 123336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust sb.append("\n<a href=\"#").append(divId).append("\"") 124a124a51edf8709b78bc35762c62fba8d4c7ecb28the.mindstorm .append(" onClick='toggleBox(\"").append(divId).append("\", this, \"Show output\", \"Hide output\");'>") 125336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust .append("Show output</a>\n") 126336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust .append("\n<a href=\"#").append(divId).append("\"") 127336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust .append(" onClick=\"toggleAllBoxes();\">Show all outputs</a>\n") 128336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust ; 129336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 130336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust // Method output 131336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust sb.append("<div class='log' id=\"").append(divId).append("\">\n"); 132336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust for (String s : output) { 133336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust sb.append(s).append("<br/>\n"); 134336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 135336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust sb.append("</div>\n"); 136336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 137336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 138336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 139336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust sb.append("</td>\n"); 140b1b620551c4ac0ab75d30158ec482e65cda30823Cédric Beust 141336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 142336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust // Exception 143336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust tw = tr.getThrowable(); 144336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust String stackTrace = ""; 145336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust String fullStackTrace = ""; 146336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 147336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust id = "stack-trace" + tr.hashCode(); 148336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust sb.append("<td>"); 149336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 150336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust if (null != tw) { 151336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust String[] stackTraces = Utils.stackTrace(tw, true); 152139b3297a77335e3fda59b783b72117fc7dcf8aethe.mindstorm fullStackTrace = stackTraces[1]; 153139b3297a77335e3fda59b783b72117fc7dcf8aethe.mindstorm stackTrace = "<div><pre>" + stackTraces[0] + "</pre></div>"; 154336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 155336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust sb.append(stackTrace); 156336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust // JavaScript link 157336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust sb.append("<a href='#' onClick='toggleBox(\"") 158a124a51edf8709b78bc35762c62fba8d4c7ecb28the.mindstorm .append(id).append("\", this, \"Click to show all stack frames\", \"Click to hide stack frames\")'>") 159336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust .append("Click to show all stack frames").append("</a>\n") 160336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust .append("<div class='stack-trace' id='" + id + "'>") 161336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust .append("<pre>" + fullStackTrace + "</pre>") 162336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust .append("</div>") 163336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust ; 164336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 165336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 16637d27f306eb39607b1ce933ee2fe3a1e2353c452Cédric Beust sb.append("</td>\n"); 16737d27f306eb39607b1ce933ee2fe3a1e2353c452Cédric Beust 16837d27f306eb39607b1ce933ee2fe3a1e2353c452Cédric Beust // Time 16937d27f306eb39607b1ce933ee2fe3a1e2353c452Cédric Beust long time = (tr.getEndMillis() - tr.getStartMillis()) / 1000; 1700b2ac5eab08098da2c2b63d4a3f87ba72ad5d6a1nullin String strTime = Long.toString(time); 17137d27f306eb39607b1ce933ee2fe3a1e2353c452Cédric Beust sb.append("<td>").append(strTime).append("</td>\n"); 17237d27f306eb39607b1ce933ee2fe3a1e2353c452Cédric Beust 17337d27f306eb39607b1ce933ee2fe3a1e2353c452Cédric Beust // Instance 17437d27f306eb39607b1ce933ee2fe3a1e2353c452Cédric Beust Object instance = tr.getInstance(); 17537d27f306eb39607b1ce933ee2fe3a1e2353c452Cédric Beust sb.append("<td>").append(instance).append("</td>"); 17637d27f306eb39607b1ce933ee2fe3a1e2353c452Cédric Beust 17737d27f306eb39607b1ce933ee2fe3a1e2353c452Cédric Beust sb.append("</tr>\n"); 178336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 179336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 180336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust sb.append("</table><p>\n"); 181336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 182336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 183336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 184336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust private static String arrayToString(String[] array) { 185336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust StringBuffer result = new StringBuffer(""); 186336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust for (int i = 0; i < array.length; i++) { 187336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust result.append(array[i]).append(" "); 188336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 189336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 190336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust return result.toString(); 191336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 192336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 193336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust private static String HEAD = 194336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust "\n<style type=\"text/css\">\n" + 195336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust ".log { display: none;} \n" + 196336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust ".stack-trace { display: none;} \n" + 197336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust "</style>\n" + 198336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust "<script type=\"text/javascript\">\n" + 199336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust "<!--\n" + 200336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust "function flip(e) {\n" + 201336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust " current = e.style.display;\n" + 202336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust " if (current == 'block') {\n" + 203336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust " e.style.display = 'none';\n" + 204a124a51edf8709b78bc35762c62fba8d4c7ecb28the.mindstorm " return 0;\n" + 205336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust " }\n" + 206336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust " else {\n" + 207336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust " e.style.display = 'block';\n" + 208a124a51edf8709b78bc35762c62fba8d4c7ecb28the.mindstorm " return 1;\n" + 209336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust " }\n" + 210336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust "}\n" + 211336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust "\n" + 212a124a51edf8709b78bc35762c62fba8d4c7ecb28the.mindstorm "function toggleBox(szDivId, elem, msg1, msg2)\n" + 213336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust "{\n" + 214a124a51edf8709b78bc35762c62fba8d4c7ecb28the.mindstorm " var res = -1;" + 215336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust " if (document.getElementById) {\n" + 216a124a51edf8709b78bc35762c62fba8d4c7ecb28the.mindstorm " res = flip(document.getElementById(szDivId));\n" + 217336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust " }\n" + 218336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust " else if (document.all) {\n" + 219336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust " // this is the way old msie versions work\n" + 220a124a51edf8709b78bc35762c62fba8d4c7ecb28the.mindstorm " res = flip(document.all[szDivId]);\n" + 221a124a51edf8709b78bc35762c62fba8d4c7ecb28the.mindstorm " }\n" + 222a124a51edf8709b78bc35762c62fba8d4c7ecb28the.mindstorm " if(elem) {\n" + 223a124a51edf8709b78bc35762c62fba8d4c7ecb28the.mindstorm " if(res == 0) elem.innerHTML = msg1; else elem.innerHTML = msg2;\n" + 224336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust " }\n" + 225336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust "\n" + 226336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust "}\n" + 227336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust "\n" + 228336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust "function toggleAllBoxes() {\n" + 229336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust " if (document.getElementsByTagName) {\n" + 230336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust " d = document.getElementsByTagName('div');\n" + 231336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust " for (i = 0; i < d.length; i++) {\n" + 232336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust " if (d[i].className == 'log') {\n" + 233336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust " flip(d[i]);\n" + 234336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust " }\n" + 235336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust " }\n" + 236336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust " }\n" + 237336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust "}\n" + 238336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust "\n" + 239336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust "// -->\n" + 240336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust "</script>\n" + 241336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust "\n"; 242336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 243336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust public static void generateLog(ITestContext testContext, 2449a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm String host, 2459a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm String outputDirectory, 2469a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm Collection<ITestResult> failedConfs, 2479a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm Collection<ITestResult> skippedConfs, 2489a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm Collection<ITestResult> passedTests, 2499a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm Collection<ITestResult> failedTests, 2509a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm Collection<ITestResult> skippedTests, 2519a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm Collection<ITestResult> percentageTests) 252336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust { 253336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust StringBuffer sb = new StringBuffer(); 254336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust sb.append("<html>\n<head>\n") 255336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust .append("<title>TestNG: ").append(testContext.getName()).append("</title>\n") 256336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust .append(HtmlHelper.getCssString()) 257336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust .append(HEAD) 258336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust .append("</head>\n") 259336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust .append("<body>\n"); 260336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 261336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust Date startDate = testContext.getStartDate(); 262336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust Date endDate = testContext.getEndDate(); 263336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust long duration = (endDate.getTime() - startDate.getTime()) / 1000; 264336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust int passed = 265336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust testContext.getPassedTests().size() + 266336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust testContext.getFailedButWithinSuccessPercentageTests().size(); 267336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust int failed = testContext.getFailedTests().size(); 268336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust int skipped = testContext.getSkippedTests().size(); 269336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust String hostLine = Utils.isStringEmpty(host) ? "" : "<tr><td>Remote host:</td><td>" + host 270336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust + "</td>\n</tr>"; 271336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 272336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust sb 273336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust .append("<h2 align='center'>").append(testContext.getName()).append("</h2>") 274336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust .append("<table border='1' align=\"center\">\n") 275336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust .append("<tr>\n") 276336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust// .append("<td>Property file:</td><td>").append(m_testRunner.getPropertyFileName()).append("</td>\n") 277336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust// .append("</tr><tr>\n") 278336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust .append("<td>Tests passed/Failed/Skipped:</td><td>").append(passed).append("/").append(failed).append("/").append(skipped).append("</td>\n") 279336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust .append("</tr><tr>\n") 280336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust .append("<td>Started on:</td><td>").append(testContext.getStartDate().toString()).append("</td>\n") 281336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust .append("</tr>\n") 282336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust .append(hostLine) 28308ebf81679fb5175f8090732f52ade4f9a099f1ethe.mindstorm .append("<tr><td>Total time:</td><td>").append(duration).append(" seconds (").append(endDate.getTime() - startDate.getTime()) 28408ebf81679fb5175f8090732f52ade4f9a099f1ethe.mindstorm .append(" ms)</td>\n") 285336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust .append("</tr><tr>\n") 286336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust .append("<td>Included groups:</td><td>").append(arrayToString(testContext.getIncludedGroups())).append("</td>\n") 287336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust .append("</tr><tr>\n") 288336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust .append("<td>Excluded groups:</td><td>").append(arrayToString(testContext.getExcludedGroups())).append("</td>\n") 289336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust .append("</tr>\n") 290336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust .append("</table><p/>\n") 291336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust ; 292336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 29301864456a039f32dd36028e4b26c63c10d03a5aaCédric Beust sb.append("<small><i>(Hover the method name to see the test class name)</i></small><p/>\n"); 2949a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm if (failedConfs.size() > 0) { 2959a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm generateTable(sb, "FAILED CONFIGURATIONS", failedConfs, "failed", CONFIGURATION_COMPARATOR); 2969a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm } 2979a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm if (skippedConfs.size() > 0) { 2989a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm generateTable(sb, "SKIPPED CONFIGURATIONS", skippedConfs, "skipped", CONFIGURATION_COMPARATOR); 2999a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm } 300336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust if (failedTests.size() > 0) { 3019a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm generateTable(sb, "FAILED TESTS", failedTests, "failed", NAME_COMPARATOR); 302336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 303336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust if (percentageTests.size() > 0) { 304336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust generateTable(sb, "FAILED TESTS BUT WITHIN SUCCESS PERCENTAGE", 3059a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm percentageTests, "percent", NAME_COMPARATOR); 306336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 307336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust if (passedTests.size() > 0) { 3089a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm generateTable(sb, "PASSED TESTS", passedTests, "passed", NAME_COMPARATOR); 309336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 310336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust if (skippedTests.size() > 0) { 3119a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm generateTable(sb, "SKIPPED TESTS", skippedTests, "skipped", NAME_COMPARATOR); 312336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 313336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 314336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust sb.append("</body>\n</html>"); 315336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 3168199621f3dd6adcbc12e93c4ea5508cf9f4f9055the.mindstorm Utils.writeFile(outputDirectory, getOutputFile(testContext), sb.toString()); 317336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 318336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 319336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust private static void ppp(String s) { 320336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust System.out.println("[TestHTMLReporter] " + s); 321336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust } 322336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust 3239a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm private static class NameComparator implements Comparator<ITestResult> { 3249a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm public int compare(ITestResult o1, ITestResult o2) { 3256c8ca81bdb931a7dedab1d30b60fb7381ac3f868Cédric Beust String c1 = o1.getMethod().getMethodName(); 3266c8ca81bdb931a7dedab1d30b60fb7381ac3f868Cédric Beust String c2 = o2.getMethod().getMethodName(); 3279a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm return c1.compareTo(c2); 3289a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm } 3299a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm 3309a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm } 3319a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm 3329a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm private static class ConfigurationComparator implements Comparator<ITestResult> { 3339a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm public int compare(ITestResult o1, ITestResult o2) { 3349a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm ITestNGMethod tm1= o1.getMethod(); 3359a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm ITestNGMethod tm2= o2.getMethod(); 3369a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm return annotationValue(tm2) - annotationValue(tm1); 3379a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm } 3389a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm 3399a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm private static int annotationValue(ITestNGMethod method) { 3409a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm if(method.isBeforeSuiteConfiguration()) { 3419a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm return 10; 3429a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm } 3439a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm if(method.isBeforeTestConfiguration()) { 3449a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm return 9; 3459a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm } 3469a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm if(method.isBeforeClassConfiguration()) { 3479a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm return 8; 3489a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm } 3499a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm if(method.isBeforeGroupsConfiguration()) { 3509a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm return 7; 3519a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm } 3529a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm if(method.isBeforeMethodConfiguration()) { 3539a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm return 6; 3549a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm } 3559a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm if(method.isAfterMethodConfiguration()) { 3569a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm return 5; 3579a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm } 3589a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm if(method.isAfterGroupsConfiguration()) { 3599a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm return 4; 3609a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm } 3619a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm if(method.isAfterClassConfiguration()) { 3629a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm return 3; 3639a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm } 3649a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm if(method.isAfterTestConfiguration()) { 3659a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm return 2; 3669a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm } 3679a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm if(method.isAfterSuiteConfiguration()) { 3689a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm return 1; 3699a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm } 3709a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm 3719a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm return 0; 3729a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm } 3739a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm } 3749a1482542f224166248c1821ddeb70c7dbc5415athe.mindstorm 375336f0ef401e9f564b8dc99d601ac80e8891ac2c1Cédric Beust} 376