2017-11-10 4 views
0

Wenn ich versuche, Testklassen parallel auszuführen, erscheinen Protokolle von zwei Testklassen in einem.Extent Reports: Protokolle werden zusammengeführt, wenn Testfälle parallel ausgeführt werden

Das ist mein testng.xml

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> 
<suite name="Suite" parallel="methods"> 
    <test name="Test"> 
    <classes> 
     <class name="com.moodle.automation.tests.Professor"/> 
     <class name="com.moodle.automation.tests.Students"/> 
    </classes> 
    </test> <!-- Test --> 
</suite> <!-- Suite --> 

Es startet zwei Browser, beide laufen separate Tests, nur 1 Berichte erzeugt (wie erwartet), aber Bericht zeigt fusionierten Protokolle also test.log(Status.INFO, browser + " launched ..."); sowohl für die Tests wie folgt aus:

Status Timestamp Details 
info_outline 10:15:54 PM Chrome launched ... 
info_outline 10:15:54 PM Chrome launched ... 
info_outline 10:16:01 PM Navigated to appURL... 
info_outline 10:16:02 PM Navigated to appURL... 
info_outline 10:16:05 PM Professor logged in ... 
info_outline 10:16:08 PM Student logged in ... 

Was könnte ich möglicherweise falsch machen? Ich folgte diesem Tutorial https://www.youtube.com/watch?v=QQAmcnGbVQM

Edit: Test-Klasse 1 ist die gleiche wie Klasse 2 Class1:

@Test() 
    public void test1() { 
     extentTest = extentReports.createTest("Test1"); 
     extentTest.log(Status.INFO, "Test1 started ..."); 
     Assert.assertTrue(1>1); 

    } 
@Test() 
    public void test2() { 
     extentTest = extentReports.createTest("Test2"); 
     extentTest.log(Status.INFO, "Test2 started ..."); 
     Assert.assertTrue(1>1); 

    } 
@Test() 
    public void test3() { 
     extentTest = extentReports.createTest("Test3"); 
     extentTest.log(Status.INFO, "Test3 started ..."); 
     Assert.assertTrue(1<0); 

    } 

Baseclass:

