Testng 介绍 (三)

本贴最后更新于 1359 天前,其中的信息可能已经时移世异

8、@Parameters使用方式

测试方法不必是无参数的。 您可以在每种测试方法上使用任意数量的参数,并指示TestNG使用@Parameters注解向您传递正确的参数。

@Parameters({ "first-name" })
@Test
public void testSingleString(String firstName) {
  System.out.println("Invoked testString " + firstName);
  assert "Cedric".equals(firstName);
}

在此代码中,我们指定Java方法的参数firstName接收first-name的XML参数的值。
此XML参数在testng.xml中定义:

<suite name="My suite">
  <parameter name="first-name"  value="Cedric"/>
  <test name="Simple example">
  <-- ... -->

也可以用在@Before/After and @Factory之上

@Parameters({ "datasource", "jdbcDriver" })
@BeforeMethod
public void beforeTest(String ds, String driver) {
  m_dataSource = ...;                            
  m_jdbcDriver = driver;
}

可以使用@Optional指定参数默认值

@Parameters("db")
@Test
public void testNonExistentParameter(@Optional("mysql") String db) { ... }

如果在testng.xml中找不到"db"参数,将使用mysql作用参数值。

9、@DataProvider使用方式

如果我们需要传递复杂的参数,或者需要通过Java创建的参数(复杂对象,从属性文件或数据库读取的对象等),则在testng.xml中指定参数可能不够。 在这种情况下,您可以使用数据提供程序来提供需要测试的值。 数据提供程序是类上的一种方法,它返回对象数组的数组。 此方法用@DataProvider注解:

//此方法声明为一个数据支持者,测试方法可以通过name调用
@DataProvider(name = "test1")
public Object[][] createData1() {
 return new Object[][] {
   { "Cedric", new Integer(36) },
   { "Anne", new Integer(37)},
 };
}
 
//此测试方法指定引用test1数据支持者
@Test(dataProvider = "test1")
public void verifyData1(String n1, Integer n2) {
 System.out.println(n1 + " " + n2);
}

输出

Cedric 36
Anne 37

默认情况下,dataProvider在同一个类中通过name查找方法,如果想再其他类中查找数据支持者,必须dataProviderClass指定,同时必须使用static修饰,如下:

public class StaticProvider {
  @DataProvider(name = "create")
  public static Object[][] createData() {
    return new Object[][] {
      new Object[] { new Integer(42) }
    };
  }
}
 
public class MyTest {
  @Test(dataProvider = "create", dataProviderClass = StaticProvider.class)
  public void test(Integer n) {
    // ...
  }
}

dataProvider支持的返回值类型:

Object[n][m]:n表示test方法执行次数,m表示test方法有几个参数。(最常用)
Iterator<Object[]>:和Object[][]类似,换成了迭代器而已,可以理解为List<Object>.iterate()
Object[n]:某种类型的数组。
Iterator<Object>:某种类型的迭代器。

Iterator<Object[]>:

@DataProvider(name = "test1")
public Iterator<Object[]> createData() {
  return new MyIterator(DATA);
}

Object[n]:

@DataProvider(name = "test1")
public MyCustomData[] createData() {
  return new MyCustomData[]{ new MyCustomData() };
}

Iterator<Object>:

@DataProvider(name = "test1")
public Iterator<MyCustomData> createData() {
  return Arrays.asList(new MyCustomData()).iterator();
}

Iterator<Object>:

@DataProvider(name = "test1")
public Iterator<Stream> createData() {
  return Arrays.asList(Stream.of("a", "b", "c")).iterator();
}

可以在DataProvider方法上声明一个java.lang.reflect.Method参数用来输出test方法名称,当多个test方法使用同一个DataProvider时非常有用:

@DataProvider(name = "dp")
public Object[][] createData(Method m) {
  System.out.println(m.getName());  // 打印 test 方法 name
  return new Object[][] { new Object[] { "Cedric" }};
}
 
@Test(dataProvider = "dp")
public void test1(String s) {
}
 
@Test(dataProvider = "dp")
public void test2(String s) {
}

输出

test1
test2

如果你想并发执行,使用parallel属性

@DataProvider(parallel = true)

从属性默认情况下,线程池的大小为10。 我们可以在XML文件的标记中修改此值:

<suite name="Suite1" data-provider-thread-count="20" >
...

10、依赖

有时,您需要按特定顺序调用测试方法。我们可以使用@Test批注中的属性dependsOnMethodsdependsOnGroups
有两种依赖关系:

硬依赖: 所依赖的所有方法都必须已经运行并成功运行。 如果依赖项中至少发生了一次故障,则不会在报告中调用并将其标记为SKIP。
软依赖:即使其中一些方法失败了,也将始终在所依赖的方法之后运行。通过在@Test批注中添加“alwaysRun = true”来获得软依赖性。

硬依赖:

@Test
public void serverStartedOk() {}
 
@Test(dependsOnMethods = { "serverStartedOk" })
public void method1() {}

此案例,serverStartedOk先执行,method1再执行。
我们还可以使用依赖组:

@Test(groups = { "init" })
public void serverStartedOk() {}
 
@Test(groups = { "init" })
public void initEnvironment() {}
 
@Test(dependsOnGroups = { "init.*" })
public void method1() {}

init.*使用的是正则表达式,所以method1serverStartedOkinitEnvironment之后执行。

1 操作
luojie 在 2020-08-06 17:38:14 更新了该帖
回帖
请输入回帖内容 ...