package test.reports; import org.testng.*; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import org.testng.reporters.FailedReporter; import org.testng.reporters.TestHTMLReporter; import org.testng.xml.Parser; import org.testng.xml.XmlSuite; import org.xml.sax.SAXException; import test.InvokedMethodNameListener; import test.SimpleBaseTest; import test.TestHelper; import test.simple.SimpleSample; import javax.xml.parsers.ParserConfigurationException; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; public class ReportTest extends SimpleBaseTest { @Test public void verifyIndex() throws IOException { Path outputDir = TestHelper.createRandomDirectory(); String suiteName = "VerifyIndexSuite"; String testName = "TmpTest"; XmlSuite suite = createXmlSuite(suiteName, testName, SimpleSample.class); TestNG tng = create(outputDir, suite); tng.addListener((ITestNGListener) new TestHTMLReporter()); Path f = getHtmlReportFile(outputDir, suiteName, testName); tng.run(); Assert.assertTrue(Files.exists(f), f.toString()); } @Test public void directoryShouldBeSuiteName() throws IOException { Path outputDirectory = TestHelper.createRandomDirectory(); String suiteName = "ReportTestSuite1"; String testName = "Test1"; String testName2 = "Test2"; XmlSuite xmlSuite = createXmlSuite(suiteName); createXmlTest(xmlSuite, testName); createXmlTest(xmlSuite, testName2); TestNG tng = create(outputDirectory, xmlSuite); tng.addListener((ITestNGListener) new TestHTMLReporter()); Path f = getHtmlReportFile(outputDirectory, suiteName, testName); Path f2 = getHtmlReportFile(outputDirectory, suiteName, testName2); tng.run(); Assert.assertTrue(Files.exists(f)); Assert.assertTrue(Files.exists(f2)); } @Test public void oneDirectoryPerSuite() throws IOException { Path outputDirectory = TestHelper.createRandomDirectory(); String suiteNameA = "ReportSuiteA"; String suiteNameB = "ReportSuiteB"; String testName = "TmpTest"; XmlSuite xmlSuiteA = createXmlSuite(suiteNameA, testName, SampleA.class); XmlSuite xmlSuiteB = createXmlSuite(suiteNameB, testName, SampleB.class); TestNG tng = create(outputDirectory, xmlSuiteA, xmlSuiteB); tng.addListener((ITestNGListener) new TestHTMLReporter()); Path f1 = getHtmlReportFile(outputDirectory, suiteNameA, testName); Path f2 = getHtmlReportFile(outputDirectory, suiteNameB, testName); tng.run(); Assert.assertTrue(Files.exists(f1)); Assert.assertTrue(Files.exists(f2)); } private static Path getHtmlReportFile(Path outputDir, String suiteName, String testName) throws IOException { Path f = outputDir.resolve(Paths.get(suiteName, testName + ".html")); Files.deleteIfExists(f); return f; } @Test public void shouldHonorSuiteName() throws IOException { Path outputDirectory = TestHelper.createRandomDirectory(); TestNG tng = create(outputDirectory, SampleA.class, SampleB.class); tng.addListener((ITestNGListener) new TestHTMLReporter()); Path fileA = outputDirectory.resolve("SuiteA-JDK5"); Path fileB = outputDirectory.resolve("SuiteB-JDK5"); Assert.assertTrue(Files.notExists(fileA)); Assert.assertTrue(Files.notExists(fileB)); tng.run(); Assert.assertTrue(Files.exists(fileA)); Assert.assertTrue(Files.exists(fileB)); } private static boolean m_success; @Test public void reportLogShouldBeAvailableEvenWithTimeOut() { m_success = false; TestNG tng = create(ReporterSample.class); ITestListener listener = new TestListenerAdapter() { @Override public void onTestSuccess(ITestResult tr) { super.onTestSuccess(tr); List<String> output = Reporter.getOutput(tr); ReportTest.m_success = (output != null && output.size() > 0); } }; tng.addListener((ITestNGListener) listener); tng.run(); Assert.assertTrue(m_success); } @Test public void reportLogShouldBeAvailableWithListener() { TestNG tng = create(ListenerReporterSample.class); InvokedMethodNameListener listener = new InvokedMethodNameListener(); tng.addListener((ITestNGListener) listener); Reporter.clear(); tng.run(); assertThat(listener.getFailedMethodNames()).isEmpty(); assertThat(listener.getSkippedMethodNames()).isEmpty(); assertThat(listener.getSucceedMethodNames()).containsExactly("testMethod"); assertThat(Reporter.getOutput()).hasSize(2); } @Test(description = "GITHUB-1090") public void github1090() { TestNG tng = create(GitHub447Sample.class); GitHub447Listener reporter = new GitHub447Listener(); tng.addListener((ITestNGListener) reporter); tng.run(); List<Object[]> parameters = reporter.getParameters(); Assert.assertEquals(parameters.size(), 5); Assert.assertEquals(parameters.get(0)[0].toString(), "[]"); Assert.assertEquals(parameters.get(0)[1], null); Assert.assertEquals(parameters.get(0)[2].toString(), "[null]"); Assert.assertEquals(parameters.get(1)[0].toString(), "[null]"); Assert.assertEquals(parameters.get(1)[1], "dup"); Assert.assertEquals(parameters.get(1)[2].toString(), "[null, dup]"); Assert.assertEquals(parameters.get(2)[0].toString(), "[null, dup]"); Assert.assertEquals(parameters.get(2)[1], "dup"); Assert.assertEquals(parameters.get(2)[2].toString(), "[null, dup, dup]"); Assert.assertEquals(parameters.get(3)[0].toString(), "[null, dup, dup]"); Assert.assertEquals(parameters.get(3)[1], "str"); Assert.assertEquals(parameters.get(3)[2].toString(), "[null, dup, dup, str]"); Assert.assertEquals(parameters.get(4)[0].toString(), "[null, dup, dup, str]"); Assert.assertEquals(parameters.get(4)[1], null); Assert.assertEquals(parameters.get(4)[2].toString(), "[null, dup, dup, str, null]"); } @DataProvider public static Object[][] dp() { return new Object[][]{ {GitHub1148Sample.class, new String[]{"verifyData(Cedric)"}, new String[]{"verifyData(Anne)"}}, {GitHub148Sample.class, new String[]{"testMethod(1)", "testMethod(2)"}, new String[]{"testMethod(3)"}} }; } @Test(dataProvider = "dp") public void runFailedTestTwiceShouldBeConsistent(Class<?> testClass, String[] succeedMethods, String[] failedMethods) throws IOException, ParserConfigurationException, SAXException { Path outputDirectory = TestHelper.createRandomDirectory(); TestNG tng = create(outputDirectory, testClass); InvokedMethodNameListener listener = new InvokedMethodNameListener(); tng.addListener((ITestNGListener) listener); tng.addListener((ITestNGListener) new FailedReporter()); tng.run(); assertThat(listener.getFailedMethodNames()).containsExactly(failedMethods); assertThat(listener.getSucceedMethodNames()).containsExactly(succeedMethods); assertThat(listener.getSkippedMethodNames()).isEmpty(); Path testngFailedXml = outputDirectory.resolve(FailedReporter.TESTNG_FAILED_XML); assertThat(testngFailedXml).exists(); for (int i = 0; i < 5; i++) { testngFailedXml = checkFailed(testngFailedXml, failedMethods); } } private static Path checkFailed(Path testngFailedXml, String... failedMethods) throws IOException, ParserConfigurationException, SAXException { Path outputDirectory = TestHelper.createRandomDirectory(); List<XmlSuite> suites = new Parser(Files.newInputStream(testngFailedXml)).parseToList(); TestNG tng = create(outputDirectory, suites); InvokedMethodNameListener listener = new InvokedMethodNameListener(); tng.addListener((ITestNGListener) listener); tng.addListener((ITestNGListener) new FailedReporter()); tng.run(); assertThat(listener.getSucceedMethodNames()).isEmpty(); assertThat(listener.getSkippedMethodNames()).isEmpty(); assertThat(listener.getFailedMethodNames()).containsExactly(failedMethods); Path testngFailedXml2 = outputDirectory.resolve(FailedReporter.TESTNG_FAILED_XML); assertThat(testngFailedXml2).exists(); return testngFailedXml2; } }