繁体   English   中英

如何一个接一个地运行TestNG类

[英]How to run TestNG classes one after another

我想运行一个包含 4 个不同类的 testng.xml 文件。 我想在另一个完成后运行每个。 因此,当第 1 类完成时,则第 2 类开始,当第 2 类完成时,则第 3 类开始执行。 到目前为止,我已经编写了这段代码,但它同时触发了所有类。 即使我尝试了 parallel = false 也没有奏效。 任何帮助将不胜感激。谢谢

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Smoke Test"  parallel="false" preserve-order="true" verbose="2">
    <test name="Test 1">
        <classes>
            <class name="class1"></class>
        </classes>
    </test>
    <test name="Test 2">
        <classes>
            <class name="class2"></class>
        </classes>
    </test>
    <test name="Test 2">
        <classes>
            <class name="class3"></class>
        </classes>
    </test>
</suite>

您需要做的是同时使用 @BeforeClass 和 @AfterClass 注释来启动和退出 webdriver。 您需要定义 webdriver 在 @BeforeClass 中启动,并且 webdriver 在 @AfterClass 方法中退出(如果您选择在此类完成时关闭此 webdriver)。

举个例子...

@BeforeClass
public void initClass()
{
    //Set the system property
    String driverPath = System.getProperty("user.dir") +"\\chromedriver\\chromedriver.exe";
    String driverType = "webdriver.chrome.driver";
    
    System.setProperty(driverType, driverPath);

    driver = new ChromeDriver();
    driver.manage().window().maximize();
    driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
}

在这门课结束时,如果我想退出这个 webdriver 实例:

@AfterClass
public void finish()
{             
    driver.manage().deleteAllCookies();
    driver.quit();
}

对每个测试类都这样做,然后下一个类将在上一个类完成后才开始。

TestNG xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
<suite name="Suite">
    <test thread-count="5" name="Test" preserve-order="true">
        <classes>
            <class name="Pkg.ClassA" />
            <class name="Pkg.ClassB" />
            <class name="Pkg.ClassC" />
        </classes>
    </test> <!-- Test -->
</suite> <!-- Suite -->

这不是完全相同的设置,但我们在一些作业中使用“next”属性来进行顺序处理:

<batch:job id="JOB_NAME" job-repository="jobRepository"> 
    <batch:step id="process1" next="process2"> 
        <batch:tasklet>
            <batch:chunk>
                processing info
            </batch:chunk>
        </batch:tasklet>
    </batch:step>

    <batch:step id="process2" next="process3">
        <batch:tasklet>
            <batch:chunk>
                processing info
            </batch:chunk>
        </batch:tasklet>
        </batch:tasklet>
    </batch:step>

像这样的事情可能对你有用。

为什么不将所有测试类添加到同一个<test>标签中,然后运行它们?

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Smoke Test"  parallel="false" preserve-order="true" verbose="2">
    <test name="Test 1">
        <classes>
            <class name="class1"></class>
            <class name="class2"></class>
            <class name="class3"></class>
        </classes>
    </test>
</suite>

这基本上会在每个 Test 类中一个接一个地执行测试方法。 您可以通过添加System.out.println(Thread.currentThread().getId());来确认这一点System.out.println(Thread.currentThread().getId()); 到您的每个@Test方法。 您应该会看到正在打印相同的线程 ID。

也许您在@Test 注释中使用了“priority”和“dependsOnGroups”。 此参数对于订单更重要(请参阅 6.10 更改https://github.com/cbeust/testng/blob/master/CHANGES.txt )。

以“优先级”为例。

这段代码:

public class Class1 {

    @Test(priority = 1)
    public void test1() {
        System.out.println("Class1 test1");
    }

    @Test(priority = 2)
    public void test2() {
        System.out.println("Class1 test2");
    }

}

public class Class2 {

    @Test(priority = 1)
    public void test1() {
        System.out.println("Class2 test1");
    }

    @Test(priority = 2)
    public void test2() {
        System.out.println("Class2 test2");
    }

}

有结果:

Class1 test1
Class2 test1
Class1 test2
Class2 test2

以“dependsOnGroups”为例。

这段代码:

public class Class1 {

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

    @Test(dependsOnGroups = {"someGroup"})
    public void test2() {
        System.out.println("Class1 test2");
    }

}

public class Class2 {

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

    @Test(dependsOnGroups = {"someGroup"})
    public void test2() {
        System.out.println("Class2 test2");
    }

}

有相同的结果:

Class1 test1
Class2 test1
Class1 test2
Class2 test2

测试名称标签应该是唯一的,我看到第 2 类和第 3 类的测试名称相同,这就是您看到问题的原因。

如果您仍然看到问题,请添加日志/附加信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM