(五)TestNG学习之路—注解详述之参数化

目录

(一)TestNG学习之路—HelloWorld入门
(二)TestNG学习之路—注解及属性概览
(三)TestNG学习之路—TestNG.xml/YAML
(四)TestNG学习之路—注解详述之@Test
(五)TestNG学习之路—注解详述之参数化
(六)TestNG学习之路—注解详述之@Factory
(七)TestNG学习之路—注解详述之忽略测试
(八)TestNG学习之路—注解详述之并发
(九)TestNG学习之路—失败测试重跑
(十)TestNG学习之路—编码执行TestNG
(十一)TestNG学习之路—BeanShell高级用法
(十二)TestNG学习之路—注解转换器
(十三)TestNG学习之路—方法拦截器
(十四)TestNG学习之路—TestNG监听器
(十五)TestNG学习之路—依赖注入
(十六)TestNG学习之路—测试报告
(十七)基于TestNG+Rest Assured+Allure的接口自动化测试框架

前言

数据驱动是最常见的自动化测试框架模式之一,TestNG亦支持数据驱动,常用的有@Parameters和@DataProvider两种注解。

@Parameters

@Parameters(value = "para")参数个数须与注解方法的入参个数保持一致。

import org.testng.Assert;
import org.testng.annotations.*;

public class TestNGHelloWorld1 {
    @BeforeTest
    public void bfTest() {
        System.out.println("TestNGHelloWorld1 beforTest!");
    }

    @Test(expectedExceptions = ArithmeticException.class, expectedExceptionsMessageRegExp = ".*zero")
    public void helloWorldTest1() {
        System.out.println("TestNGHelloWorld1 Test1!");
        int c = 1 / 0;
        Assert.assertEquals("1", "1");
    }

    @Test()
    @Parameters(value = "para")
    public void helloWorldTest2(String str) {
        Assert.assertEquals("1", "1");
        System.out.println("TestNGHelloWorld1 Test2! "+ str);

    }

    @AfterTest
    public void AfTest() {
        System.out.println("TestNGHelloWorld1 AfterTest!");
    }
}

testng.xml配置parameter的value为传入给变量的值,name与@Parameters的value一致。


        



    

    
        
        
    


运行结果:

TestNGHelloWorld1 beforTest!
TestNGHelloWorld1 Test1!
TestNGHelloWorld1 Test2! Tomandy
TestNGHelloWorld1 AfterTest!

===============================================
All Test Suite
Total tests run: 2, Failures: 0, Skips: 0
===============================================

也可以通过@Optional来指定默认值,如果testng.xml没有配置对应的参数,则使用默认值传参。

@Test()
@Parameters(value = "para")
public void helloWorldTest2(@Optional("Tom")String str) {
      Assert.assertEquals("1", "1");
      System.out.println("TestNGHelloWorld1 Test2! "+ str);
}

@DataProvider

如果需要传递复杂的参数,那么@Parameters可能无法满足。在这种情况下,可以使用@DataProvider提供需要测试的值。@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 36
Anne 37

如果@DataProvider和@Test注解的方法不在同一个类或属于其基类的话,需通过dataProviderClass属性来指定@DataProvider类位置,并且@DataProvider注解的方法保持静态(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) {
    // ...
  }
}

除了上述的return Object[][],@DataProvider注解的方法也允许使用迭代器,区别是迭代器允许你延迟创建自己的测试数据,TestNG会调用迭代器,之后测试方法会一个接一个的调用由迭代器返回的值。在你需要传递很多参数组给测试方法的时候,无须提前创建一堆值。

@DataProvider(name = "test1")
public Iterator createData() {
  return new MyIterator(DATA);
} 

如果你声明的 @DataProvider 使用 java.lang.reflect.Method 作为第一个参数,TestNG 会把当前的测试方法当成参数传给第一个参数,举例如下:

@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) {
}

执行结果:

test1
test2

另外,@DataProvider可使用parallel属性来实现并行执行测试。

@DataProvider(parallel = true)
// ...

使用XML文件运行的data provider享有相同的线程池,默认的线程数大小是10.可以通过修改 标签中的data-provider-thread-count属性来更改。如果想指定的几个data provider运行在不同的线程中,则必须通过不同的xml文件来运行。


你可能感兴趣的:((五)TestNG学习之路—注解详述之参数化)