TestNG是一个测试框架,可以简化广泛的测试需求。
- 建立工程
首先我们在idea中应该新建一个project,并选择“maven”,点击下一步(如下图)
填写groupId(一般为包名)和ArtifactId(一般为工程名)
2. 添加依赖
创建成功后:我们需要在pom中添加testng依赖,然后点击自动更新maven
<dependencies>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.9.8</version>
<scope>test</scope>
</dependency>
</dependencies>
- 代码编写
下面是一个简单的例子:
import org.testng.annotations.Test;
public class Test1 {
@Test
public void test1()
{
System.out.println(“hello testng”);
}
}
- 运行结果
输出如下:我们可以看到用TestNG方式执行,输出内容相对全一些,会显示执行了多少个,失败了多少个,通过了多少个
TestNG相关注释
注释
注释介绍
@BeforeSuite
在此套件中的所有测试运行之前,将运行带注释的方法。
@AfterSuite
在此套件中的所有测试运行后,将运行带注释的方法。
@BeforeTest
在运行属于<test>标记内的类的任何测试方法之前,将运行带注释的方法。
@AfterTest
在运行了属于<test>标记内的类的所有测试方法之后,将运行带注释的方法。
@BeforeClass
在调用当前类中的第一个测试方法之前,将运行带注释的方法。
@AfterClass
在运行当前类中的所有测试方法之后,将运行带注释的方法。
@BeforeMethod
每次调用@Test方法之前运行,即执行用例之前进行的初始化
@AfterMethod
每次调用@Test方法之后运行
@DataProvider
标志着一个方法,提供数据的一个测试方法。注解的方法必须返回一个Object[] [],其中每个对象[]的测试方法的参数列表中可以分配。
该@Test 方法,希望从这个DataProvider的接收数据,需要使用一个dataProvider名称等于这个注解的名字。
@invocationCount
测试用例被调用执行的次数
@threadPoolSize
开启的线程数
TestNG的数据驱动
什么是数据驱动:指的是一个脚本固定的情况下,用数据来控制该脚本是否运行,以及运行的次数,和每次运行时对应的参数
实现方式:@DataProvider
@DataProvider的简单使用(该注释需要定义属性name):
@Test测试用例,属性dataProvider需要指定对应的数据提供者名称
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
public class Test1 {
@DataProvider(name="testcase")
public Object[][] dp()
{
return new Object[][]{
{"小红","90"},
{"小明","80"}
};
}
@Test(dataProvider = "testcase")
public void test1(String n1,String n2)
{
System.out.println(n1 + " " + n2);
}
}
这样我们的输出结果如下图:可以看到testcase被执行了2次。
延迟数据提供者:
延迟初始化指的是:当我们获取了一个数据,对他执行测试方法,然后就废弃这个数据对象,在测试下一个对象。
延迟初始化的思想其实指的是当你真正需要一个对象时才创建它,而不是提前去创建它
实现延迟初始化,TestNg允许我们从数据提供者返回一个Iterator对象,而不是一个二维对象数组。
举个简单的例子:
public interface Iterator<E> {
boolean hasNext();
E next();
}
import java.util.Iterator;
public class AccoutIterator implements Iterator{
private int index = 0;
static private final int MAX = 4;
@Override
public boolean hasNext() {
return index<MAX;
}
@Override
public Object next() {
return new Object[]{
"Hello!"+(index++)
};
}
public void remove() {
throw new UnsupportedOperationException("remove");
}
}
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import java.util.Iterator;
public class Test1 {
@DataProvider(name = "iterator")
public Iterator<Object[]> iteratorDataProvider(){
return new AccoutIterator();
}
@Test(dataProvider = "iterator")
public void test1(String name)
{
System.out.println(name);
}
}
看看我们的输出结果:
忽略测试
有时候测试用例还没准备好, 可以给测试用例加上@Test(enable = false), 来禁用此测试用例
@Test(enabled = false)
public void test1()
{
System.out.println("ignore");
}
依赖测试
如下图,我们test1的运行依赖于test2,所以如果我们只运行test1的话,会先运行依赖的测试用例,在运行自己
import org.testng.annotations.Test;
public class Test1 {
@Test(dependsOnMethods = {"test2"})
public void test1()
{
System.out.println("我依赖于test2");
}
@Test
public void test2()
{
System.out.println("test2");
}
}
运行结果如下图所示:
TestNG官方文档:https://testng.org/doc/documentation-main.html#parameters-testng-xml
TestNG官方文档推荐一个入门级别的TestNG视频教程:http://www.iqiyi.com/w_19rth5swkd.html