From 89f5f96dc88122ea6d263bd57105496bee8525b5 Mon Sep 17 00:00:00 2001 From: "andrey.topchiy" Date: Fri, 2 Feb 2018 12:00:04 +0500 Subject: [PATCH 1/5] #1673 enable generateTestResultAttributes using Maven --- src/main/java/org/testng/CommandLineArgs.java | 8 ++++ src/main/java/org/testng/IReporter.java | 2 +- src/main/java/org/testng/TestNG.java | 38 +++++++++++++------ src/main/java/org/testng/TestNGAntTask.java | 4 ++ .../testng/reporters/JUnitReportReporter.java | 11 ++---- .../org/testng/reporters/XMLReporter.java | 25 ++++++++---- .../testng/reporters/XMLReporterConfig.java | 15 ++++++++ .../LocalJUnitReportReporter.java | 7 ++-- 8 files changed, 78 insertions(+), 32 deletions(-) diff --git a/src/main/java/org/testng/CommandLineArgs.java b/src/main/java/org/testng/CommandLineArgs.java index 6a5d8e9f82..0e1fce9870 100644 --- a/src/main/java/org/testng/CommandLineArgs.java +++ b/src/main/java/org/testng/CommandLineArgs.java @@ -28,6 +28,14 @@ public class CommandLineArgs { + " exclude") public String excludedGroups; + public static final String GENERATE_SUITE_ATTRIBUTES = "generateSuiteAttributes"; + @Parameter(names = GENERATE_SUITE_ATTRIBUTES, description ="Generate attributes of suite in xml report") + public Boolean generateSuiteAttributes = Boolean.FALSE; + + public static final String GENERATE_TESTRESULT_ATTRIBUTES = "-generateTestResultAttributes"; + @Parameter(names = GENERATE_TESTRESULT_ATTRIBUTES, description ="Generate attributes of test-method in xml report") + public Boolean generateTestResultAttributes = Boolean.FALSE; + public static final String OUTPUT_DIRECTORY = "-d"; @Parameter(names = OUTPUT_DIRECTORY, description ="Output directory") public String outputDirectory; diff --git a/src/main/java/org/testng/IReporter.java b/src/main/java/org/testng/IReporter.java index 495c3072c0..17f2be0fc9 100644 --- a/src/main/java/org/testng/IReporter.java +++ b/src/main/java/org/testng/IReporter.java @@ -16,5 +16,5 @@ public interface IReporter extends ITestNGListener { /** * Generate a report for the given suites into the specified output directory. */ - void generateReport(List xmlSuites, List suites, String outputDirectory); + void generateReport(List xmlSuites, List suites, IAttributes attributes); } diff --git a/src/main/java/org/testng/TestNG.java b/src/main/java/org/testng/TestNG.java index 4780033f90..e071a09d30 100644 --- a/src/main/java/org/testng/TestNG.java +++ b/src/main/java/org/testng/TestNG.java @@ -19,17 +19,7 @@ import org.testng.collections.Lists; import org.testng.collections.Maps; import org.testng.collections.Sets; -import org.testng.internal.ClassHelper; -import org.testng.internal.Configuration; -import org.testng.internal.DynamicGraph; -import org.testng.internal.ExitCode; -import org.testng.internal.IConfiguration; -import org.testng.internal.IResultListener2; -import org.testng.internal.OverrideProcessor; -import org.testng.internal.SuiteRunnerMap; -import org.testng.internal.Systematiser; -import org.testng.internal.Utils; -import org.testng.internal.Version; +import org.testng.internal.*; import org.testng.internal.annotations.DefaultAnnotationTransformer; import org.testng.internal.annotations.IAnnotationFinder; import org.testng.internal.annotations.JDK15AnnotationFinder; @@ -149,6 +139,8 @@ public class TestNG { private String m_defaultSuiteName=DEFAULT_COMMAND_LINE_SUITE_NAME; private String m_defaultTestName=DEFAULT_COMMAND_LINE_TEST_NAME; + private Boolean m_generateSuiteAttributes = false; + private Boolean m_generateTestResultAttributes = false; private Map m_methodDescriptors = Maps.newHashMap(); @@ -219,6 +211,22 @@ public void setOutputDirectory(final String outputdir) { } } + /** + * Sets the possibility to generate TestResult attributes + * @param generateTestResultAttributes true / false. + */ + public void setGenerateTestResultAttributes(final Boolean generateTestResultAttributes) { + m_generateTestResultAttributes = generateTestResultAttributes; + } + + /** + * Sets the possibility to generate Suite attributes + * @param generateSuiteAttributes true / false. + */ + public void setGenerateSuiteAttributes(final Boolean generateSuiteAttributes) { + m_generateSuiteAttributes = generateSuiteAttributes; + } + /** * If this method is passed true before run(), the default listeners * will not be used. @@ -1073,7 +1081,11 @@ private void generateReports(List suiteRunners) { for (IReporter reporter : m_reporters.values()) { try { long start = System.currentTimeMillis(); - reporter.generateReport(m_suites, suiteRunners, m_outputDir); + IAttributes attributes = new Attributes(); + attributes.setAttribute("defaultOutputDirectory", m_outputDir); + attributes.setAttribute("generateSuiteAttributes", m_generateSuiteAttributes); + attributes.setAttribute("generateTestResultAttributes", m_generateTestResultAttributes); + reporter.generateReport(m_suites, suiteRunners, attributes); Utils.log("TestNG", 2, "Time taken by " + reporter + ": " + (System.currentTimeMillis() - start) + " ms"); } @@ -1363,6 +1375,8 @@ protected void configure(CommandLineArgs cla) { } setOutputDirectory(cla.outputDirectory); + setGenerateSuiteAttributes(cla.generateSuiteAttributes); + setGenerateTestResultAttributes(cla.generateTestResultAttributes); if (cla.testNames != null) { setTestNames(Arrays.asList(cla.testNames.split(","))); diff --git a/src/main/java/org/testng/TestNGAntTask.java b/src/main/java/org/testng/TestNGAntTask.java index fdf89652a8..086d76b6f8 100644 --- a/src/main/java/org/testng/TestNGAntTask.java +++ b/src/main/java/org/testng/TestNGAntTask.java @@ -121,6 +121,8 @@ public class TestNGAntTask extends Task { private String m_objectFactory; protected String m_testRunnerFactory; private boolean m_delegateCommandSystemProperties = false; + private boolean m_generateSuiteAttributes = false; + private boolean m_generateTestResultAttributes = false; protected Environment m_environment= new Environment(); @@ -563,6 +565,8 @@ protected List createArguments() { addStringIfNotBlank(argv, CommandLineArgs.TEST_NAME, m_testName); addStringIfNotBlank(argv, CommandLineArgs.TEST_NAMES, m_testNames); addStringIfNotBlank(argv, CommandLineArgs.METHODS, m_methods); + addBooleanIfTrue(argv, CommandLineArgs.GENERATE_SUITE_ATTRIBUTES, m_generateSuiteAttributes); + addBooleanIfTrue(argv, CommandLineArgs.GENERATE_TESTRESULT_ATTRIBUTES, m_generateTestResultAttributes); addReporterConfigs(argv); addIntegerIfNotNull(argv, CommandLineArgs.SUITE_THREAD_POOL_SIZE, m_suiteThreadPoolSize); addStringIfNotNull(argv, CommandLineArgs.XML_PATH_IN_JAR, m_xmlPathInJar); diff --git a/src/main/java/org/testng/reporters/JUnitReportReporter.java b/src/main/java/org/testng/reporters/JUnitReportReporter.java index caa67c71ad..8f995a0108 100644 --- a/src/main/java/org/testng/reporters/JUnitReportReporter.java +++ b/src/main/java/org/testng/reporters/JUnitReportReporter.java @@ -1,11 +1,6 @@ package org.testng.reporters; -import org.testng.IReporter; -import org.testng.ISuite; -import org.testng.ISuiteResult; -import org.testng.ITestContext; -import org.testng.ITestNGMethod; -import org.testng.ITestResult; +import org.testng.*; import org.testng.collections.ListMultiMap; import org.testng.collections.SetMultiMap; import org.testng.collections.Lists; @@ -35,7 +30,7 @@ public class JUnitReportReporter implements IReporter { @Override public void generateReport(List xmlSuites, List suites, - String defaultOutputDirectory) { + IAttributes attributes) { Map, Set> results = Maps.newHashMap(); ListMultiMap befores = Maps.newListMultiMap(); @@ -170,7 +165,7 @@ public void generateReport(List xmlSuites, List suites, } xsb.pop(XMLConstants.TESTSUITE); - String outputDirectory = defaultOutputDirectory + File.separator + "junitreports"; + String outputDirectory = attributes.getAttribute("defaultOutputDirectory") + File.separator + "junitreports"; Utils.writeUtf8File(outputDirectory, getFileName(cls), xsb.toXML()); } diff --git a/src/main/java/org/testng/reporters/XMLReporter.java b/src/main/java/org/testng/reporters/XMLReporter.java index d1fb878c82..71f3430d84 100644 --- a/src/main/java/org/testng/reporters/XMLReporter.java +++ b/src/main/java/org/testng/reporters/XMLReporter.java @@ -1,11 +1,6 @@ package org.testng.reporters; -import org.testng.IReporter; -import org.testng.ISuite; -import org.testng.ISuiteResult; -import org.testng.ITestContext; -import org.testng.ITestNGMethod; -import org.testng.Reporter; +import org.testng.*; import org.testng.internal.Utils; import org.testng.xml.XmlSuite; @@ -34,10 +29,12 @@ public class XMLReporter implements IReporter { @Override public void generateReport(List xmlSuites, List suites, - String outputDirectory) { + IAttributes attributes) { if (Utils.isStringEmpty(config.getOutputDirectory())) { - config.setOutputDirectory(outputDirectory); + getConfig().setOutputDirectory((String)attributes.getAttribute("defaultOutputDirectory")); } + getConfig().setGenerateTestResultAttributes((Boolean)attributes.getAttribute("generateTestResultAttributes")); + getConfig().setGenerateSuiteAttributes((Boolean)attributes.getAttribute("generateSuiteAttributes")); // Calculate passed/failed/skipped int passed = 0; @@ -126,6 +123,8 @@ private File referenceSuite(XMLStringBuffer xmlBuffer, ISuite suite) { private void writeSuiteToBuffer(XMLStringBuffer xmlBuffer, ISuite suite) { xmlBuffer.push(XMLReporterConfig.TAG_SUITE, getSuiteAttributes(suite)); writeSuiteGroups(xmlBuffer, suite); + if (getConfig().isGenerateSuiteAttributes()) + writeSuiteCustomAttributes(xmlBuffer, suite); Map results = suite.getResults(); XMLSuiteResultWriter suiteResultWriter = new XMLSuiteResultWriter(config); @@ -209,6 +208,16 @@ private Set getUniqueMethodSet(Collection methods) return result; } + private void writeSuiteCustomAttributes(XMLStringBuffer xmlBuffer, ISuite suite) { + for (String attribute : suite.getAttributeNames()) { + if (suite.getAttribute(attribute) != null) { + xmlBuffer.push(attribute); + xmlBuffer.addCDATA((String) suite.getAttribute(attribute)); + xmlBuffer.pop(); + } + } + } + /** * @deprecated Unused */ diff --git a/src/main/java/org/testng/reporters/XMLReporterConfig.java b/src/main/java/org/testng/reporters/XMLReporterConfig.java index a197a51fd8..82ca968973 100644 --- a/src/main/java/org/testng/reporters/XMLReporterConfig.java +++ b/src/main/java/org/testng/reporters/XMLReporterConfig.java @@ -1,5 +1,6 @@ package org.testng.reporters; +import org.testng.ISuite; import org.testng.ITestResult; import java.util.HashMap; @@ -139,6 +140,12 @@ public static Integer getStatus(String status) { */ private boolean generateTestResultAttributes = false; + /** + * Indicates whether {@link ISuite} attributes should be generated for + * each suite elements + */ + private boolean generateSuiteAttributes = false; + /** * The output format for timestamps */ @@ -237,6 +244,14 @@ public boolean isGenerateTestResultAttributes() { return generateTestResultAttributes; } + public void setGenerateSuiteAttributes(boolean generateSuiteAttributes) { + this.generateSuiteAttributes = generateSuiteAttributes; + } + + public boolean isGenerateSuiteAttributes() { + return generateSuiteAttributes; + } + public enum StackTraceLevels { /** * No stacktrace will be written in the output file diff --git a/src/test/java/test/junitreports/LocalJUnitReportReporter.java b/src/test/java/test/junitreports/LocalJUnitReportReporter.java index 1b81798525..d25ff51a97 100644 --- a/src/test/java/test/junitreports/LocalJUnitReportReporter.java +++ b/src/test/java/test/junitreports/LocalJUnitReportReporter.java @@ -1,5 +1,6 @@ package test.junitreports; +import org.testng.IAttributes; import org.testng.ISuite; import org.testng.reporters.JUnitReportReporter; import org.testng.xml.XmlSuite; @@ -13,9 +14,9 @@ public class LocalJUnitReportReporter extends JUnitReportReporter implements Tes private List testsuites = new ArrayList<>(); @Override - public void generateReport(List xmlSuites, List suites, String defaultOutputDirectory) { - super.generateReport(xmlSuites, suites, defaultOutputDirectory); - String dir = defaultOutputDirectory + File.separator + "junitreports"; + public void generateReport(List xmlSuites, List suites, IAttributes attributes) { + super.generateReport(xmlSuites, suites, attributes); + String dir = attributes.getAttribute("defaultOutputDirectory") + File.separator + "junitreports"; File directory = new File(dir); File[] files = directory.listFiles(new FilenameFilter() { @Override From 7ad64418a3e8a0438edb57f9d480ba3f9b2e163d Mon Sep 17 00:00:00 2001 From: "andrey.topchiy" Date: Fri, 2 Feb 2018 12:06:12 +0500 Subject: [PATCH 2/5] #1673 enable generateTestResultAttributes using Maven --- src/main/java/org/testng/CommandLineArgs.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/testng/CommandLineArgs.java b/src/main/java/org/testng/CommandLineArgs.java index 0e1fce9870..626ccabafa 100644 --- a/src/main/java/org/testng/CommandLineArgs.java +++ b/src/main/java/org/testng/CommandLineArgs.java @@ -28,7 +28,7 @@ public class CommandLineArgs { + " exclude") public String excludedGroups; - public static final String GENERATE_SUITE_ATTRIBUTES = "generateSuiteAttributes"; + public static final String GENERATE_SUITE_ATTRIBUTES = "-generateSuiteAttributes"; @Parameter(names = GENERATE_SUITE_ATTRIBUTES, description ="Generate attributes of suite in xml report") public Boolean generateSuiteAttributes = Boolean.FALSE; From 195dd045ed403666412fcae7824e17cfba95f69f Mon Sep 17 00:00:00 2001 From: "andrey.topchiy" Date: Fri, 2 Feb 2018 12:15:40 +0500 Subject: [PATCH 3/5] #1673 enable generateTestResultAttributes using Maven --- src/main/java/org/testng/IReporter.java | 2 +- src/main/java/org/testng/TestNG.java | 13 ++++++++++++- .../org/testng/reporters/JUnitReportReporter.java | 8 +++++++- src/main/java/org/testng/reporters/XMLReporter.java | 8 +++++++- 4 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/testng/IReporter.java b/src/main/java/org/testng/IReporter.java index 17f2be0fc9..ce6e8ce565 100644 --- a/src/main/java/org/testng/IReporter.java +++ b/src/main/java/org/testng/IReporter.java @@ -14,7 +14,7 @@ */ public interface IReporter extends ITestNGListener { /** - * Generate a report for the given suites into the specified output directory. + * Generate a report for the given suites with specified attributes */ void generateReport(List xmlSuites, List suites, IAttributes attributes); } diff --git a/src/main/java/org/testng/TestNG.java b/src/main/java/org/testng/TestNG.java index e071a09d30..bb3b1c85ee 100644 --- a/src/main/java/org/testng/TestNG.java +++ b/src/main/java/org/testng/TestNG.java @@ -19,7 +19,18 @@ import org.testng.collections.Lists; import org.testng.collections.Maps; import org.testng.collections.Sets; -import org.testng.internal.*; +import org.testng.internal.ClassHelper; +import org.testng.internal.Configuration; +import org.testng.internal.DynamicGraph; +import org.testng.internal.ExitCode; +import org.testng.internal.IConfiguration; +import org.testng.internal.IResultListener2; +import org.testng.internal.OverrideProcessor; +import org.testng.internal.SuiteRunnerMap; +import org.testng.internal.Systematiser; +import org.testng.internal.Utils; +import org.testng.internal.Attributes; +import org.testng.internal.Version; import org.testng.internal.annotations.DefaultAnnotationTransformer; import org.testng.internal.annotations.IAnnotationFinder; import org.testng.internal.annotations.JDK15AnnotationFinder; diff --git a/src/main/java/org/testng/reporters/JUnitReportReporter.java b/src/main/java/org/testng/reporters/JUnitReportReporter.java index 8f995a0108..79dd22b5f5 100644 --- a/src/main/java/org/testng/reporters/JUnitReportReporter.java +++ b/src/main/java/org/testng/reporters/JUnitReportReporter.java @@ -1,6 +1,12 @@ package org.testng.reporters; -import org.testng.*; +import org.testng.IReporter; +import org.testng.ISuite; +import org.testng.ISuiteResult; +import org.testng.ITestContext; +import org.testng.ITestNGMethod; +import org.testng.ITestResult; +import org.testng.IAttributes; import org.testng.collections.ListMultiMap; import org.testng.collections.SetMultiMap; import org.testng.collections.Lists; diff --git a/src/main/java/org/testng/reporters/XMLReporter.java b/src/main/java/org/testng/reporters/XMLReporter.java index 71f3430d84..0d4e799d18 100644 --- a/src/main/java/org/testng/reporters/XMLReporter.java +++ b/src/main/java/org/testng/reporters/XMLReporter.java @@ -1,6 +1,12 @@ package org.testng.reporters; -import org.testng.*; +import org.testng.IReporter; +import org.testng.Reporter; +import org.testng.ISuite; +import org.testng.ISuiteResult; +import org.testng.ITestContext; +import org.testng.ITestNGMethod; +import org.testng.IAttributes; import org.testng.internal.Utils; import org.testng.xml.XmlSuite; From 6ae19218d585f13faa6f50bbb394824f9042b50f Mon Sep 17 00:00:00 2001 From: "andrey.topchiy" Date: Fri, 2 Feb 2018 12:27:59 +0500 Subject: [PATCH 4/5] #1673 enable generateTestResultAttributes using Maven --- src/main/java/org/testng/reporters/EmailableReporter.java | 5 +++-- src/main/java/org/testng/reporters/EmailableReporter2.java | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/testng/reporters/EmailableReporter.java b/src/main/java/org/testng/reporters/EmailableReporter.java index 79dee56f93..90bd250d3f 100644 --- a/src/main/java/org/testng/reporters/EmailableReporter.java +++ b/src/main/java/org/testng/reporters/EmailableReporter.java @@ -1,5 +1,6 @@ package org.testng.reporters; +import org.testng.IAttributes; import org.testng.IInvokedMethod; import org.testng.IReporter; import org.testng.IResultMap; @@ -65,9 +66,9 @@ public void setFileName(String fileName) { /** Creates summary of the run */ @Override - public void generateReport(List xml, List suites, String outdir) { + public void generateReport(List xml, List suites, IAttributes attributes) { try { - m_out = createWriter(outdir); + m_out = createWriter((String)attributes.getAttribute("defaultOutputDirectory")); } catch (IOException e) { L.error("output file", e); diff --git a/src/main/java/org/testng/reporters/EmailableReporter2.java b/src/main/java/org/testng/reporters/EmailableReporter2.java index d24efca560..5f180cf885 100644 --- a/src/main/java/org/testng/reporters/EmailableReporter2.java +++ b/src/main/java/org/testng/reporters/EmailableReporter2.java @@ -12,6 +12,7 @@ import java.util.List; import java.util.Set; +import org.testng.IAttributes; import org.testng.IReporter; import org.testng.ISuite; import org.testng.ISuiteResult; @@ -52,9 +53,9 @@ public String getFileName() { } @Override - public void generateReport(List xmlSuites, List suites, String outputDirectory) { + public void generateReport(List xmlSuites, List suites, IAttributes attributes) { try { - writer = createWriter(outputDirectory); + writer = createWriter((String)attributes.getAttribute("defaultOutputDirectory")); } catch (IOException e) { LOG.error("Unable to create output file", e); return; From 8d52840442334fb0245003e9de32f4aee80598f1 Mon Sep 17 00:00:00 2001 From: "andrey.topchiy" Date: Fri, 2 Feb 2018 15:45:48 +0500 Subject: [PATCH 5/5] #1673 enable generateTestResultAttributes using Maven --- src/main/java/org/testng/IReporter.java | 4 +-- src/main/java/org/testng/IReporter2.java | 20 ++++++++++++ src/main/java/org/testng/TestNG.java | 29 ++++++++++++++--- .../org/testng/internal/ExitCodeListener.java | 7 +++-- .../testng/reporters/EmailableReporter.java | 4 +-- .../testng/reporters/EmailableReporter2.java | 6 ++-- .../org/testng/reporters/FailedReporter.java | 10 +++--- .../testng/reporters/JUnitReportReporter.java | 4 +-- .../java/org/testng/reporters/JqReporter.java | 9 +++--- .../testng/reporters/SuiteHTMLReporter.java | 11 ++++--- .../org/testng/reporters/XMLReporter.java | 4 +-- .../java/org/testng/reporters/jq/Main.java | 9 +++--- .../org/testng/internal/ConsoleReporter.java | 4 +-- src/test/java/test/CountTest2.java | 31 +++++++++++++++++++ .../multiplelisteners/SimpleReporter.java | 7 +++-- .../java/test/name/TestOnClassListener.java | 7 +++-- .../github1046/LocalTestNameGatherer.java | 7 +++-- .../test/simple/IncludedExcludedTest.java | 7 +++-- .../TestExecutionListenerInvocationOrder.java | 4 +-- .../test/testng1232/ListenerTemplate.java | 4 +-- .../test/testng1232/TestListenerFor1232.java | 2 +- 21 files changed, 133 insertions(+), 57 deletions(-) create mode 100644 src/main/java/org/testng/IReporter2.java create mode 100644 src/test/java/test/CountTest2.java diff --git a/src/main/java/org/testng/IReporter.java b/src/main/java/org/testng/IReporter.java index ce6e8ce565..495c3072c0 100644 --- a/src/main/java/org/testng/IReporter.java +++ b/src/main/java/org/testng/IReporter.java @@ -14,7 +14,7 @@ */ public interface IReporter extends ITestNGListener { /** - * Generate a report for the given suites with specified attributes + * Generate a report for the given suites into the specified output directory. */ - void generateReport(List xmlSuites, List suites, IAttributes attributes); + void generateReport(List xmlSuites, List suites, String outputDirectory); } diff --git a/src/main/java/org/testng/IReporter2.java b/src/main/java/org/testng/IReporter2.java new file mode 100644 index 0000000000..7748c8e0a2 --- /dev/null +++ b/src/main/java/org/testng/IReporter2.java @@ -0,0 +1,20 @@ +package org.testng; + +import org.testng.xml.XmlSuite; + +import java.util.List; + +/** + * This interface can be implemented by clients to generate a report. Its method + * generateReport() will be invoked after all the suite have run and the parameters + * give all the test results that happened during that run. + * + * @author kanaduchi + * Feb 02, 2018 + */ +public interface IReporter2 extends ITestNGListener { + /** + * Generate a report for the given suites with specified attributes + */ + void generateReport(List xmlSuites, List suites, IAttributes attributes); +} diff --git a/src/main/java/org/testng/TestNG.java b/src/main/java/org/testng/TestNG.java index bb3b1c85ee..10f33b89e0 100644 --- a/src/main/java/org/testng/TestNG.java +++ b/src/main/java/org/testng/TestNG.java @@ -137,6 +137,7 @@ public class TestNG { private final Map, ITestListener> m_testListeners = Maps.newHashMap(); private final Map, ISuiteListener> m_suiteListeners = Maps.newHashMap(); private final Map, IReporter> m_reporters = Maps.newHashMap(); + private final Map, IReporter2> m_reporters2 = Maps.newHashMap(); private final Map, IDataProviderListener> m_dataProviderListeners = Maps.newHashMap(); @@ -670,6 +671,10 @@ public void addListener(ITestNGListener listener) { IReporter reporter = (IReporter) listener; maybeAddListener(m_reporters, reporter); } + if (listener instanceof IReporter2) { + IReporter2 reporter = (IReporter2) listener; + maybeAddListener(m_reporters2, reporter); + } if (listener instanceof IAnnotationTransformer) { setAnnotationTransformer((IAnnotationTransformer) listener); } @@ -870,12 +875,12 @@ private static void initializeCommandLineSuitesGroups(XmlSuite s, initializeCommandLineSuitesGroups(child, hasIncludedGroups, m_includedGroups, hasExcludedGroups, m_excludedGroups); } } - private void addReporter(Class r) { - if (!m_reporters.containsKey(r)) { - m_reporters.put(r, ClassHelper.newInstance(r)); + + private void addReporter(Class r) { + if (!m_reporters2.containsKey(r)) { + m_reporters2.put(r, ClassHelper.newInstance(r)); } } - private void initializeDefaultListeners() { this.exitCodeListener = new org.testng.internal.ExitCodeListener(); addListener((ITestNGListener) this.exitCodeListener); @@ -1089,7 +1094,21 @@ private static void usage() { } private void generateReports(List suiteRunners) { + for (IReporter reporter : m_reporters.values()) { + try { + long start = System.currentTimeMillis(); + reporter.generateReport(m_suites, suiteRunners, m_outputDir); + Utils.log("TestNG", 2, "Time taken by " + reporter + ": " + + (System.currentTimeMillis() - start) + " ms"); + } + catch(Exception ex) { + System.err.println("[TestNG] Reporter " + reporter + " failed"); + ex.printStackTrace(System.err); + } + } + + for (IReporter2 reporter : m_reporters2.values()) { try { long start = System.currentTimeMillis(); IAttributes attributes = new Attributes(); @@ -1098,7 +1117,7 @@ private void generateReports(List suiteRunners) { attributes.setAttribute("generateTestResultAttributes", m_generateTestResultAttributes); reporter.generateReport(m_suites, suiteRunners, attributes); Utils.log("TestNG", 2, "Time taken by " + reporter + ": " - + (System.currentTimeMillis() - start) + " ms"); + + (System.currentTimeMillis() - start) + " ms"); } catch(Exception ex) { System.err.println("[TestNG] Reporter " + reporter + " failed"); diff --git a/src/main/java/org/testng/internal/ExitCodeListener.java b/src/main/java/org/testng/internal/ExitCodeListener.java index 8b1944f9b5..052540b99f 100644 --- a/src/main/java/org/testng/internal/ExitCodeListener.java +++ b/src/main/java/org/testng/internal/ExitCodeListener.java @@ -1,6 +1,7 @@ package org.testng.internal; -import org.testng.IReporter; +import org.testng.IAttributes; +import org.testng.IReporter2; import org.testng.ISuite; import org.testng.ISuiteResult; import org.testng.ITestContext; @@ -10,7 +11,7 @@ import java.util.List; -public class ExitCodeListener implements ITestListener, IReporter { +public class ExitCodeListener implements ITestListener, IReporter2 { private boolean hasTests = false; private final ExitCode status = new ExitCode(); @@ -23,7 +24,7 @@ public boolean hasTests() { } @Override - public void generateReport(List xmlSuites, List suites, String outputDirectory) { + public void generateReport(List xmlSuites, List suites, IAttributes attributes) { for (ISuite suite : suites) { for (ISuiteResult suiteResult : suite.getResults().values()) { ITestContext context = suiteResult.getTestContext(); diff --git a/src/main/java/org/testng/reporters/EmailableReporter.java b/src/main/java/org/testng/reporters/EmailableReporter.java index 90bd250d3f..bfce359daa 100644 --- a/src/main/java/org/testng/reporters/EmailableReporter.java +++ b/src/main/java/org/testng/reporters/EmailableReporter.java @@ -2,7 +2,7 @@ import org.testng.IAttributes; import org.testng.IInvokedMethod; -import org.testng.IReporter; +import org.testng.IReporter2; import org.testng.IResultMap; import org.testng.ISuite; import org.testng.ISuiteResult; @@ -37,7 +37,7 @@ * * @since 5.2 */ -public class EmailableReporter implements IReporter { +public class EmailableReporter implements IReporter2 { private static final Logger L = Logger.getLogger(EmailableReporter.class); // ~ Instance fields ------------------------------------------------------ diff --git a/src/main/java/org/testng/reporters/EmailableReporter2.java b/src/main/java/org/testng/reporters/EmailableReporter2.java index 5f180cf885..c9049edef6 100644 --- a/src/main/java/org/testng/reporters/EmailableReporter2.java +++ b/src/main/java/org/testng/reporters/EmailableReporter2.java @@ -1,8 +1,6 @@ package org.testng.reporters; -import java.io.BufferedWriter; import java.io.File; -import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.text.NumberFormat; @@ -13,7 +11,7 @@ import java.util.Set; import org.testng.IAttributes; -import org.testng.IReporter; +import org.testng.IReporter2; import org.testng.ISuite; import org.testng.ISuiteResult; import org.testng.ITestContext; @@ -30,7 +28,7 @@ /** * Reporter that generates a single-page HTML report of the test results. */ -public class EmailableReporter2 implements IReporter { +public class EmailableReporter2 implements IReporter2 { private static final Logger LOG = Logger.getLogger(EmailableReporter2.class); protected PrintWriter writer; diff --git a/src/main/java/org/testng/reporters/FailedReporter.java b/src/main/java/org/testng/reporters/FailedReporter.java index f61849093d..e08778785d 100644 --- a/src/main/java/org/testng/reporters/FailedReporter.java +++ b/src/main/java/org/testng/reporters/FailedReporter.java @@ -1,6 +1,7 @@ package org.testng.reporters; -import org.testng.IReporter; +import org.testng.IAttributes; +import org.testng.IReporter2; import org.testng.ISuite; import org.testng.ISuiteResult; import org.testng.ITestClass; @@ -32,7 +33,7 @@ * @author Cedric Beust * @author Alexandru Popescu */ -public class FailedReporter extends TestListenerAdapter implements IReporter { +public class FailedReporter extends TestListenerAdapter implements IReporter2 { public static final String TESTNG_FAILED_XML = "testng-failed.xml"; private XmlSuite m_xmlSuite; @@ -45,9 +46,9 @@ public FailedReporter(XmlSuite xmlSuite) { } @Override - public void generateReport(List xmlSuites, List suites, String outputDirectory) { + public void generateReport(List xmlSuites, List suites, IAttributes attributes) { for (ISuite suite : suites) { - generateFailureSuite(suite.getXmlSuite(), suite, outputDirectory); + generateFailureSuite(suite.getXmlSuite(), suite, (String)attributes.getAttribute("defaultOutputDirectory")); } } @@ -224,5 +225,4 @@ private static Map findMethodLocalParameters(XmlTest srcXmlTest, return Collections.emptyMap(); } - } diff --git a/src/main/java/org/testng/reporters/JUnitReportReporter.java b/src/main/java/org/testng/reporters/JUnitReportReporter.java index 79dd22b5f5..c85ca7b97d 100644 --- a/src/main/java/org/testng/reporters/JUnitReportReporter.java +++ b/src/main/java/org/testng/reporters/JUnitReportReporter.java @@ -1,6 +1,6 @@ package org.testng.reporters; -import org.testng.IReporter; +import org.testng.IReporter2; import org.testng.ISuite; import org.testng.ISuiteResult; import org.testng.ITestContext; @@ -32,7 +32,7 @@ import java.util.Set; -public class JUnitReportReporter implements IReporter { +public class JUnitReportReporter implements IReporter2 { @Override public void generateReport(List xmlSuites, List suites, diff --git a/src/main/java/org/testng/reporters/JqReporter.java b/src/main/java/org/testng/reporters/JqReporter.java index dc9f500b07..9374af9f56 100644 --- a/src/main/java/org/testng/reporters/JqReporter.java +++ b/src/main/java/org/testng/reporters/JqReporter.java @@ -1,6 +1,7 @@ package org.testng.reporters; -import org.testng.IReporter; +import org.testng.IAttributes; +import org.testng.IReporter2; import org.testng.IResultMap; import org.testng.ISuite; import org.testng.ISuiteResult; @@ -20,7 +21,7 @@ * @deprecated Use {@link org.testng.reporters.jq.Main} instead */ @Deprecated -public class JqReporter implements IReporter { +public class JqReporter implements IReporter2 { private static final String C = "class"; private static final String D = "div"; private static final String S = "span"; @@ -35,8 +36,8 @@ public JqReporter() { @Override public void generateReport(List xmlSuites, List suites, - String outputDirectory) { - m_outputDirectory = outputDirectory; + IAttributes attributes) { + m_outputDirectory = (String)attributes.getAttribute("defaultOutputDirectory"); XMLStringBuffer xsb = new XMLStringBuffer(" "); xsb.push(D, "id", "suites"); diff --git a/src/main/java/org/testng/reporters/SuiteHTMLReporter.java b/src/main/java/org/testng/reporters/SuiteHTMLReporter.java index 26e815e74e..93a7f24cf9 100644 --- a/src/main/java/org/testng/reporters/SuiteHTMLReporter.java +++ b/src/main/java/org/testng/reporters/SuiteHTMLReporter.java @@ -2,8 +2,9 @@ import static org.testng.internal.Utils.isStringNotEmpty; +import org.testng.IAttributes; import org.testng.IInvokedMethod; -import org.testng.IReporter; +import org.testng.IReporter2; import org.testng.ISuite; import org.testng.ISuiteResult; import org.testng.ITestClass; @@ -32,7 +33,7 @@ * @author cbeust * @author Alexandru Popescu */ -public class SuiteHTMLReporter implements IReporter { +public class SuiteHTMLReporter implements IReporter2 { public static final String METHODS_CHRONOLOGICAL = "methods.html"; public static final String METHODS_ALPHABETICAL = "methods-alphabetical.html"; public static final String GROUPS = "groups.html"; @@ -47,11 +48,11 @@ public class SuiteHTMLReporter implements IReporter { private String m_outputDirectory; @Override - public void generateReport(List xmlSuites, List suites, String outputDirectory) { - m_outputDirectory = generateOutputDirectoryName(outputDirectory + File.separator + "old"); + public void generateReport(List xmlSuites, List suites, IAttributes attributes) { + m_outputDirectory = generateOutputDirectoryName((String)attributes.getAttribute("defaultOutputDirectory") + File.separator + "old"); try { - HtmlHelper.generateStylesheet(outputDirectory); + HtmlHelper.generateStylesheet((String)attributes.getAttribute("defaultOutputDirectory")); } catch (IOException e) { // TODO Propagate the exception properly. e.printStackTrace(); diff --git a/src/main/java/org/testng/reporters/XMLReporter.java b/src/main/java/org/testng/reporters/XMLReporter.java index 0d4e799d18..f51d26d29b 100644 --- a/src/main/java/org/testng/reporters/XMLReporter.java +++ b/src/main/java/org/testng/reporters/XMLReporter.java @@ -1,6 +1,6 @@ package org.testng.reporters; -import org.testng.IReporter; +import org.testng.IReporter2; import org.testng.Reporter; import org.testng.ISuite; import org.testng.ISuiteResult; @@ -24,7 +24,7 @@ /** * The main entry for the XML generation operation */ -public class XMLReporter implements IReporter { +public class XMLReporter implements IReporter2 { public static final String FILE_NAME = "testng-results.xml"; private static final String JVM_ARG = "testng.report.xml.name"; diff --git a/src/main/java/org/testng/reporters/jq/Main.java b/src/main/java/org/testng/reporters/jq/Main.java index cb83ff9dab..6d659e9e32 100644 --- a/src/main/java/org/testng/reporters/jq/Main.java +++ b/src/main/java/org/testng/reporters/jq/Main.java @@ -3,7 +3,8 @@ import static org.testng.reporters.jq.BasePanel.C; import static org.testng.reporters.jq.BasePanel.D; -import org.testng.IReporter; +import org.testng.IAttributes; +import org.testng.IReporter2; import org.testng.ISuite; import org.testng.internal.Utils; import org.testng.reporters.Files; @@ -16,7 +17,7 @@ import java.util.Arrays; import java.util.List; -public class Main implements IReporter { +public class Main implements IReporter2 { private static final String TESTNG_RESOURCE_PREFIX = "/org/testng/"; private static final String[] RESOURCES = new String[] { "jquery-1.7.1.min.js", "testng-reports.css", "testng-reports.js", @@ -30,9 +31,9 @@ public class Main implements IReporter { @Override public void generateReport(List xmlSuites, List suites, - String outputDirectory) { + IAttributes attributes) { m_model = new Model(suites); - m_outputDirectory = outputDirectory; + m_outputDirectory = (String)attributes.getAttribute("defaultOutputDirectory"); XMLStringBuffer xsb = new XMLStringBuffer(" "); diff --git a/src/test/java/org/testng/internal/ConsoleReporter.java b/src/test/java/org/testng/internal/ConsoleReporter.java index 61d02ec31c..9090ca3ca9 100644 --- a/src/test/java/org/testng/internal/ConsoleReporter.java +++ b/src/test/java/org/testng/internal/ConsoleReporter.java @@ -9,10 +9,10 @@ import java.util.Map; import java.util.Set; -public class ConsoleReporter implements IReporter { +public class ConsoleReporter implements IReporter2 { @Override - public void generateReport(List xmlSuites, List suites, String outputDirectory) { + public void generateReport(List xmlSuites, List suites, IAttributes attributes) { for (ISuite suite : suites) { for (Map.Entry testResult : suite.getResults().entrySet()) { Set results = diff --git a/src/test/java/test/CountTest2.java b/src/test/java/test/CountTest2.java new file mode 100644 index 0000000000..02aefe6e08 --- /dev/null +++ b/src/test/java/test/CountTest2.java @@ -0,0 +1,31 @@ +package test; + +import org.testng.*; +import org.testng.annotations.Test; +import org.testng.xml.XmlSuite; + +import java.util.List; + +public class CountTest2 extends SimpleBaseTest { + + @Test(description = "Make sure that skipped methods are accurately counted") + public void skippedMethodsShouldBeCounted() { + TestNG tng = create(CountSampleTest.class); + + IReporter2 r = new IReporter2() { + @Override + public void generateReport(List xmlSuites, List suites, + IAttributes attributes) { + for (ISuite s : suites) { + for (ISuiteResult sr : s.getResults().values()) { + ITestContext ctx = sr.getTestContext(); + Assert.assertEquals(2, ctx.getSkippedTests().size()); + } + } + } + }; + + tng.addListener(r); + tng.run(); + } +} diff --git a/src/test/java/test/multiplelisteners/SimpleReporter.java b/src/test/java/test/multiplelisteners/SimpleReporter.java index b4f140e46e..e63b30f385 100644 --- a/src/test/java/test/multiplelisteners/SimpleReporter.java +++ b/src/test/java/test/multiplelisteners/SimpleReporter.java @@ -1,6 +1,7 @@ package test.multiplelisteners; -import org.testng.IReporter; +import org.testng.IAttributes; +import org.testng.IReporter2; import org.testng.ISuite; import org.testng.SuiteRunner; import org.testng.TestListenerAdapter; @@ -11,11 +12,11 @@ import java.lang.reflect.Field; import java.util.List; -public class SimpleReporter implements IReporter +public class SimpleReporter implements IReporter2 { @Override public void generateReport(final List xmlSuites, final List suites, - final String outputDirectory) + final IAttributes attributes) { for (final ISuite iSuite : suites) { diff --git a/src/test/java/test/name/TestOnClassListener.java b/src/test/java/test/name/TestOnClassListener.java index 64b7419b5e..ae9030ccdd 100644 --- a/src/test/java/test/name/TestOnClassListener.java +++ b/src/test/java/test/name/TestOnClassListener.java @@ -1,20 +1,21 @@ package test.name; +import org.testng.IAttributes; import org.testng.IInvokedMethod; -import org.testng.IReporter; +import org.testng.IReporter2; import org.testng.ISuite; import org.testng.xml.XmlSuite; import java.util.ArrayList; import java.util.List; -public class TestOnClassListener implements IReporter { +public class TestOnClassListener implements IReporter2 { private final List names = new ArrayList<>(); private final List testNames = new ArrayList<>(); @Override - public void generateReport(List xmlSuites, List suites, String outputDirectory) { + public void generateReport(List xmlSuites, List suites, IAttributes attributes) { for (ISuite suite : suites) { for (IInvokedMethod method : suite.getAllInvokedMethods()) { names.add(method.getTestResult().getName()); diff --git a/src/test/java/test/name/github1046/LocalTestNameGatherer.java b/src/test/java/test/name/github1046/LocalTestNameGatherer.java index 53615fb004..ae8d4a2dc2 100644 --- a/src/test/java/test/name/github1046/LocalTestNameGatherer.java +++ b/src/test/java/test/name/github1046/LocalTestNameGatherer.java @@ -1,6 +1,7 @@ package test.name.github1046; -import org.testng.IReporter; +import org.testng.IAttributes; +import org.testng.IReporter2; import org.testng.ISuite; import org.testng.ISuiteResult; import org.testng.ITestResult; @@ -11,10 +12,10 @@ import java.util.List; import java.util.Set; -public class LocalTestNameGatherer implements IReporter { +public class LocalTestNameGatherer implements IReporter2 { private Set testnames = Sets.newHashSet(); @Override - public void generateReport(List xmlSuites, List suites, String outputDirectory) { + public void generateReport(List xmlSuites, List suites, IAttributes attributes) { for (ISuite suite: suites) { for(ISuiteResult suiteResult : suite.getResults().values()) { List testResults = Lists.newArrayList(); diff --git a/src/test/java/test/simple/IncludedExcludedTest.java b/src/test/java/test/simple/IncludedExcludedTest.java index 6d2b70de09..eed267f172 100644 --- a/src/test/java/test/simple/IncludedExcludedTest.java +++ b/src/test/java/test/simple/IncludedExcludedTest.java @@ -1,7 +1,8 @@ package test.simple; import org.testng.Assert; -import org.testng.IReporter; +import org.testng.IAttributes; +import org.testng.IReporter2; import org.testng.ISuite; import org.testng.ITestNGMethod; import org.testng.TestNG; @@ -50,7 +51,7 @@ public void verifyIncludedExcludedCount2() { } -class MyReporter implements IReporter { +class MyReporter implements IReporter2 { private String[] m_included; private String[] m_excluded; @@ -61,7 +62,7 @@ public MyReporter(String[] included, String[] excluded) { } @Override - public void generateReport(List xmlSuites, List suites, String outputDirectory) { + public void generateReport(List xmlSuites, List suites, IAttributes attributes) { Assert.assertEquals(suites.size(), 1); ISuite suite = suites.get(0); diff --git a/src/test/java/test/testng1231/TestExecutionListenerInvocationOrder.java b/src/test/java/test/testng1231/TestExecutionListenerInvocationOrder.java index 93ef715fa5..745912d64b 100644 --- a/src/test/java/test/testng1231/TestExecutionListenerInvocationOrder.java +++ b/src/test/java/test/testng1231/TestExecutionListenerInvocationOrder.java @@ -25,7 +25,7 @@ public void testListenerOrder() { Assert.assertEquals(TestListenerFor1231.order, expected); } - public static class TestListenerFor1231 implements IExecutionListener, IAlterSuiteListener, IReporter, ISuiteListener { + public static class TestListenerFor1231 implements IExecutionListener, IAlterSuiteListener, IReporter2, ISuiteListener { public static LinkedList order = Lists.newLinkedList(); @Override @@ -40,7 +40,7 @@ public void onExecutionFinish() { } @Override - public void generateReport(List xmlSuites, List suites, String outputDirectory) { + public void generateReport(List xmlSuites, List suites, IAttributes attributes) { order.add(new Integer(5)); } diff --git a/src/test/java/test/testng1232/ListenerTemplate.java b/src/test/java/test/testng1232/ListenerTemplate.java index 4e9e02dfc3..a88ff4f274 100644 --- a/src/test/java/test/testng1232/ListenerTemplate.java +++ b/src/test/java/test/testng1232/ListenerTemplate.java @@ -17,7 +17,7 @@ public class ListenerTemplate implements ISuiteListener, IAlterSuiteListener, IExecutionListener, - IReporter { + IReporter2 { @Override public void onBeforeClass(ITestClass testClass) { @@ -100,7 +100,7 @@ public void alter(List suites) { } @Override - public void generateReport(List xmlSuites, List suites, String outputDirectory) { + public void generateReport(List xmlSuites, List suites, IAttributes attributes) { } } diff --git a/src/test/java/test/testng1232/TestListenerFor1232.java b/src/test/java/test/testng1232/TestListenerFor1232.java index 6b0121271a..67ca8babe1 100644 --- a/src/test/java/test/testng1232/TestListenerFor1232.java +++ b/src/test/java/test/testng1232/TestListenerFor1232.java @@ -46,7 +46,7 @@ public void onExecutionStart() { } @Override - public void generateReport(List xmlSuites, List suites, String outputDirectory) { + public void generateReport(List xmlSuites, List suites, IAttributes attributes) { incrementCounter(CounterTypes.REPORTER); }