使用dependsOn以意外顺序运行的并行(方法)执行

时间:2016-12-21 00:19:43

标签: java testng

我正在尝试使用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

1 个答案:

答案 0 :(得分:0)

欣赏这里注意到的一点。通过文档查找parallel running实际传达的内容 -

  

parallel =&#34;方法&#34; :TestNG将分别运行您的所有测试方法   线程。依赖方法也将在不同的线程中运行但它们   将尊重您指定的订单

但是我无法弄清楚这个顺序应该依赖什么。

所以试着进一步寻找并发现这篇dependencies with annotations文章 -

  
      
  • 硬依赖。您依赖的所有方法都必须运行和   你成功了。如果您的帐号中至少发生一次故障   依赖关系,你不会被调用并标记为跳过   报告。
  •   
  • 软依赖。您将始终在方法之后运行   你依赖,即使其中一些失败了。这很有用   你只是想确保你的测试方法在某个特定的情况下运行   但是他们的成功并不取决于成功与否   其他。通过添加&#34; alwaysRun = true&#34;来获得软依赖性。在   你的@Test注释。
  •   

对于dependsOnGroup示例,它读取

  

在此示例中,method1()声明为依赖于任何组   匹配正则表达式"init.*",这保证了   方法serverStartedOk()和initEnvironment()将始终被调用   之前 method1()。

因此调用顺序由您在问题中定义,但执行不依赖于其他组的成功或失败。

但我想在所有这些研究和试验期间,我可以找到另一个点,我可以看到"parallel=methods"执行测试而不管硬依赖性。用可重现的代码更新了问题。补充要点 -

  1. 即使我将并行度更改为test级别,它也无法正常工作。

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

  3. 当然,最值得注意的一点是,将method1中的睡眠时间减少到Thread.sleep(2000)可确保执行顺序符合预期。

  4. 免责声明 - 虽然这不是当前问题的答案,但只要发布一个解决方案,就会将其删除。

    编辑 - 日期2017年1月16日 现在这是一个Open issue in testng library here,并在代码中使用this PullRequest修复。