TestNG,即Testing Next Generation,它派生自JUnit和NUnit,除了继承了两者的优势之外,又额外的发展出了一些新的功能,在参数化测试,依赖测试和套件测试(分组概念)方面更加突出。 TestNG用于高级测试和复杂集成测试。
TestNG有以下优点:
生成美观易读的测试报告
注解 使测试变得更加方便
可以更轻松地对测试用例进行分组和指定执行顺序
支持并发测试
生成日志
数据驱动测试
与主流工具的成熟集成
相比junit的TestCase/TestSuite,TestNG有suite/test/test method三个级别,即将test/test method明确区分开了。
测试类:
public class Testng {
@Test(groups = { "functest", "checkintest" })
public void testMethod1() {
System.out.println("testMethod1");
}
@Test(groups = {"functest", "checkintest"} )
public void testMethod2() {
System.out.println("testMethod2");
}
@Test(groups = { "functest" })
public void testMethod3() {
System.out.println("testMethod3");
}
}
testng.xml文件:
<suite name="TestNG">
<test name="Test1">
<groups>
<run>
<include name="checkintest"/>
run>
groups>
<classes>
<class name="com.example.testng_demo.Testng"/>
classes>
test>
suite>
意思就是执行Testng类中groups包含checkintest的方法,testMethod3这个方法的groups不含checkintest,所以不会执行;
用例间依赖关系,按序执行:
public class DependsTest {
@Test
public void setupEnv(){
System.out.println("this is setup Env");
}
//setupEnv()方法会在testMessage()方法前执行
@Test(dependsOnMethods = {"setupEnv"})
public void testMessage(){
System.out.println("this is test message");
}
}
说到按序执行,我们也可以把一些初始化/ 收尾工作的测试方法用@BeforeSuite/@AfterSuite,@BeforeGroups/@AfterGroups, @BeforeTest/@AfterTest等标记。
TestNG提供了2种传递参数的方式。
第一种: testng.xml 方式使代码和测试数据分离,方便维护,适用于一个用例,需要多个相同参数(值不同)来验证的情况。
第二种:@DataProvider能够提供比较复杂的参数。
如下例:
第一种,@Parameters({ “merchantNo” }) 会去testng.xml里取到这个merchantNo对应的value,放到传参merchant中。
public class TestParameter {
// @Parameters注解内对应的参数名称和配置文件中的merchantNo必须是相同
// 如果在配置文件中找不到参数名称为“merchantNo”的参数,则测试方法将接收@Optional注解中指定的默认值:“chen001”
@Parameters({ "merchantNo" })
@Test
public void testString(@Optional("chen001")String merchant) {
System.out.println("Invoked testString " + merchant);
assert "chen001".equals(merchant);
}
}
对应的testng.xml:
<suite name="TestNg">
<parameter name="merchantNo" value="chen001"/>
<test name="TestParameter">
<classes>
<class name="com.example.testng_demo.TestParameter"/>
classes>
test>
suite>
第二种,注解@DataProvider在参数化测试中起到重要的作用,该注解下的函数返回数据类型有两种,一种返回类型是Iterator,还一种返回类型是 Object[][]
,看例子如何实现:
@DataProvider函数,需要定义属性name
@DataProvider(name = "testcase")
public Iterator <Object[]> createData2() {
List <Object[]> datas = new ArrayList <Object[]>();
datas.add(new Object[]{"payment"});
datas.add(new Object[]{"refund"});
datas.add(new Object[]{"check"});
return datas.iterator();
}
@DataProvider(name = "testcase2")
public Object[][] createData1() {
return new Object[][] {
{ "Cedric", new Integer(36) },
{ "Anne", new Integer(37)},
};
}
@Test测试用例,属性dataProvider需要指定对应的@DataProvider名称
@Test(dataProvider = "testcase")
public void verifyData2(String type) {
System.out.println(type);
}
@Test(dataProvider = "testcase2")
public void verifyData1(String n1, Integer n2) {
System.out.println(n1 + " " + n2);
}
输出:
Cedric : 36
Anne : 37
payment
refund
check
TestNG通过 @Test(expectedExceptions) 来判断期待的异常, 也可以判断Error Message
@Test(expectedExceptions = IllegalArgumentException.class,expectedExceptionsMessageRegExp = "非法参数")
public void testException(){
throw new IllegalArgumentException("非法参数");
}
// 共3个线程调用了10次该方法
@Test(threadPoolSize = 3, invocationCount = 10,timeOut = 3000)
public void testThread(){
System.out.println(Thread.currentThread().getId());
}
invocationCount——-表示执行的次数
threadPoolSize——-表示线程池内线程的个数
timeOut——-超时时间-毫秒
在TestNG中编写测试非常简单,基本上包括以下步骤:
@BeforeSuite:在此套件中的所有测试运行之前,将运行带注释的方法。
@AfterSuite:在此套件中的所有测试运行后,将运行带注释的方法。
@BeforeTest:在运行属于标记内的类的任何测试方法之前,将运行带注释的方法。
@AfterTest:在标记内的类的所有测试方法都运行之后,将运行带注释的方法。
@BeforeGroups:此配置方法之前将运行的组列表。保证在调用属于任何这些组的第一个测试方法之前不久运行此方法。
@AfterGroups:此配置方法将在之后运行的组列表。保证在调用属于任何这些组的最后一个测试方法后不久运行此方法。
@BeforeClass:在调用当前类中的第一个测试方法之前,将运行带注释的方法。
@AfterClass:在运行当前类中的所有测试方法之后,将运行带注释的方法。
@BeforeMethod:带注释的方法将在每个测试方法之前运行。
@AfterMethod:带注释的方法将在每个测试方法之后运行。
@Test:带注释的方法是测试用例的一部分。
@BeforeSuite->@BeforeTest->@BeforeClass->{@BeforeMethod->@Test->@AfterMethod}->@AfterClass->@AfterTest->@AfterSuite
导入Assert包:
import static org.testng.Assert.*;
assertTrue:判断是否为True。
assertFalse:判断是否为false。
assertSame:判断引用地址是否相同。
assertNotSame:判断引用地址是否不相同。
assertNull:判断是否为null。
assertNotNull:判断是否不为null。
assertEquals:判断是否相等,Object类型的对象需要实现haseCode及equals方法。
assertNotEquals:判断是否不相等。
assertEqualsNoOrder:判断忽略顺序是否相等。