TestNG介绍
testng意为test next generation,它是一套开源测试框架,同时也是一个受JUnit和NUnit启发的测试框架,但引入了一些新的功能,使其更强大、更易于使用,主要有以下特性:
- 支持注解 ,如 @test @BeforeMethod
- 支持多线程执行case
- 支持综合类测试(例如,默认情况下,不用创建一个新的测试每个测试方法的类的实例)
- 独立的编译时测试代码和运行时配置/数据信息
- 灵活的运行时配置主要介绍“测试组”。
- 当编译测试,只要要求TestNG运行所有的“前端”的测试,或“快”,“慢”,“数据库”等支持依赖测试方法,并行测试,负载测试,局部故障
- 灵活的插件API
详细使用说明请参考官方链接:https://testng.org/doc/index.html
TestNG使用
只要在maven项目中引入一下依赖即可:
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.10</version>
<scope>test</scope>
</dependency>
也可以直接从官网 http://testng.org/doc/download.html 下载当前版本的TestNG,将下载的Testng-6.jar直接添加到项目路径中去。
使用示例
创建一个待测试类:
public class HelloWorld {
public String hello() {
return "hello everyone";
}
}
TestHelloWorld.java 代码如下 :
import org.testng.Assert;
import org.testng.annotations.Test;
public class TestHelloWorld {
@Test()
public void testEmailGenerator() {
HelloWorld obj = new HelloWorld ();
String str= obj.hello();
Assert.assertNotNull(str);
Assert.assertEquals(str, "hello everyone");
}
}
这便创建一个简单的TestNG测试用例,此测试确保HelloWorld.hello()始终返回"hello everyone"。
常用注解的使用示例
public class CaseDemo {
@Test
public void test1() {
assertEquals("a","b");
}
@Test
public void test2() {
assertEquals("a","a");
}
@BeforeMethod
public void beforeMethod(){
System.out.println("beforeMethod1");
}
@AfterMethod
public void afterMethod() {
System.out.println("afterMethod1");
}
@BeforeClass
public void beforeClass() {
System.out.println("BeforeClass1");
}
@AfterClass
public void afterClass(){
System.out.println("afterClass1");
}
@BeforeTest
public void beforeTest() {
System.out.println("beforeTest1");
}
@AfterTest
public void afterTest() {
System.out.println("afterTest1");
}
@BeforeSuite
public void beforeSuite() {
System.out.println("beforeSuite1");
}
@AfterSuite
public void afterSuite() {
System.out.println("afterSuite1");
}
}
依赖的使用示例
TestNG的依赖主要包括方法的依赖和组的依赖。dependsOnMethods在被依赖的方法运行完成之后运行当前方法,如果依赖方法测试不通过,那么当前方法也不会继续运行了,依赖的方法可以有多个。dependsOnGroups和依赖方法类似,在被依赖组运行完成之后运行当前组,如果依赖组中的方法没有测试能过,那么当前的方法也不会继续运行了,依赖组可以有多个。
例如:
public class DependencyDemo {
@Test
public void test1() {
assertTrue(true);
}
@Test
public void test2() {
assertTrue(false);
}
@Test(dependsOnMethods={"test1","test2"})
public void test3() {
assertTrue(true);
}
}
用例并发测试
TestNG有多种并发方式支持,主要包括:方法的并发,class级的并发,和test级的并发,它们的区别如下:
-
tests级别:不同test tag下的用例可以在不同的线程执行,相同test tag下的用例只能在同一个线程中执行。
-
classs级别:不同class tag下的用例可以在不同的线程执行,相同class tag下的用例只能在同一个线程中执行。
-
methods级别:所有用例都可以在不同的线程去执行。
实践中,很多时候我们在测试类中通过dependOnMethods/dependOnGroups方式,给很多测试方法的执行添加了依赖,以达到期望的执行顺序。TestNG能在多线程情况下依然遵循既定的用例执行顺序去执行。
有些时候,我们需要对一个测试用例,比如一个http接口,执行并发测试,即一个接口的反复调用。在 @Test标签中指定threadPoolSize和invocationCount可以实现该需求。
例如:
@Test(threadPoolSize=5,invocationCount=10)
其中threadPoolSize表明用于调用该方法的线程池容量,该例就是同时起5个线程并行执行该方法;invocationCount表示该方法总计需要被执行的次数。该例子中5个线程同时执行,当总计执行次数达到10次时,停止。
实例如下:
写两个类 ThreadCase1和ThreadCase1
public class ThreadCase1 {
@Test
public void m1() throws InterruptedException {
Thread.sleep(1000);
System.out.println("*****"+Thread.currentThread().getId());
assertTrue(true);
}
@Test
public void m2() throws InterruptedException {
Thread.sleep(1000);
System.out.println(""+Thread.currentThread().getId());
assertTrue(false);
}
@Test
public void m3() throws InterruptedException {
Thread.sleep(1000);
System.out.println(""+Thread.currentThread().getId());
assertTrue(true);
}
}
public class ThreadCase2 {
@Test
public void m1() throws InterruptedException {
Thread.sleep(1000);
System.out.println(""+Thread.currentThread().getId());
assertTrue(true);
}
@Test
public void m2() throws InterruptedException {
Thread.sleep(1000);
System.out.println(""+Thread.currentThread().getId());
assertTrue(false);
}
@Test
public void m3() throws InterruptedException {
Thread.sleep(1000);
System.out.println(""+Thread.currentThread().getId());
assertTrue(true);
}
}
TestNG相关注解
注解 | 描述 |
---|---|
@BeforeSuite | 在该套件的所有测试都运行在注释的方法之前,仅运行一次 |
@AfterSuite | 在该套件的所有测试都运行在注释方法之后,仅运行一次 |
@BeforeClass | 在调用当前类的第一个测试方法之前运行,注释方法仅运行一次 |
@AfterClass | 在调用当前类的第一个测试方法之后运行,注释方法仅运行一次 |
@BeforeTest | 注释的方法将在属于test标签内的类的所有测试方法运行之前运行 |
@AfterTest | 注释的方法将在属于test标签内的类的所有测试方法运行之后运行 |
@BeforeGroups | 配置方法将在之前运行组列表。 此方法保证在调用属于这些组中的任何一个的第一个测试方法之前不久运行 |
@AfterGroups | 此配置方法将在之后运行组列表。该方法保证在调用属于任何这些组的最后一个测试方法之后不久运行 |
@BeforeMethod | 注释方法将在每个测试方法之前运行 |
@AfterMethod | 注释方法将在每个测试方法之后运行 |
@DataProvider | 标记一种方法来提供测试方法的数据。 注释方法必须返回一个Object [] [] ,其中每个Object [] 可以被分配给测试方法的参数列表。 要从该DataProvider 接收数据的@Test 方法需要使用与此注释名称相等的dataProvider 名称 |
@Factory | 将一个方法标记为工厂,返回TestNG 将被用作测试类的对象。 该方法必须返回Object [] |
@Listeners | 定义测试类上的侦听器 |
@Parameters | 描述如何将参数传递给@Test 方法 |
@Test | 将类或方法标记为测试的一部分,此标记若放在类上,则该类所有公共方法都将被作为测试方法 |