TestNG是一个流行的测试框架,是JUnit的扩展,它支持更丰富的测试场景和功能。TestNG的核心思想是测试用例的优先级和依赖关系,这使得测试套件的组织和执行更加灵活和高效。以下是TestNG的一些主要特点:
1.支持多种测试场景:TestNG支持各种测试类型,包括单元测试、集成测试、功能测试、端到端测试等,可以满足不同测试场景的需求。
2.注解丰富:TestNG提供了多种注解来标记测试方法、测试套件、测试类等,可以方便地组织和执行测试用例。
3.支持测试用例分组:TestNG允许测试用例分组,以便按组运行测试用例,这对于大规模测试套件的组织和管理非常有帮助。
4.支持数据驱动测试:TestNG支持数据驱动测试,可以使用不同的数据集执行同一个测试用例,以验证测试用例的健壮性和正确性。
5.支持依赖关系:TestNG允许测试用例之间建立依赖关系,以确保测试用例的执行顺序和正确性。
6.多线程执行测试用例:TestNG可以在多个线程中并发执行测试用例,以加速测试执行速度。
7.丰富的报告功能:TestNG提供了丰富的测试报告功能,可以生成HTML、XML等格式的测试报告,以便测试结果的分析和展示。
1.可以在TestNG官方网站上手动下载最新版本的TestNG库。下载完成后,将jar文件添加到你的项目的classpath中。
https://testng.org/doc/download.html
2.也可以直接添加maven文件(推荐这个)
将以下依赖项添加至 pom.xml 文件中
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>7.4.0</version>
<scope>test</scope>
</dependency>
3.添加完成后,我们先来了解一下用例管理
在testng中,用例的标注是@Test来说明的,带有此注解的方法或者类将被TestNG识别并运行
4.在testng中,用例执行的前后可以通过以下方式来实现,只需在方法和类前加上对应@即可:
@BeforeSuit / @AfterSuit--------------------带注释的方法将在该套件
中的所有测试运行之前/后运行
@BeforeTest / @AfterTest--------------------带注释的方法将在运行属
于标记内的类的任何测试方法之前/后运行
@BeforeClass / AfterClass -------------------带注释的方法将在调用
当前类中的第一个测试方法之前/后运行
@BeforeMethod / @AfterMethod ----------带注释的方法将在每个测试
方法之前/后运行
以下示例创建了一个名为 SimpleTest 的测试类,其中包含一个名为 test() 的测试方法,使用 @Test 注解来标记该方法是一个测试方法。在测试方法内部,输出一条字符串信息
import org.testng.annotations.Test;
public class SimpleTest {
@Test
public void test() {
System.out.println("This is a TestNG test");
}
}
现在要在test执行前后运行用例,如下:@BeforeTest注解标记的setUp()方法会在所有@Test方法运行之前执行,@AfterTest注解标记的tearDown()方法会在所有@Test方法运行之后执行。
import org.testng.annotations.*;
public class MyTest {
@BeforeTest
public void setUp() {
// 在所有测试方法运行之前执行的代码
System.out.println("执行@BeforeTest注解的方法");
}
@Test
public void test() {
// 测试方法1
System.out.println("执行测试方法1");
}
@AfterTest
public void tearDown() {
// 在所有测试方法运行之后执行的代码
System.out.println("执行@AfterTest注解的方法");
}
}
传参我们可以通过使用@Parameters来实现,在这里我们在测试用例方法中需要设置对应的参数去接收,如下:
注意如果有多个参数会按我们@Parameters中设置的顺序进行传参
import org.testng.annotations.Test;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Parameters;
public class MyTest {
@Test
@Parameters{"a", "b", "c"})
public void beforeTest(int a, int b, int c) {
int result = a + b;
Assert.assertEquals(result, c); //断言result=c
}
}
@Ignore: 跳过测试用例,被注解的测试方法不会被执行。
@Test(enabled = false): 与 @Ignore 类似,将测试用例标记为禁用状态,
被注解的测试方法不会被执行。
Assert.assertXXX(): 断言方法,用于判断测试结果是否符合预期。
//常用断言
1.assertEquals(expected, actual): 验证预期结果和实际结果是否相等。
2.assertNotEquals(expected, actual): 验证预期结果和实际结果是否不相等。
3.assertTrue(condition): 验证条件是否为 true。
4.assertFalse(condition): 验证条件是否为 false。
5.assertNull(object): 验证对象是否为 null。
6.assertNotNull(object): 验证对象是否不为 null。
7.assertSame(expected, actual): 验证预期结果和实际结果是否是同一个对象。
8.assertNotSame(expected, actual): 验证预期结果和实际结果是否不是同一个对象。
9.assertArrayEquals(expectedArray, actualArray): 验证预期结果和实际结果是否是相等的数组。
Reporter.log()是TestNG中的一个方法,用于向测试报告中添加自定义的日志信息。该方法接受一个String类型的参数,表示要添加的日志信息
import org.testng.Reporter;
import org.testng.annotations.Test;
public class MyTest {
@Test
public void myTestMethod() {
// 添加日志信息
Reporter.log("这是一个自定义的日志信息");
}
}
在测试报告中,会看到类似如下的日志信息:
这是一个自定义的日志信息
Reporter.log()方法还可以接受一个boolean类型的参数,表示是否将日志信息显示在测试报告中。如果参数为true,则显示在测试报告中;如果参数为false,则不显示在测试报告中。默认情况下,日志信息会显示在测试报告中
import org.testng.Reporter;
import org.testng.annotations.Test;
public class MyTest {
@Test
public void myTestMethod() {
// 添加日志信息,并将日志信息显示在测试报告中
Reporter.log("这是一个自定义的日志信息", true);
}
}
在 TestNG 中实现多线程有两种方式:通过线程池执行、通过 data provider 参数化执行。
5.1.线程池执行方式
通过设置 @Test 注解的 threadPoolSize 和 invocationCount 参数可以实现多线程执行,其中:
threadPoolSize 表示线程池大小,即并发执行的线程数
invocationCount 表示测试方法被调用的次数。
如下:
@Test(threadPoolSize = 10, invocationCount = 100)
public void test() {
// 测试方法
}
以上代码会创建一个大小为 10 的线程池,并重复执行 test() 方法 10次,每次由线程池中的一个线程执行。
5.2.data provider 参数化执行方式
通过 data provider 提供参数来实现多线程执行,data provider 可以提供多组参数,每组参数作为一个独立的测试执行。同时通过设置 @Test 注解的 threadPoolSize 和 dataProviderThreadCount 参数,可以实现并发执行多组参数。
以下代码会使用 dataprovider 方法 dataProviderMethod() 提供的三组参数 {1, 2}、{3, 4}、{5, 6},通过 5 个线程池并发执行,每个线程执行 3 次,即总共执行 15 次测试。
@Test(dataProvider = "provider", threadPoolSize = 5, dataProviderThreadCount = 10)
//dataProviderThreadCount为最大执行次数
public void test(int a, int b) {
// 测试方法
}
@DataProvider(name = "provider")
public Object[][] dataProviderMethod() {
return new Object[][] { { 1, 2 }, { 3, 4 }, { 5, 6 } };
}
之前只使用过python的同学可以了解一下