如何在并行执行中传递参数给TestNG监听器?



我有一个情况,我有一个方法内部的监听器,其中有一些参数是不同的每个测试用例。我试着使用context.setAttribute("....."),但这不起作用。它只是为变量分配最后一个值,并且它被转移到所有的测试用例。

我给出了下面的代码。有人能告诉我怎么做吗?

public class Myproject implements ITestListener{
    @Test(dataProvider = "getData")
    public static void test1(int i,ITestContext context){
       System.setProperty("webdriver.chrome.driver", ".\drivers\chromedriver.exe");
       WebDriver driver=new ChromeDriver();
       driver.get(url);
       context.setAttribute("driver", driver);
       context.setAttribute("testCaseNo",i+1);
       equalToOne(i);
    }
    
    @DataProvider(parallel = true)
    public Object[][] getData() {
        Object[][] data = new Object[4][1];
        data[0][0] = 0;
        data[1][0] = 1;
        data[2][0] = 2;
        data[3][0] = 3;
        return data;
    }
    public static void equalToOne(int k){
       Assert.assertEquals(1,k);
    }
    
    @Override
    public void onTestStart(ITestResult result) {
        // TODO Auto-generated method stub      
    }
    @Override
    public void onTestSuccess(ITestResult result) {
       int i=(int) result.getTestContext().getAttribute("testcaseNo");      
       System.out.println("Testcase " + i + " Passed");     
    }
    @Override
    public void onTestFailure(ITestResult result) {
        int i=(int) result.getTestContext().getAttribute("testcaseNo");     
        System.out.println("Testcase " + i + " Failed");
    }
    @Override
    public void onTestSkipped(ITestResult result) {
        // TODO Auto-generated method stub      
    }
    @Override
    public void onTestFailedButWithinSuccessPercentage(ITestResult result) {
        // TODO Auto-generated method stub      
    }
    @Override
    public void onStart(ITestContext context) {
        // TODO Auto-generated method stub      
    }
    @Override
    public void onFinish(ITestContext context) {
        WebDriver driver=(WebDriver)context.getAttribute("driver");
        driver.quit();
    }
    
}

和XML文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
<suite name="Suite" parallel="methods" thread-count="5">
<listeners>
       <listener class-name="testNgProjects.Myproject">
    </listener>
</listeners>
<test name="Test">
    <classes>
        <class name="testNgProjects.Myproject" />
    </classes>
</test> <!-- Test -->
</suite> <!-- Suite -->
我应该得到像 这样的输出
Test case 1 Failed
Test case 2 Passed
Test case 3 Failed
Test case 4 Failed

但是输出是

Test case 3 Failed
Test case 3 Passed
Test case 3 Failed
Test case 3 Failed

i的最后一个设定值,而不是在每次测试中取不同的值。

您实际上可以在没有侦听器(甚至上下文)的情况下完成此操作。对于这个特殊情况,只用afterMethod就可以了。(您可以在@BeforeTest@AfterTest方法中启动和关闭WebDriver。)

由于您是并行运行它,您可以使用线程本身识别特定的测试用例。

@Test(dataProvider = "getData")
public void test1(int i) {
    Thread.currentThread().setName(String.valueOf(i));
    equalToOne(i);
}
@AfterMethod
public void afterMethod(ITestResult res) {
    String msg = "Testcase " + Thread.currentThread().getName();
    switch (res.getStatus()) {
        case ITestResult.SUCCESS:
            msg += " Passed";
            break;
        case ITestResult.FAILURE:
            msg += " Failed";
            break;
        case ITestResult.SKIP:
            msg += " Skipped";
            break;
        default:
            break;
    }
    System.out.println(msg);
}

设置上下文不能解决问题,请在测试用例中使用静态方法:

org.testng.Reporter.getCurrentTestResult().setAttribute(a,b)

并在侦听器中使用:

获取相同的值
org.testng.Reporter.getCurrentTestResult().getAttribute(a)

最新更新