![](/img/trans.png)
[英]How should I write TestNG test cases so that they can be run one after another (sequentially)?
[英]How to run TestNG classes one after another
我想运行一个包含 4 个不同类的 testng.xml 文件。 我想在另一个完成后运行每个。 因此,当第 1 类完成时,则第 2 类开始,当第 2 类完成时,则第 3 类开始执行。 到目前为止,我已经编写了这段代码,但它同时触发了所有类。 即使我尝试了 parallel = false 也没有奏效。 任何帮助将不胜感激。谢谢
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Smoke Test" parallel="false" preserve-order="true" verbose="2">
<test name="Test 1">
<classes>
<class name="class1"></class>
</classes>
</test>
<test name="Test 2">
<classes>
<class name="class2"></class>
</classes>
</test>
<test name="Test 2">
<classes>
<class name="class3"></class>
</classes>
</test>
</suite>
您需要做的是同时使用 @BeforeClass 和 @AfterClass 注释来启动和退出 webdriver。 您需要定义 webdriver 在 @BeforeClass 中启动,并且 webdriver 在 @AfterClass 方法中退出(如果您选择在此类完成时关闭此 webdriver)。
举个例子...
@BeforeClass
public void initClass()
{
//Set the system property
String driverPath = System.getProperty("user.dir") +"\\chromedriver\\chromedriver.exe";
String driverType = "webdriver.chrome.driver";
System.setProperty(driverType, driverPath);
driver = new ChromeDriver();
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
}
在这门课结束时,如果我想退出这个 webdriver 实例:
@AfterClass
public void finish()
{
driver.manage().deleteAllCookies();
driver.quit();
}
对每个测试类都这样做,然后下一个类将在上一个类完成后才开始。
TestNG xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
<suite name="Suite">
<test thread-count="5" name="Test" preserve-order="true">
<classes>
<class name="Pkg.ClassA" />
<class name="Pkg.ClassB" />
<class name="Pkg.ClassC" />
</classes>
</test> <!-- Test -->
</suite> <!-- Suite -->
这不是完全相同的设置,但我们在一些作业中使用“next”属性来进行顺序处理:
<batch:job id="JOB_NAME" job-repository="jobRepository">
<batch:step id="process1" next="process2">
<batch:tasklet>
<batch:chunk>
processing info
</batch:chunk>
</batch:tasklet>
</batch:step>
<batch:step id="process2" next="process3">
<batch:tasklet>
<batch:chunk>
processing info
</batch:chunk>
</batch:tasklet>
</batch:tasklet>
</batch:step>
像这样的事情可能对你有用。
为什么不将所有测试类添加到同一个<test>
标签中,然后运行它们?
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Smoke Test" parallel="false" preserve-order="true" verbose="2">
<test name="Test 1">
<classes>
<class name="class1"></class>
<class name="class2"></class>
<class name="class3"></class>
</classes>
</test>
</suite>
这基本上会在每个 Test 类中一个接一个地执行测试方法。 您可以通过添加System.out.println(Thread.currentThread().getId());
来确认这一点System.out.println(Thread.currentThread().getId());
到您的每个@Test
方法。 您应该会看到正在打印相同的线程 ID。
也许您在@Test 注释中使用了“priority”和“dependsOnGroups”。 此参数对于订单更重要(请参阅 6.10 更改https://github.com/cbeust/testng/blob/master/CHANGES.txt )。
以“优先级”为例。
这段代码:
public class Class1 {
@Test(priority = 1)
public void test1() {
System.out.println("Class1 test1");
}
@Test(priority = 2)
public void test2() {
System.out.println("Class1 test2");
}
}
public class Class2 {
@Test(priority = 1)
public void test1() {
System.out.println("Class2 test1");
}
@Test(priority = 2)
public void test2() {
System.out.println("Class2 test2");
}
}
有结果:
Class1 test1
Class2 test1
Class1 test2
Class2 test2
以“dependsOnGroups”为例。
这段代码:
public class Class1 {
@Test(groups = {"someGroup"})
public void test1() {
System.out.println("Class1 test1");
}
@Test(dependsOnGroups = {"someGroup"})
public void test2() {
System.out.println("Class1 test2");
}
}
public class Class2 {
@Test(groups = {"someGroup"})
public void test1() {
System.out.println("Class2 test1");
}
@Test(dependsOnGroups = {"someGroup"})
public void test2() {
System.out.println("Class2 test2");
}
}
有相同的结果:
Class1 test1
Class2 test1
Class1 test2
Class2 test2
测试名称标签应该是唯一的,我看到第 2 类和第 3 类的测试名称相同,这就是您看到问题的原因。
如果您仍然看到问题,请添加日志/附加信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.