TestNG - 参数化测试

  • 简述

    TestNG 中另一个有趣的功能是 参数化测试. 在大多数情况下,您会遇到业务逻辑需要大量不同测试的场景。参数化测试 允许开发人员使用不同的值一遍又一遍地运行相同的测试。
    TestNG 允许您以两种不同的方式将参数直接传递给您的测试方法 -
    • 使用 testng.xml
    • 与数据提供者
  • 使用testng.xml传递参数

    使用这种技术,您可以在testng.xml文件中定义简单参数,然后在源文件中引用这些参数。让我们用一个例子来演示如何使用这种技术来传递参数。

    创建测试用例类

    • 创建一个 java 测试类,比如 ParameterizedTest1.java。
    • 将测试方法 parameterTest() 添加到您的测试类。此方法将字符串作为输入参数。
    • 向该方法添加注解@Parameters("myName")。该参数将从 testng.xml 中传递一个值,我们将在下一步中看到该值。
    创建一个名为的java类文件 ParameterizedTest1.java/work/testng/src.
    
    import org.testng.annotations.Parameters;
    import org.testng.annotations.Test;
    public class ParameterizedTest1 {
       @Test
       @Parameters("myName")
       public void parameterTest(String myName) {
          System.out.println("Parameterized value is : " + myName);
       }
    }
    

    创建 testng.xml

    在中创建 testng.xml /work/testng/src 执行测试用例。
    
    <?xml version = "1.0" encoding = "UTF-8"?>
    <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
    <suite name = "Suite1">
       <test name = "test1">
          <parameter name = "myName" value="manisha"/>
          <classes>
             <class name = "ParameterizedTest1" />
          </classes>
       </test>
    </suite>
    
    我们还可以在 <suite> 级别定义参数。假设我们在 <suite> 和 <test> 级别都定义了myName。在这种情况下,常规范围规则适用。这意味着 <test> 标签内的任何类都将看到 <test> 中定义的参数值,而 testng.xml 文件其余部分中的类将看到 <suite> 中定义的值。
    使用 javac 编译测试用例类。
    
    /work/testng/src$ javac ParameterizedTest1.java
    
    现在,运行 testng.xml,它将运行parameterTest方法。TestNG 将首先尝试在 <test> 标签中找到名为myName的参数,然后,如果找不到,它会在包含它的 <suit> 标签中搜索。
    
    /work/testng/src$ java org.testng.TestNG testng.xml
    
    验证输出。
    
    Parameterized value is : manisha
    ===============================================
    Suite1
    Total tests run: 1, Failures: 0, Skips: 0
    ===============================================
    
    TestNG 将自动尝试将 testng.xml 中指定的值转换为您的参数类型。以下是支持的类型 -
    • String
    • int/Integer
    • boolean/Boolean
    • byte/Byte
    • char/Character
    • double/Double
    • float/Float
    • long/Long
    • short/Short
  • 使用数据提供者传递参数

    当需要传递复杂参数或需要从Java创建的参数(复杂对象、从属性文件或数据库中读取的对象等)时,可以使用Dataproviders来传递参数。
    数据提供者是一种用注释的方法 @DataProvider. 这个注解只有一个字符串属性:它的名字。如果未提供名称,数据提供者的名称将自动默认为方法的名称。数据提供者返回一个对象数组。
    以下示例演示了如何使用数据提供程序。第一个例子是关于@DataProvider 使用Vector、String 或Integer 作为参数,第二个例子是关于@DataProvider 使用对象作为参数。

    示例 1

    在这里,@DataProvider 传递 Integer 和 Boolean 作为参数。
    Create Java class
    创建一个名为 PrimeNumberChecker.java 的 java 类。此类检查数字是否为素数。创建这个类/work/testng/src.
    
    public class PrimeNumberChecker {
       public Boolean validate(final Integer primeNumber) {
          for (int i = 2; i < (primeNumber / 2); i++) {
             if (primeNumber % i == 0) {
                return false;
             }
          }
          return true;
       }
    }
    
    创建测试用例类
    • 创建一个 java 测试类,比如说, ParamTestWithDataProvider1.java/work/testng/src.
    • 定义 primeNumbers() 方法,该方法使用注释定义为数据提供者。此方法返回一个对象数组。
    • 将测试方法 testPrimeNumberChecker() 添加到您的测试类。此方法采用整数和布尔值作为输入参数。此方法验证传递的参数是否为素数。
    • 向该方法添加注解@Test(dataProvider = "test1")。属性 dataProvider 映射到“test1”。
    以下是内容 ParamTestWithDataProvider1.java.
    
    import org.testng.Assert;
    import org.testng.annotations.BeforeMethod;
    import org.testng.annotations.DataProvider;
    import org.testng.annotations.Test;
    public class ParamTestWithDataProvider1 {
       private PrimeNumberChecker primeNumberChecker;
       @BeforeMethod
       public void initialize() {
          primeNumberChecker = new PrimeNumberChecker();
       }
       @DataProvider(name = "test1")
       public static Object[][] primeNumbers() {
          return new Object[][] {{2, true}, {6, false}, {19, true}, {22, false}, {23, true}};
       }
       // This test will run 4 times since we have 5 parameters defined
       @Test(dataProvider = "test1")
       public void testPrimeNumberChecker(Integer inputNumber, Boolean expectedResult) {
          System.out.println(inputNumber + " " + expectedResult);
          Assert.assertEquals(expectedResult, primeNumberChecker.validate(inputNumber));
       }
    }
    
    Create testng.xml
    创建一个 testng.xml /work/testng/src 执行测试用例。
    
    <?xml version = "1.0" encoding = "UTF-8"?>
    <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
    <suite name = "Suite1">
       <test name = "test1">
          <classes>
             <class name = "ParamTestWithDataProvider1" />
          </classes>
       </test>
    </suite>
    
    使用 javac 编译测试用例类。
    
    /work/testng/src$ javac ParamTestWithDataProvider1.java PrimeNumberChecker.java
    
    现在,运行 testng.xml。
    
    /work/testng/src$ java org.testng.TestNG testng.xml
    
    验证输出。
    
       2 true
       6 false
       19 true
       22 false
       23 true
    ===============================================
       Suite1
       Total tests run: 5, Failures: 0, Skips: 0
    ===============================================
    

    示例 2

    在这里,@DataProvider 将 Object 作为参数传递。
    Create Java class
    创建一个java类Bean.java,它是一个带有get/set方法的简单对象,在 /work/testng/src.
    
    public class Bean {
       private String val;
       private int i;
       public Bean(String val, int i) {
          this.val = val;
          this.i = i;
       }
       public String getVal() {
          return val;
       }
       public void setVal(String val) {
          this.val = val;
       }
       public int getI() {
          return i;
       }
       public void setI(int i) {
          this.i = i;
       }
    }
    
    Create Test Case Class
    • 创建一个 java 测试类,比如 ParamTestWithDataProvider2.java。
    • 定义 primeNumbers() 方法,该方法被定义为使用注解的数据提供者。此方法返回一个对象数组。
    • 将测试方法 testMethod() 添加到您的测试类。此方法将对象 bean 作为参数。
    • 向该方法添加注解@Test(dataProvider = "test1")。属性 dataProvider 映射到“test1”。
    在其中创建一个名为 ParamTestWithDataProvider2.java 的 java 类文件 /work/testng/src.
    
    import org.testng.annotations.DataProvider;
    import org.testng.annotations.Test;
    public class ParamTestWithDataProvider2 {
       @DataProvider(name = "test1")
       public static Object[][] primeNumbers() {
          return new Object[][] { { new Bean("hi I am the bean", 111) } };
       }
       @Test(dataProvider = "test1")
       public void testMethod(Bean myBean) {
          System.out.println(myBean.getVal() + " " + myBean.getI());
       }
    }
    
    Create testng.xml
    在中创建 testng.xml /work/testng/src 执行测试用例。
    
    <?xml version = "1.0" encoding = "UTF-8"?>
    <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
    <suite name = "Suite1">
       <test name = "test1">
          <classes>
             <class name = "ParamTestWithDataProvider2" />
          </classes>
       </test>
    </suite>
    
    使用 javac 编译测试用例类。
    
    /work/testng/src$ javac ParamTestWithDataProvider2.java Bean.java
    
    现在,运行 testng.xml。
    
    /work/testng/src$ java org.testng.TestNG testng.xml
    
    验证输出。
    
       hi I am the bean 111
    ===============================================
       Suite1
       Total tests run: 1, Failures: 0, Skips: 0
    ===============================================