如何使用工厂

时间:2016-11-23 14:16:30

标签: java xml testng

使用TestNG,可以在testng xml文件中包含/排除特定方法,如下所示:

<classes>
  <class name="WebTest">
    <methods>
      <include name="testMethod1"/>
    </methods>
  </class>
</classes>

使用工厂提供WebTest文件的实例时,说明您应该只在xml中包含工厂类,如下所示:

<classes>
  <class name="WebTestFactory" />
</classes

问题在于,当使用工厂时,TestNG会运行类WebTest的所有带注释的方法。我想做的是这样的事情:

<classes>
  <class name="WebTestFactory">
    <methods>
      <include name="testMethod1"/>
    </methods>
  </class>
</classes>

其中testMethod1是属于类WebTest的方法,WebTest返回WebTestFactory的实例。

但是,每当我尝试此TestNG时,都会抱怨WebTestFactory不包含testMethod1

使用带有TestNG的工厂时,有没有办法在XML文件中指定方法包含/排除?

4 个答案:

答案 0 :(得分:0)

据我所知,无法从工厂过滤方法。当您在同一个类中混合出厂和测试方法时,会使用Include / Exclude。 我打开了一张关于需求的门票:https://github.com/cbeust/testng/issues/1253随意在那里发表评论。

作为一种变通方法,您可以尝试实现a method interceptor,这将根据您的业务逻辑(例如,系统属性)禁用测试方法。

答案 1 :(得分:0)

groupby

答案 2 :(得分:0)

我的目标有些不同,但也许对您的问题也有帮助。我想在一个新的类实例中运行每个测试方法。主要思想是,使用方法拦截器,您可以从没有依赖性的方法中定义要运行的方法。请注意,您可以通过上下文将变量从数据提供程序传递到拦截器。也许您可以使用它来定义要运行的方法。这是我的实现方式:

testng.xml

 <test name="test">
    <groups>
        <run>
            <include name="g1"/>
        </run>
    </groups>
    <classes>
        <class name="ParallelTest">
            <methods>
            </methods>
        </class>
    </classes>
</test>

课程

public class ParallelTest {

private final String testToRun;

@DataProvider
public static Object[][] dp(ITestContext context) {
    return new Object[][]{
            new Object[]{"test1", context},
            new Object[]{"test2", context}             
    };
}

@Factory(dataProvider = "dp")
public ParallelTest(String testToRun, ITestContext context) {
    this.testToRun = testToRun;
    context.setAttribute("testToRun", testToRun);
}

@BeforeMethod(groups = "g1")
void beforeMethodG1() {
    System.out.printf("class id: %s, group name: g1, test to run: %s\n", this, testToRun );
}

@BeforeMethod(groups = "g2")
void beforeMethodG2() {
    System.out.println("g2");
}

@Test
    (groups = "g1")
void test1() {
    System.out.printf("class id: %s, group name: g1, test to run: %s, actual test: %s\n", this, testToRun, "test1" );
}

@Test
    (groups = "g1")
void test2() {
    System.out.printf("class id: %s, group name: g1, test to run: %s, actual test: %s\n", this, testToRun, "test2" );
}

@AfterMethod(alwaysRun = true)
void afterMethod(Method method) {
    System.out.println("after " + method.getName());
}

}

拦截器

public class MethodInterceptor implements IMethodInterceptor {
@Override
public List<IMethodInstance> intercept(List<IMethodInstance> methods, ITestContext context) {
    List<String> methodNamesToRun = new ArrayList<>(methods.size());
    List<Object> classInstancesToRun = new ArrayList<>(methods.size());
    List<IMethodInstance> result = new ArrayList<>();
    for (IMethodInstance methodInstance : methods) {
        Object classInstance = methodInstance.getMethod().getInstance();
        String methodName = methodInstance.getMethod().getQualifiedName();
        if (!classInstancesToRun.contains(classInstance) && !methodNamesToRun.contains(methodName)) {
            result.add(methodInstance);
            classInstancesToRun.add(classInstance);
            methodNamesToRun.add(methodName);
        }
    }
    context.getAttribute("testToRun");
    return result;
}

}

结果

class id: ParallelTest@20d3d15a, group name: g1, test to run: test1
class id: ParallelTest@20d3d15a, group name: g1, test to run: test1, actual test: test1
after test1
class id: ParallelTest@2893de87, group name: g1, test to run: test2
class id: ParallelTest@2893de87, group name: g1, test to run: test2, actual test: test2
after test2

答案 3 :(得分:0)

@Factory 表示法放在具有 dataProvider 属性的测试类的构造函数上,如下所示

public class TestFoo
{
  static final String TEST_NAMES = "testNames";

  @Nonnull
  private final String testName;

  @Factory(dataProvider = TEST_NAMES)
  public TestFoo(@Nonnull String testName)
  {
    this.testName = testName;
  }

  @DataProvider(name = TEST_NAMES)
  public static Object[][] testNames()
  {
    Object[][] names = new Object[][]{{"Foo"}, {"Bar"}, {"Baz"}};
    return names;
  }

  @Test
  public void nameTest()
  {
    System.out.println("Name = " + testName);
    Assert.assertFalse(testName.isBlank());
  }
}

输出:

Name = Bar
Name = Foo
Name = Baz

===============================================
Default Suite
Total tests run: 3, Passes: 3, Failures: 0, Skips: 0
===============================================


Process finished with exit code 0