我有一个情况,我有一个方法内部的监听器,其中有一些参数是不同的每个测试用例。我试着使用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)