并行(方法)执行,依赖子以意外顺序运行



我正在尝试在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"执行测试的情况,而与硬依赖关系无关。还使用可再现的代码更新了问题。其他点 -

  1. 即使我将并行性更改为 test级别,也将行不通。

    <test name="Test" parallel="methods" thread-count="5">
    
  2. priority添加到方法中以明确定义顺序有帮助,但这与我想的并行性事实不应有关。

  3. 当然,这里最明显的观点是,将method1中的睡眠减少到Thread.sleep(2000),确保执行订单符合预期的范围。

免责声明 - 尽管这不是作为当前问题的答案,但一旦发布了一个问题,就会将其删除。

编辑 - 日期2017年1月16日现在,这是Testng库中的一个空旷的问题,并在代码中使用此刷子修复了。

最新更新