TestNG课程并行运行,但方法并不适用。如何配置我的testng.xml文件和测试类,以便方法也可以并行运行?

时间:2015-01-21 01:19:03

标签: java selenium selenium-webdriver testng

我有一套Selenium WebDriver测试,我正在使用Grid运行。当我运行这个testng.xml文件时:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite" parallel="classes" thread-count="20">
  <test name="Test">
    <classes>
      <class name="testcases.test1"/>
      <class name="testcases.test2"/>
      <class name="testcases.test3"/>
      <class name="testcases.test4"/>
      <class name="testcases.test5"/>
      <class name="testcases.test6"/>
      <class name="testcases.test7"/>
      <class name="testcases.test8"/>
      <class name="testcases.test9"/>
      <class name="testcases.test10"/>
      <class name="testcases.test11"/>
      <class name="testcases.test12"/>
      <class name="testcases.test13"/>
      <class name="testcases.test14"/>
      <class name="testcases.test15"/>
      <class name="testcases.test16"/>
      <class name="testcases.test17"/>
      <class name="testcases.test18"/>
      <class name="testcases.test19"/>
      <class name="testcases.test20"/>
      <class name="testcases.test21"/>
    </classes>
  </test> <!-- Test -->
</suite> <!-- Suite -->

打开多个浏览器,每个浏览器都运行@BeforeClass方法和第一个@Test方法。但是,在每个浏览器完成第一个@Test方法之后,它将等待所有其他浏览器完成它们各自的第一个@Test方法。

测试的结构如下:

public class sampleTestClass {
    @BeforeClass
    public void setup(){
        //setup Remote WebDriver
    }
    @Test
    public void method1(){
        //do things
    }
    @Test(dependsOnMethods = "method1")
    public void method2(){
        //do things
    }
    @Test(dependsOnMethods = "method2")
    public void method3(){
        //do things
    }
    @AfterClass
    public void teardown(){
        //call teardown
    }

}

每个类中有多个@Test方法。我将补充说,当我使用这个.xml文件时,一切都按照我喜欢的方式运行:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="MySuite" parallel="tests" thread-count="20">
  <test name="First Test">
    <classes>
       <class name="testcases.test1"/>
    </classes>
  </test>
  <test name="Second Test">
    <classes>
       <class name="testcases.test2"/>
    </classes>
  </test>
  <test name="Third Test">
    <classes>
       <class name="testcases.test3"/>
    </classes>
  </test>
  <test name="Fourth Test">
    <classes>
       <class name="testcases.test4"/>
    </classes>
  </test>
  <!--<test name="Fifth Test">
    <classes>
       <class name="testcases.test5"/>
    </classes>
  </test>-->
  <test name="Sixth Test">
    <classes>
       <class name="testcases.test6"/>
    </classes>
  </test>
  <test name="Seventh Test">
    <classes>
       <class name="testcases.test7"/>
    </classes>
  </test>
</suite>

我对此配置不满意的原因是,我不认为它完全保留了标签的语义含义,而且两个(最重要的是)我喜欢它能够并行运行自动生成的故障套件,但该.xml文件的配置与我遇到问题的顶级配置相同。

在我看来,指定parallel =&#34; classes&#34;套件标签中的内容与TestNG文档一致,但并未在单独的类中实现@Test方法的异步执行。

为什么.xml文件的配置不起作用?我需要做些什么才能使其有效?

1 个答案:

答案 0 :(得分:2)

在具有多个方法的webdriver测试类的上下文中,假设该类中有一个webdriver实例,我不知道如何在方法之间同时共享一个webdriver实例。我似乎必须一次调用一个方法,以便每个方法都使用webdriver实例。否则,你似乎会得到某种并发异常。

我已多次尝试使用与TestNG一起使用的并行方法,但从未成功过。 There is an example in the source code though这可能是一个线索;只需查看同一文件夹中的testng.xml即可。