【问题标题】:Create extent reports with custom logs使用自定义日志创建范围报告
【发布时间】:2017-11-10 17:01:22
【问题描述】:

需要在范围报告中打印 log4j 日志。我该怎么做?

【问题讨论】:

  • 请发布您的代码。
  • @Anshoo 对此有何更新?
  • 似乎您的测试被彼此覆盖,因此日志被共享。你能用这样的东西来管理你的测试吗:github.com/anshooarora/extentreports-java/blob/master/src/test/…
  • 我们想要实现什么?它将如何提供帮助?你能提供一些背景吗?它如何使日志只坚持相应的测试?
  • 我们希望确保在任何给定线程中,仅使用正确的测试来记录信息。由于您没有共享整个代码,我假设 extentTest 被多个线程和/或访问 BaseClass 的类覆盖。我们希望避免这种情况,并以线程安全的方式仅向属于该线程的测试发送信息。

标签: selenium extentreports


【解决方案1】:

尝试结束测试并在@AfterMethod 中刷新报告并在@AfterTest 方法中关闭报告。它对我有用。试试下面的代码:

@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();
}

【讨论】:

    【解决方案2】:

    首先,创建一个具有同步方法的类,该方法返回 ExtentReports 的实例:

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

    其次,创建另一个只声明与 test 相关的同步方法的类(当然,这些方法必须以 Thread 方式处理)。代码sn-p:

    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;
        }
    }
    

    最后,相应地修改您的 BaseClass

    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();
        }
    }
    

    编辑:

    使用您的测试创建一个测试类 (ExampleTest.java):

    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);
            }
    }
    

    必填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>
    

    【讨论】:

    • 好的,测试用例如何开始。实际上它给了我空错误。
    • 请参阅编辑后的答案。希望对你有帮助。
    • 要重现此问题,您的&lt;classes&gt; 标记下应该有两个不同的&lt;class&gt; 标记testng.xml 并且线程数应该为无。另外你没有设置记者,你的代码要求我至少启动一个记者。
    • 如果您使用的是eclipse IDE并安装了TestNG插件,您无需任何修改即可轻松运行该套件。
    • 运行没有问题,只是每当我在类标签和并行参数下有两个类作为方法时,它就会将报告附加到最后一次测试。因此,它对我来说总是很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-07
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多