TestNG学习-参数的使用

 测试方法也可以借助使用一些参数。可以在每种测试方法上使用任意数量的参数,并指示TestNG使用@Parameters注解来传递正确的参数。

        有两种设置这些参数的方法:使用testng.xml 或 编程方式。

1. 使用testng.xml 

        如果参数是比较简单的值,则可以在testng.xml中指定它们:

@Parameters({ "first-name" })@Testpublic 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 和 @Factory注解中:​​​​​​​

@Parameters({ "datasource", "jdbcDriver" })@BeforeMethodpublic void beforeTest(String ds, String driver) {
   
     m_dataSource = ...;      // 具体datasource的值  m_jdbcDriver = driver;}

        上面代码中,两个Java参数ds和driver将分别收到赋予属性datasource和jdbc-driver的值。

        还可以使用Optional注解将参数声明为可选,相当于设置默认值:​​​​​​​

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

        如果在testng.xml文件中找不到名为“ db”的参数,则测试方法将收到@Optional注解内指定的默认值:“ mysql”。

        @Parameters注解可以放的位置:

  • 已经有@Before/After 和 @Factory注解的方法上。

  • 最多用在测试类的一个构造函数上。在这种情况下,每当需要实例化测试类时,TestNG就会使用初始化为testng.xml中指定的值的参数来调用此特定的构造函数。此功能可用于将类中的字段初始化为将由测试方法使用的值。

    • 注:

      • XML参数以与在批注中找到的顺序相同的顺序映射到Java参数,如果数字不匹配,则TestNG将发出错误。

      • 参数是作用域的。在testng.xml中,可以在<suite>标记下或在<test>下声明它们。如果两个参数具有相同的名称,则选择<test>中定义的优先级。如果需要指定一个适用于所有测试的参数并且仅对某些测试覆盖其值,这将非常方便。

2. 使用DataProviders的参数

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

//This method will provide data to any test method that declares that its Data Provider//is named "test1"@DataProvider(name = "test1")public Object[][] createData1() {
   
    return new Object[][] {
   
      { "Cedric", new Integer(36) },   { "Anne", new Integer(37)}, };} //This test method declares that its data should be supplied by the Data Provider//named "test1"@Test(dataProvider = "test1")public void verifyData1(String n1, Integer n2) {
   
    System.out.println(n1 + " " + n2);}

输出结果:​​​​​​​

Cedric 36Anne 37

        @Test方法使用dataProvider属性指定其数据提供程序。名称必须与使用@DataProvider(name =“ ...”)注解且名称匹配的同一类上的方法相对应。

        默认情况下,将在当前测试类或其基类之一中查找数据提供者。如果要将数据提供程序放在不同的类中,则它必须是静态方法或具有no-arg构造函数的类,并在dataProviderClass属性中指定可在其中找到的类:​​​​​​​

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) {
   
       // ...  }}

        数据提供者也支持注入。TestNG将使用测试上下文进行注入。数据提供程序方法可以返回以下类型之一:

  • 对象数组(Object[][])的数组,其中第一维的大小是将调用测试方法的次数,第二维的大小包含必须与测试的参数类型兼容的对象的数组方法。如上图代码。

  • Iterator <Object[]>。与Object[][]的唯一区别是,迭代器使您可以延迟创建测试数据。TestNG将依次调用迭代器,然后调用带有该迭代器返回的参数的测试方法。如果您有很多要传递给该方法的参数集而又不想预先创建所有参数集,则此功能特别有用。

    • 对象数组(Object[])。这类似于Iterator <Object[]>,会对源数组的每个元素调用一次测试方法。

    • Iterator <Object >。Object[]的惰性替代方法。对迭代器的每个元素调用一次测试方法。

        返回类型不仅限于Object,MyCustomData[][]或Iterator <Supplier>也是可以的。唯一的限制是,在使用迭代器的情况下,其参数类型本身无法明确地参数化。如下示例:​​​​​​​

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

    使用MyCustomData[]作为返回值:​​​​​​​

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

    或其Iterator <MyCustomData>的惰性选项:​​​​​​​

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

     无法明确参数化Iterator的参数类型(Stream):​​​​​​​

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

    如果声明@DataProvider以java.lang.reflect.Method作为第一个参数,则TestNG将通过当前测试方法作为第一个参数。当几种测试方法使用相同的@DataProvider并且希望它根据为其提供数据的测试方法返回不同的值时,此功能特别有用。

    例如,以下代码在其@DataProvider中打印测试方法的名称:​​​​​​​

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

        结果:​​​​​​​

test1test2

        @DataProvider也可以指定并行运行的方式:

@DataProvider(parallel = true)

        从XML文件运行的并行数据提供程序共享相同的线程池,默认情况下,线程池的大小为10。可以在XML文件的<suite>标记中修改此值:

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

如果要在其他线程池中运行一些特定的数据提供程序,则需要从其他XML文件运行它们。

3.测试报告中的参数

    可以将参数调用嵌入测试报告来使用,下面是一个简单的示例:

图片

欢迎关注我的公众号【测试备忘录】 一起分享交流~

猜你喜欢

转载自blog.csdn.net/hashsabr/article/details/113828542
今日推荐