通过方法和组

时间:2017-02-22 11:36:25

标签: java testng

我喜欢执行按方法和组筛选的测试。这可能在TestNG中吗?

例如。我有两个方法,下面有两个TestNG类。

Class - SampleJ1
Methods - Test1(group=sanity), Test2(group=regression), Test3, Test4, Test5
Class - SampleJ2
Methods - Test1(group=sanity), Test2(group=regression), Test3, Test4, Test5

我的自动化框架生成TestNG XML文件。如果我使用以下数据创建XML文件,它应该只执行所提到方法的健全组。

<groups>
  <run>
    <include name="sanity" />
  </run>
</groups>
<test thread-count="12" name="Browser">
  <classes>
    <class name="SampleJ1">
      <include method="Test1"/>
      <include method="Test2"/>
      <include method="Test3"/>
      <include method="Test4"/>
    </class>
    <class name="SampleJ2">
      <include method="Test1"/>
      <include method="Test2"/>
      <include method="Test3"/>
      <include method="Test4"/>
    </class>
  </classes>
</test>

如果可能,请告诉我。

1 个答案:

答案 0 :(得分:1)

据我了解,您希望过滤测试方法以按其所属的名称和组执行。 首先,在纯TestNG中没有特殊的解决方案(否则像@juherr这样的一些TestNG专家会回答)。使用InvokedMethodListener的实现跳过测试方法会留下您可能不想要的日志。

我看到两个选项。

在第一个方法中,您可以实现一个@Factory方法,该方法可以使用Set<Method>Set<String>作为构造函数的参数来实例化您的测试类。在每个测试类中,您将检查要执行的方法(或其String表示)是否在Set中。 @Before带注释或beforeInvocation方法将处理逻辑,无论是否执行给定方法。此外,您的testng.xml会指定要运行的<groups>元素。同样,这可能会在您的日志和报告中留下Skipped: x

第二种选择是将Maven与其Surefire Plugin一起使用。 (如果你不使用像Gradle或Maven这样的构建工具,那么我确定你应该尝试)。使用Maven进行测试时,可以指定必须执行哪些组和哪些测试方法。 您的pom.xml应该与以下内容非常相似:

<!-- modelVersion, groupId, etc. -->
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.19.1</version>
            <configuration>
                <suiteXmlFiles>
                    <suiteXmlFile>src/test/resources/testng.xml</suiteXmlFile>
                </suiteXmlFiles>
            </configuration>
        </plugin>
        <!-- (...) -->
    </plugins>
    <!-- (...) -->
</build>
<dependencies>
    <dependency>
        <groupId>org.testng</groupId>
        <artifactId>testng</artifactId>
        <version>6.10</version>
    </dependency>
    <!-- (...) -->
</dependencies>

说,你有一个类似的测试类:

public class TestClass {

    @Test(groups = {"firstGroup"})
    public void firstMethod(Method method) {
        assertEquals(1, 1);
        System.out.println(method.getName());
    }

    @Test(groups = {"secondGroup"})
    public void secondMethod(Method method) {
        assertEquals(1, 1);
        System.out.println(method.getName());
    }

    @Test(groups = {"secondGroup"})
    public void thirdMethod(Method method) {
        assertEquals(1, 1);
        System.out.println(method.getName());
    }

    @Test(groups = {"secondGroup"})
    public void fourthMethod(Method method) {
        assertEquals(1, 1);
        System.out.println(method.getName());
    }
}

testng.xml中,您可以放置​​信息,执行哪些组:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Default Suite Name">
    <groups>
        <run>
            <include name="secondGroup"/>
        </run>
    </groups>
    <test name="Default Test Name">
        <classes>
            <class name="TestClass"/>
        </classes>
    </test>
</suite>

然后执行Maven目标来决定执行哪些方法:

mvn clean -Dtest=TestClass#thirdMethod+secondMethod test

可以找到多个方法和多个类的语法here 输出:

Running TestClass
secondMethod
thirdMethod
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0

第四种方法尚未执行,即使它属于secondGroup。 如果有许多方法要执行,您可以为它编写自定义bash脚本。

使用Maven和使用TestNG的方法过滤组是不可能的(至少对我而言)。