TestNG的 @Factory

工厂允许你动态的创建测试。

例如,假设你需要创建一个测试方法,并用它来多次访问一个web页面,而且每次都带有不同的参数:

public class TestWebServer {
  @Test(parameters = { "number-of-times" })
  public void accessPage(int numberOfTimes) {
    while (numberOfTimes-- > 0) {
     // access the web page
    }
  }
}

Test.XML

test name="T1">
  
  



  
  



  
  

参数一旦多起来,就难以管理了,所以应该使用工厂来做:

public class WebTestFactory {
  @Factory
  public Object[] createInstances() {
   Object[] result = new Object[10]; 
   for (int i = 0; i < 10; i++) {
      result[i] = new WebTest(i * 10);
    }
    return result;
  }
}

新的测试类如下:

public class WebTest {
  private int m_numberOfTimes;
  public WebTest(int numberOfTimes) {
    m_numberOfTimes = numberOfTimes;
  }

  @Test
  public void testServer() {
   for (int i = 0; i < m_numberOfTimes; i++) {
     // access the web page
    }
  }
}

testng.xml只需要引用包含工厂方法的类,而测试实例自己会在运行时创建:


工厂方法可以接受诸如@Test@Before/After所标记的参数,并且会返回 Object[]这些返回的对象可以是任何类(不一定是跟工厂方法相同的类),并且他们甚至都不需要TestNG注解(在例子中会被TestNG忽略掉)

工厂也可以被应用于数据提供者,并可以通过将@Factory注释无论是在普通的方法或构造函数利用此功能。这里是一个构造工厂的例子:

@Factory(dataProvider = "dp")
public FactoryDataProviderSampleTest(int n) {
  super(n);
}

@DataProvider
static public Object[][] dp() {
  return new Object[][] {
    new Object[] { 41 },
    new Object[] { 42 },
  };
}

该示例将TestNG的创建两个测试类,这个构造函数将调用值为41和42的对像

你可能感兴趣的:(TestNG的 @Factory)