接口自动化测试单元测试Unit Test

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

2018-08-31  本文已影响4人  Tomandy

前言

数据驱动是最常见的自动化测试框架模式之一,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一致。

<?xml version="1.0" encoding="UTF-8"?>
        <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="All Test Suite">
<test verbose="2" preserve-order="true" name="D:/IntelliJ_IDEA_workspace/TestNG/src/test/resources">

    <parameter name="para" value="Tomandy"/>

    <classes>
        <class name="TestNGHelloWorld1">
        </class>
    </classes>
</test>
</suite>

运行结果:

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<Object[]> 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.可以通过修改 <suite> 标签中的data-provider-thread-count属性来更改。如果想指定的几个data provider运行在不同的线程中,则必须通过不同的xml文件来运行。

<suite name="Suite1" data-provider-thread-count="20" >
上一篇 下一篇

猜你喜欢

热点阅读