TestNG:如何包含2组中的测试组(AND过滤器)

时间:2018-02-14 07:31:33

标签: java testing testng suite

我希望我的测试套件尽可能灵活 - 我希望能够:

  • 按优先级运行所有测试(p1,p2 ...) - 这很容易
  • 按模块运行所有测试(module1,module2 ...) - 这很容易
  • 运行特定优先级和特定模块的测试 - 我无法弄清楚

我有一些测试:

@Test(groups = {"p1", "module1"})
public void p1module1() {
    System.out.println("p1module1");
}
@Test(groups = {"p2", "module1"})
public void p2module1() {
    System.out.println("p2module1");
}
@Test(groups = {"p1", "module2"})
public void p1module2() {
    System.out.println("p1module2");
}
@Test(groups = {"p2", "module2"})
public void p2module2() {
    System.out.println("p2module2");
}

但如果我做这样的事情

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="qa-selenium">
    <test name="My Suite">
        <groups>
            <run>
                <include name="p1"/>
                <include name="module1"/>
            </run>
        </groups>
        <packages>
            <package name="com.mycompany.qa.selenium.*"/>
        </packages>
    </test>
</suite>

包含被视为OR,但我想要一个AND。在这种情况下,我想创建一个只执行p1module1()

的套件

我意识到我可以使用大量的排除 - 在这个例子中

<exclude name="p2"/>
<exclude name="module2"/>

但我真的想避免这种情况。有没有办法做到这一点,最好没有元编程?

2 个答案:

答案 0 :(得分:0)

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="qa-selenium">
    <test name="My Suite">
        <groups>
            <define name="functest">
                <include name="p1"/>
                <include name="p2" />
                <include name="module1"/>
                <include name="module2"/>
            </define>
            <define name="all">
                <include name="functest" />
            </define>
            <run>
                <include name="all"/>
            </run>
        </groups>
        <packages>
            <package name="your_package_name" />
        </packages>
    </test>
</suite>

您可以尝试以上方式,以便以所有可能的组合进行测试。

上面的xml组以下列方式给出了输出(它采用了所有可能的组合)。

enter image description here

答案 1 :(得分:0)

您可以使用包含名称common的第一部分,然后在include name中使用它来执行所有测试,如下所示

测试组如下

@Test(groups = {"a-p1", "a-module1"})
public void p1module1() {
    System.out.println("p1module1");
}
@Test(groups = {"b-p2", "b-module1"})
public void p2module1() {
    System.out.println("p2module1");
}
@Test(groups = {"c-p1", "c-module2"})
public void p1module2() {
    System.out.println("p1module2");
}
@Test(groups = {"d-p2", "d-module2"})
public void p2module2() {
    System.out.println("p2module2");
}

套件xml将如下所示

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="qa-selenium">
    <test name="My Suite">
        <groups>
            <run>
                <include name="a.*"/>
                <include name="b.*"/>
                <include name="c.*"/>
                <include name="d.*"/>
            </run>
        </groups>
        <packages>
            <package name="com.mycompany.qa.selenium.*"/>
        </packages>
    </test>
</suite>

在上面的xml中 <include name="a.*"/>将执行测试,这些测试已使用"a-p1", "a-module1"

进行标记

无需为P1和模块定义单独的包含名称,enter code here同样适用于其他人,它将被视为AND而非OR,请告诉我你问题的正确答案