@AfterSuite 
    public void afterSuite() { 
//  extentReports.flush(); 
     String finalReport = System.getProperty("user.dir") + "/Reporting/reports/report_" + timeStamp + ".html"; 
     File htmlFile = new File(finalReport); 
     try { 
      Desktop.getDesktop().browse(htmlFile.toURI()); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    @AfterMethod 
    public void getResult(ITestResult result) { 
     if(result.getStatus() == ITestResult.FAILURE){ 

      extentTest.fail(MarkupHelper.createLabel(result.getName()+" Test case failed", ExtentColor.RED)); 
      extentTest.fail(result.getThrowable()); 
     } 

     else if(result.getStatus() == ITestResult.SUCCESS){ 
      extentTest.pass(MarkupHelper.createLabel(result.getName()+" Test case passed", ExtentColor.GREEN)); 
     } 

     else { 
      extentTest.skip(MarkupHelper.createLabel(result.getName()+" Test case skipped", ExtentColor.YELLOW)); 
      extentTest.skip(result.getThrowable()); 
     } 

    } 

    @AfterTest 
    public void flushTestReports(){ 
     extentReports.flush(); 
    } 

zu reproduzieren es zwei gleiche Browsern parallel zu.

+0

Bitte geben Sie Ihren Code ein. – Anshoo

+0

@Anshoo jedes Update dazu? – paul

+0

Scheint so, als würden Ihre Tests von einander überschrieben, so dass Protokolle geteilt werden. Können Sie so etwas verwenden, um Ihre Tests zu verwalten: https://github.com/anshooarora/extentreports-java/blob/master/src/test/java/com/aventstack/extentreports/common/ExtentTestManager.java – Anshoo

Antwort

0

Versuchen Sie, den Test zu beenden, und leeren Sie den Bericht in @AfterMethod, und schließen Sie den Bericht in der @AfterTest-Methode. Es hat für mich funktioniert. Versuchen Sie es wie below Code:

@AfterMethod(alwaysRun=true) 
    public void TearDown_AM(ITestResult result) throws IOException 
    { 
     System.out.println("@After Method"); 
    try 
    { 
     if(result.getStatus()==ITestResult.FAILURE) 
     { 
      String res = captureScreenshot(Driver, result.getName()); 
      String image= logger.addScreenCapture(res); 
      System.out.println(image); 
      String TestCaseName = this.getClass().getSimpleName() + " Test Case Failure and Title/Boolean Value Failed"; 
      logger.log(LogStatus.FAIL, TestCaseName + logger.addScreenCapture(res)); 
      // logger.log(LogStatus.FAIL, image, this.getClass().getSimpleName() + " Test Case Failure and Title/Boolean Value Failed"); 
     } 
     else if(result.getStatus()==ITestResult.SUCCESS) 
     { 
      logger.log(LogStatus.PASS, this.getClass().getSimpleName() + " Test Case Success and Title Verified"); 
     } 
     else if(result.getStatus()==ITestResult.SKIP) 
     { 
      logger.log(LogStatus.SKIP, this.getClass().getSimpleName() + " Test Case Skipped"); 
     } 
     report.endTest(logger); 
     report.flush(); 

    } 
    catch(Throwable t) 
    { 
     logger.log(LogStatus.ERROR,t.fillInStackTrace()); 
    } 

    } 

@AfterTest(alwaysRun=true) 
public void AfterTest() 
{ 
    System.out.println("@After Test"); 
    Driver.close(); 
    report.close(); 
} 
0

Zunächst erstellen Sie eine Klasse mit einer synchronisierten Methode, die eine Instanz von ExtentReports zurück:

public class ExtentManager { 
    private static ExtentReports report; 

    public static synchronized ExtentReports getInstance() { 
     if (report == null) { 
      report = new ExtentReports("MyReport.html"); 
     } 

     return report; 
    } 
} 

Zweitens schaffen eine andere Klasse, die nur Test erklärt verwandten Synchronisierte Methoden (& natürlich müssen diese Methode behandelt werden Thread weise). Code-Schnipsel:

public class ExtentTestManager { 
    static Map<Integer, ExtentTest> extentTestMap = new HashMap<Integer, ExtentTest>(); 

    private static ExtentReports extent = ExtentManager.getInstance(); 

    public static synchronized ExtentTest getTest() { 
     return extentTestMap.get((int) (long) (Thread.currentThread().getId())); 
    } 

    public static synchronized void endTest() { 
     extent.endTest(extentTestMap.get((int) (long) (Thread.currentThread().getId()))); 
    } 

    public static synchronized ExtentTest startTest(String testName) { 
     return startTest(testName, ""); 
    } 

    public static synchronized ExtentTest startTest(String testName, String desc) { 
     ExtentTest test = extent.startTest(testName, desc); 
     extentTestMap.put((int) (long) (Thread.currentThread().getId()), test); 

     return test; 
    } 
} 

Schließlich ändern Sie Ihre Baseclass entsprechend:

public class BaseClass extends TestListenerAdapter { 
    public ExtentTest testReporter; 

    @BeforeMethod 
    public void beforeMethod(Method m) { 
     ExtentTestManager.startTest(m.getName(), "This is a simple test."); 
    } 

    @AfterMethod 
    public void afterMethod(ITestResult result) { 
     if (result.isSuccess()) { 
      ExtentTestManager.getTest().log(LogStatus.PASS, "Test passed"); 
      ExtentTestManager.getTest().log(LogStatus.PASS, "Run from thread " + Thread.currentThread().getId()); 
     } 
     else if (result.getStatus() == ITestResult.FAILURE) { 
      ExtentTestManager.getTest().log(LogStatus.FAIL, "Test failed"); 
      ExtentTestManager.getTest().log(LogStatus.PASS, "Run from thread " + Thread.currentThread().getId()); 
     } 
     else if (result.getStatus() == ITestResult.SKIP) { 
      ExtentTestManager.getTest().log(LogStatus.SKIP, "Test skipped"); 
      ExtentTestManager.getTest().log(LogStatus.PASS, "Run from thread " + Thread.currentThread().getId()); 
     } 
     ExtentTestManager.endTest(); 
     ExtentManager.getInstance().flush(); 
    } 

    @AfterSuite 
    public void afterSuite() { 
     ExtentManager.getInstance().flush(); 
    } 
} 

EDIT:

eine Testklasse erstellen (ExampleTest.java) mit dem Test:

public class ExampleTest extends BaseClass{ 
    @Test 
     public void test_01(){ 
      Assert.assertTrue(false); 
     } 
     @Test 
     public void test_02(){ 
      Assert.assertTrue(false); 
     } 
     @Test 
     public void test_03(){ 
      Assert.assertTrue(true); 
     } 
     @Test 
     public void test_04(){ 
      Assert.assertTrue(false); 
     } 
} 

Erforderlich testng.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<suite name="DemoSuite1" parallel="methods" thread-count="2"> 
    <test name = "Test"> 
     <classes> 
      <class name = "com.extent.demo.ExampleTest" /> 
     </classes> 
    </test> 
</suite> 
+0

OK und wie ein Testfall starten würde. Eigentlich gibt es mir Null Fehler. – paul

+0

Bitte, sehen Sie die bearbeitete Antwort. Hoffe, es kann dir helfen. –

+0

Um dieses Problem zu reproduzieren, sollte es zwei verschiedene '' Tags unter' 'Tag in Ihrer' testng.xml' geben und die Anzahl der Threads sollte keine sein. Du hast auch keinen Reporter eingestellt, dein Code hat mich gebeten, mindestens einen Reporter zu gründen. – paul

Verwandte Themen