Java TestNG并行测试类

Java TestNG并行测试类,java,parallel-processing,testng,Java,Parallel Processing,Testng,我有3个测试班: 第一个测试: public class FirstTest { @BeforeClass(alwaysRun = true) public void setUp() { System.out.println("FirstTest: set up class"); } @Test(groups = "FirstTest") public void test1() { System.out.println(

我有3个测试班:

第一个测试:

public class FirstTest {

    @BeforeClass(alwaysRun = true)
    public void setUp() {
        System.out.println("FirstTest: set up class");
    }

    @Test(groups = "FirstTest")
    public void test1() {
        System.out.println("FirstTest: test1");
    }

    @Test(groups = "FirstTest")
    public void test2() {
        System.out.println("FirstTest: test2");
    }

    @Test(
            groups = "FirstTest",
            dependsOnMethods = "test2"
    )
    public void test3() {
        System.out.println("FirstTest: test3");
    }

    @Test(
            groups = {"FirstTest", "first:4"},
            dependsOnMethods = "test3"
    )
    public void test4() {
        System.out.println("FirstTest: test4");
    }

    @AfterClass(alwaysRun = true)
    public void tearDown() {
        System.out.println("FirstTest: tear down class");
    }
}
第二项测试:

public class SecondTest {

    @BeforeClass(alwaysRun = true)
    public void setUp() {
        System.out.println("SecondTest: set up class");
    }

    @Test(groups = "SecondTest")
    public void test1() {
        System.out.println("SecondTest: test1");
    }

    @Test(groups = "SecondTest")
    public void test2() {
        System.out.println("SecondTest: test2");
    }

    @Test(
            dependsOnGroups = "first:4",
            groups = "SecondTest"
    )
    public void test3() {
        System.out.println("SecondTest: test3");
    }

    @Test(groups = "SecondTest")
    public void test4() {
        System.out.println("SecondTest: test4");
    }

    @AfterClass(alwaysRun = true)
    public void tearDown() {
        System.out.println("SecondTest: tear down class");
    }
}
其他测试:

public class OtherTest {

    @BeforeClass(alwaysRun = true)
    public void setUp() {
        System.out.println("OtherTest: set up class");
    }

    @Test(groups = "OtherTest")
    public void test1() {
        System.out.println("OtherTest: test1");
    }

    @Test(groups = "OtherTest")
    public void test2() {
        System.out.println("OtherTest: test2");
    }

    @Test(groups = "OtherTest")
    public void test3() {
        System.out.println("OtherTest: test3");
    }

    @Test(groups = "OtherTest")
    public void test4() {
        System.out.println("OtherTest: test4");
    }

    @AfterClass(alwaysRun = true)
    public void tearDown() {
        System.out.println("OtherTest: tear down class");
    }
}
我想在多个线程中运行它们-每个类一个线程。在整个测试类无法通过之前,不应中断每个类的运行测试以执行其他测试。但是我得到了以下结果(例如一个线程):

TestNG.xml:

<suite name="Suite1" parallel="classes" thread-count="1" verbose="10">
  <test name="sample" preserve-order="true" >
    <classes>
       <class name="sample.testng.FirstTest" />
       <class name="sample.testng.SecondTest" />
       <class name="sample.testng.OtherTest" />
    </classes>
  </test>
</suite>
如何获得下一个结果

sample.testng.SecondTest.setUp() 21480956
    sample.testng.SecondTest.test4() 21480956
    sample.testng.SecondTest.test1() 21480956
    sample.testng.SecondTest.test2() 21480956
    sample.testng.SecondTest.test3() 21480956
sample.testng.SecondTest.tearDown() 21480956
sample.testng.OtherTest.setUp() 32782069
    sample.testng.OtherTest.test4() 32782069
    sample.testng.OtherTest.test1() 32782069
    sample.testng.OtherTest.test3() 32782069
    sample.testng.OtherTest.test2() 32782069
sample.testng.OtherTest.tearDown() 32782069
sample.testng.FirstTest.setUp() 2623667
    sample.testng.FirstTest.test1() 2623667
    sample.testng.FirstTest.test2() 2623667
    sample.testng.FirstTest.test3() 2623667
    sample.testng.FirstTest.test4() 2623667
sample.testng.FirstTest.tearDown() 2623667

如果您想运行1。第二个测试2。其他测试3。FirstTest,正如您在最终清单中所概述的,为什么要对列为

   <class name="sample.testng.FirstTest" />
   <class name="sample.testng.SecondTest" />
   <class name="sample.testng.OtherTest" />

而不是

   <class name="sample.testng.SecondTest" />
   <class name="sample.testng.OtherTest" />
   <class name="sample.testng.FirstTest" />


您需要增加线程数=3

<suite name="Suite1" parallel="classes" thread-count="3" verbose="10">
  <test name="sample" preserve-order="false" >
    <classes>
       <class name="sample.testng.FirstTest" />
       <class name="sample.testng.SecondTest" />
       <class name="sample.testng.OtherTest" />
    </classes>
  </test>
</suite>


当你说你想并行运行3个测试类,但你只向它传递了1个线程时。

Andrey,请澄清这个问题。根据您的理解,您希望在不同的线程中运行测试,但同时按顺序运行它们。我假设你知道让测试依赖于其他测试是多么糟糕。让测试相互依赖只在单元测试中是不被鼓励的。它对所有其他测试都非常有用。我同意奥古斯托的观点,你没有问过任何问题,但是,你到底想实现什么?您在这里给出的输出正是给定“parallel=”classes“时应该得到的结果。我有针对Selenium的功能测试。我有可用的3级测试和2个SeleniumRC(通过Selenium网格)。浏览器在setUpClass()中打开,在tearDownClass()中关闭。我想在两个流(parallel=“classes”)中并行运行测试,我希望在第一个和第二个类的并行测试中完全执行。只有到那时,我们才能满足第三类。但实际上,我启动了前两个类(打开两个浏览器),然后运行带有测试的第三个类,但他无法获得可用的SeleniumRC,直到前两个类完成执行我如何停止在测试类之间执行跳跃技术?在每一个班级进行测试,被视为不可分割的小组。
<suite name="Suite1" parallel="classes" thread-count="3" verbose="10">
  <test name="sample" preserve-order="false" >
    <classes>
       <class name="sample.testng.FirstTest" />
       <class name="sample.testng.SecondTest" />
       <class name="sample.testng.OtherTest" />
    </classes>
  </test>
</suite>