我正在尝试在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完成。它似乎等待Method2完成,但我不确定为什么。
edit(np) -
浏览了文档,以寻找并行运行实际的操作。它传达 -
parallel ="方法" :testng将在单独的测试方法中运行所有测试方法 线程。依赖方法也将在单独的线程中运行,但它们 Will 尊重您指定的顺序。
,但我无法找出该订单应该依赖的内容。如果我没记错的话,使用相同的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());
}
产生输出 -
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
感谢这里注意到的观点。浏览文档,以查找实际运行的实际运行方式 -
parallel ="方法" :testng将在单独的测试方法中运行所有测试方法 线程。依赖方法也将在单独的线程中运行,但它们 Will 尊重您指定的顺序。
,但我无法找出该订单应该依赖的内容。
因此试图进一步寻找,并通过注释文章找到了这种依赖性 -
- 硬依赖性。您依赖的所有方法都必须运行,并且 成功地跑步。如果您至少发生了一次故障 依赖项,您不会被调用并标记为跳过 报告。
- 软依赖项。您将始终在方法之后运行 您依靠,即使其中一些失败了。这很有用 您只想确保您的测试方法在某个地方运行 秩序,但他们的成功并不取决于 其他的。通过在 您的@Test注释。
对于dependsOnGroup
示例,它读取
在此示例中,Method1()被声明为取决于任何组 匹配正则表达式
"init.*"
,这可以保证 方法serverstartedok()和启动环境()将始终为 method1()。
因此,您在问题中定义了调用顺序,但是执行不取决于另一组的成功或失败。
,但我想在所有研究和试验中,我可以找到另一个点,我可以看到"parallel=methods"
执行测试的情况,而与硬依赖关系无关。还使用可再现的代码更新了问题。其他点 -
-
即使我将并行性更改为
test
级别,也将行不通。<test name="Test" parallel="methods" thread-count="5">
-
将
priority
添加到方法中以明确定义顺序有帮助,但这与我想的并行性事实不应有关。 -
当然,这里最明显的观点是,将
method1
中的睡眠减少到Thread.sleep(2000)
,确保执行订单符合预期的范围。
免责声明 - 尽管这不是作为当前问题的答案,但一旦发布了一个问题,就会将其删除。
编辑 - 日期2017年1月16日现在,这是Testng库中的一个空旷的问题,并在代码中使用此刷子修复了。