是一个测试框架。
1. 特点:
1)注解
2)TestNG 使用Java和面向对象的功能
3)支持综合类测试(例如,默认情况下,不用创建一个新的测试每个测试方法的类的实例)
4)独立的编译时测试代码和运行时配置/数据信息
5)灵活的运行时配置
6)主要介绍“测试组”。当编译测试,只要要求TestNG运行所有的“前端”的测试,或“快”,“慢”,“数据库”等
7)支持依赖测试方法,并行测试,负载测试,局部故障
8)灵活的插件API
9)支持多线程测试
2. 注解 直接在test方法前进行
@BeforeSuite
- 对于套件测试,在此套件中的所有测试运行之前运行。@AfterSuite
- 对于套件测试,在此套件中的所有测试运行之后运行。@BeforeTest
- 对于套件测试,在运行属于<test>
标签内的类的任何测试方法之前运行。@AfterTest
- 对于套件测试,在运行属于<test>
标签内的类的所有测试方法都已运行之后运行。@BeforeGroups
:在调用属于该组的第一个测试方法之前运行。@AfterGroups
:在调用属于组的最后一个测试方法之后运行。@BeforeClass
- 在当前类的第一个测试方法之前运行。@AfterClass
- 运行当前类中的所有测试方法之后都运行。@BeforeMethod
- 在每个测试方法之前运行。@AfterMethod
- 在每个测试方法之后运行。
package com.yiibai;
import org.testng.annotations.Test;
public class TestDBConnection {
@Test
public void runOtherTest1() {
System.out.println("@Test - runOtherTest1");
}
@Test
public void runOtherTest2() {
System.out.println("@Test - runOtherTest2");
}
}
3. 异常--预期的异常
@Test(expectedExceptions = ArithmeticException.class)
4. 忽略该测试方法---默认为true
@Test(enabled = false)
5. 超时测试---超过时间未完成视为失败
@Test(timeOut = 5000)
6. 分组测试---将方法分组
1). 方法的分组
@Test(groups = "GroupA")
public void testConnectOracle() {
System.out.println("testConnectOracle()");
}
关于分组的注解使用方法:
@BeforeGroups("GroupA")
public void setupDB() {
System.out.println("setupDB()");
}
2)类的分组--该类的每个公共方法都属于分组
package com.yiibai;
import org.testng.annotations.Test;
@Test(groups = "GroupB")
public class TestSelenium {
public void runSelenium() {
System.out.println("runSelenium()");
}
public void runSelenium1() {
System.out.println("runSelenium()1");
}
}
3)每个方法可以属于多个组
7. 套件测试 suite 在xml文件中配置
测试套件是用于测试软件程序的行为或一组行为的测试用例的集合。 在TestNG中,我们无法在测试源代码中定义一个套件,但它可以由一个XML文件表示,因为套件是执行的功能。 它还允许灵活配置要运行的测试。 套件可以包含一个或多个测试,并由<suite>
标记定义。
<?xml version="1.0" encoding="UTF-8"?>
<suite name="TestAll">
<test name="order">
<classes>
<class name="com.yiibai.TestConfig" />
<class name="com.yiibai.TestOrder" />
</classes>
</test>
</suite>
1)执行包的名称
<suite name="TestAll">
<test name="order">
<packages>
<package name="com.yiibai.*" />
</packages>
</test>
</suite>
2)指定包含或排除方法
<include> 包括
<exclude> 排除
<?xml version="1.0" encoding="UTF-8"?>
<suite name="TestAll">
<test name="order">
<classes>
<class name="com.yiibai.TestConfig" />
<class name="com.yiibai.TestOrder">
<methods>
<include name="testMakeOrder" />
<exclude name="testUpdateOrder" />
</methods>
</class>
</classes>
</test>
</suite>
8. 依赖测试
1)依赖于方法
该方法依赖于method1,method1成功则执行,失败则跳过
@Test(dependsOnMethods = { "method1" })
2)依赖于组
@Test(dependsOnGroups={"deploy","db"})
9. 参数提供
1)XML提供参数
2)通过@DataProvider
该例子是传递一个数,还可以传递map
package com.yiibai;
import org.testng.Assert;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
public class TestParameterDataProvider {
@Test(dataProvider = "provideNumbers")
public void test(int number, int expected) {
Assert.assertEquals(number + 10, expected);
}
@DataProvider(name = "provideNumbers")
public Object[][] provideData() {
return new Object[][] { { 10, 20 }, { 100, 110 }, { 200, 210 } };
}
}
3)@DataProvide + 方法
根据测试方法名称不同选择传递不同的参数
4)@DataProvide + ITestContextpackage com.yiibai; import java.lang.reflect.Method; import org.testng.Assert; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; public class TestParameterDataProvider3 { @Test(dataProvider = "dataProvider") public void test1(int number, int expected) { Assert.assertEquals(number, expected); } @Test(dataProvider = "dataProvider") public void test2(String email, String expected) { Assert.assertEquals(email, expected); } @DataProvider(name = "dataProvider") public Object[][] provideData(Method method) { Object[][] result = null; if (method.getName().equals("test1")) { result = new Object[][] { { 1, 1 }, { 200, 200 } }; } else if (method.getName().equals("test2")) { result = new Object[][] { { "test@gmail.com", "test@gmail.com" }, { "test@yahoo.com", "test@yahoo.com" } }; } return result; } }
在TestNG中,我们可以使用
org.testng.ITestContext
来确定调用当前测试方法的运行时参数