我正在尝试使用xml中的testng套件中的parallel="methods"
属性运行以下测试。
public class TestClass {
@Test(groups = { "groupA" })
public void method1() throws InterruptedException {
System.out.println("Starting method1");
Thread.sleep(1000 * 10); // wait 10 seconds
System.out.println("Ending method1");
}
@Test(groups = { "groupB" })
public void method2() throws InterruptedException {
System.out.println("Starting method2");
Thread.sleep(1000 * 2); // wait 2 seconds
System.out.println("Ending method2");
}
@Test(groups = "groupB", dependsOnGroups = { "groupA" })
public void method3() throws InterruptedException {
System.out.println("Starting method3");
Thread.sleep(1000 * 2); // wait 2 seconds
System.out.println("Ending method3");
}
}
testng.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite" parallel="methods" thread-count="5">
<test name="Test">
<classes>
<class name="com.testngGroup.TestClass"></class>
</classes>
</test>
</suite>
我希望得到以下结果:
Starting method1
Starting method2
Ending method2
Ending method1
Starting method3
Ending method3
但我得到了这些结果:
Starting method1
Starting method2
Ending method2
Starting method3
Ending method3
Ending method1
Method3不等待method1完成。它似乎等待方法2完成,但我不知道为什么。
编辑(np) -
查看文档,查找parallel running实际执行的操作。它传达了 -
parallel =“methods”:TestNG将分别运行所有测试方法 线程。依赖方法也将在不同的线程中运行但它们 将尊重您指定的订单。
但是我无法弄清楚这个顺序应该依赖什么。使用相同的testng.xml文件以及示例代码重现可能的错误如果我没有弄错的话可能是 -
@Test(groups = "A")
public void test1() {
System.out.println("In 1 " + Thread.currentThread().getName());
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Assert 1 " + Thread.currentThread().getName());
Assert.assertTrue(false); // making sure this fails
System.out.println("Out 1 " + Thread.currentThread().getName());
}
@Test(groups = "B")
public void test2() {
System.out.println("In 2 " + Thread.currentThread().getName());
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Out 2 " + Thread.currentThread().getName());
}
@Test(groups = "B", dependsOnMethods = "test1") //notice the dependsOnMethods(hard dependency)
public void test3() {
System.out.println("In 3 " + Thread.currentThread().getName());
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Out 3 " + Thread.currentThread().getName());
}
制作 OUTPUT -
Assert 1 pool-1-thread-1 java.lang.AssertionError: expected [true] but found [false] Expected :true Actual :false at org.testng.Assert.fail(Assert.java:94) at org.testng.Assert.failNotEquals(Assert.java:513) at org.testng.Assert.assertTrue(Assert.java:42) at org.testng.Assert.assertTrue(Assert.java:52) at TestOrder.test1(TestOrder.java:18) In 2 pool-1-thread-2 In 1 pool-1-thread-1 Out 2 pool-1-thread-2 In 3 pool-1-thread-3 Out 3 pool-1-thread-3
答案 0 :(得分:0)
欣赏这里注意到的一点。通过文档查找parallel running实际传达的内容 -
parallel =&#34;方法&#34; :TestNG将分别运行您的所有测试方法 线程。依赖方法也将在不同的线程中运行但它们 将尊重您指定的订单。
但是我无法弄清楚这个顺序应该依赖什么。
所以试着进一步寻找并发现这篇dependencies with annotations文章 -
- 硬依赖。您依赖的所有方法都必须运行和 你成功了。如果您的帐号中至少发生一次故障 依赖关系,你不会被调用并标记为跳过 报告。
- 软依赖。您将始终在方法之后运行 你依赖,即使其中一些失败了。这很有用 你只是想确保你的测试方法在某个特定的情况下运行 但是他们的成功并不取决于成功与否 其他。通过添加&#34; alwaysRun = true&#34;来获得软依赖性。在 你的@Test注释。
对于dependsOnGroup
示例,它读取
在此示例中,method1()声明为依赖于任何组 匹配正则表达式
"init.*"
,这保证了 方法serverStartedOk()和initEnvironment()将始终被调用 之前 method1()。
因此调用顺序由您在问题中定义,但执行不依赖于其他组的成功或失败。
但我想在所有这些研究和试验期间,我可以找到另一个点,我可以看到"parallel=methods"
执行测试而不管硬依赖性。用可重现的代码更新了问题。补充要点 -
即使我将并行度更改为test
级别,它也无法正常工作。
<test name="Test" parallel="methods" thread-count="5">
将priority
添加到定义顺序的方法中明确有帮助,但这与我想的并行性事实无关。
当然,最值得注意的一点是,将method1
中的睡眠时间减少到Thread.sleep(2000)
可确保执行顺序符合预期。
免责声明 - 虽然这不是当前问题的答案,但只要发布一个解决方案,就会将其删除。
编辑 - 日期2017年1月16日 现在这是一个Open issue in testng library here,并在代码中使用this PullRequest修复。