• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

TestNG和Junit5测试框架梳理

武飞扬头像
马丁•路德•王
帮助1

一、testNG

1. testNG优势

  1.  
    注解驱动: TestNG 使用注解来标识测试方法、测试类和配置方法,使得测试更具可读性。
  2.  
    并行执行: TestNG 支持多线程并行执行测试,可以加速测试套件的执行。
  3.  
    丰富的配置: 可以通过 XML 配置文件来定义测试套件的执行顺序、依赖关系等。
  4.  
    分组测试: 可以将测试方法分组,实现对特定测试分组的执行。
  5.  
    参数化测试: 可以使用 @Parameters 和@ DataProvider注解实现参数化测试
  6.  
    依赖管理: 可以通过 dependsOnMethods 或 dependsOnGroups 设置测试方法之间的依赖关系。
  7.  
    断言灵活: TestNG 提供了丰富的断言方法,用于验证测试结果。

2. testNG常用注解

  1.  
    @Test:用于标识测试方法,执行单元测试。
  2.  
    @BeforeSuite:在测试套件之前执行。
  3.  
    @AfterSuite:在测试套件之后执行。
  4.  
    @BeforeTest:在测试类之前执行。
  5.  
    @AfterTest:在测试类之后执行。
  6.  
    @BeforeClass:在测试类中的所有测试方法之前执行。
  7.  
    @AfterClass:在测试类中的所有测试方法之后执行。
  8.  
    @BeforeMethod:在每个测试方法之前执行。
  9.  
    @AfterMethod:在每个测试方法之后执行。
  10.  
    @DataProvider:用于提供测试数据。
  11.  
    @Parameters:用于参数化测试。
  12.  
    @dependsOnMethods:设置测试方法的依赖关系。
  1.  
    package AI.Test.testNG;
  2.  
     
  3.  
    import org.testng.annotations.*;
  4.  
     
  5.  
    public class TestNGCheck {
  6.  
     
  7.  
    @BeforeSuite
  8.  
    public void beforeSuite(){
  9.  
    System.out.println("beforeSuite");
  10.  
    }
  11.  
     
  12.  
    @BeforeTest
  13.  
    public void beforeTest() {
  14.  
    System.out.println("Before Test");
  15.  
    }
  16.  
     
  17.  
    @BeforeClass
  18.  
    public void beforeClass() {
  19.  
    System.out.println("Before Class");
  20.  
    }
  21.  
     
  22.  
    @BeforeMethod
  23.  
    public void beforeMethod() {
  24.  
    System.out.println("Before Method");
  25.  
    }
  26.  
     
  27.  
    @Test(groups="Performance")
  28.  
    public void testMethod1() {
  29.  
    System.out.println("Test Method 1");
  30.  
    }
  31.  
     
  32.  
    @AfterMethod
  33.  
    public void afterMethod() {
  34.  
    System.out.println("After Method");
  35.  
    }
  36.  
     
  37.  
    @AfterClass
  38.  
    public void afterClass() {
  39.  
    System.out.println("After Class");
  40.  
    }
  41.  
     
  42.  
    @AfterTest
  43.  
    public void afterTest() {
  44.  
    System.out.println("After Test");
  45.  
    }
  46.  
     
  47.  
    @AfterSuite
  48.  
    public void afterSuite() {
  49.  
    System.out.println("After Suite");
  50.  
    }
  51.  
     
  52.  
     
  53.  
    }
学新通

3. testNG中@Test有哪些参数

  1.  
    1. 常用的:
  2.  
    groups: 用于将测试方法分组,可以在 XML 配置中选择性地执行指定组的测试。
  3.  
    timeOut: 指定方法的超时时间,单位为毫秒。
  4.  
    alwaysRun: 如果设置为 true,则无论依赖的方法是否失败,当前方法都会执行。
  5.  
    dependsOnMethods: 指定测试方法的依赖关系,被依赖的方法会在当前方法之前执行。
  6.  
    enabled: 控制测试方法是否启用,设置为 false 则禁用该方法。
  7.  
    description: 提供关于测试方法的简要描述。
  8.  
    invocationCount: 指定测试方法被调用的次数。
  9.  
     
  10.  
     
  11.  
    2. 数据驱动,需要结合@DataProvider注解对应获取参数的方法:
  12.  
    dataProvider: 指定使用哪个数据提供者来提供测试数据。
  13.  
    dataProviderClass: 指定数据提供者所在的类。
  14.  
     
  15.  
     
  16.  
    3.并发:
  17.  
    invocationCount: 指定测试方法被调用的次数。
  18.  
    threadPoolSize: 指定线程池的大小,用于并行执行测试方法。
  19.  
    dataProviderThreadCount: 指定数据提供者线程的数量。
  20.  
     
学新通

举例:

  1.  
    @Test(groups="Performance")
  2.  
    public void testMethod1() {
  3.  
    System.out.println("Test Method 1");
  4.  
    }
  5.  
     
  6.  
    @Test(priority=1)
  7.  
    public void testMethod2() {
  8.  
    System.out.println("Test Method 2");
  9.  
    }
  10.  
     
  11.  
    @Test(dependsOnMethods = "testMethod4", alwaysRun = false)
  12.  
    public void testMethod3(){
  13.  
    System.out.println("Test Method 3");
  14.  
    }
  15.  
     
  16.  
    @Test(timeOut = 3000)
  17.  
    public void testMethod4() throws InterruptedException {
  18.  
    Thread.sleep(4000);
  19.  
    System.out.println("Test Method 4");
  20.  
    }
  21.  
     
  22.  
    @Test(enabled = false, description = "用于测试enable注解")
  23.  
    public void testMethod5() {
  24.  
    System.out.println("Test Method 5");
  25.  
    }
学新通

4. 在 TestNG 中实现参数化测试

以Yaml文件为例

创建一个Yaml文件testdata.yaml

  1.  
    testdata:
  2.  
    - parameters: [2, 3, 5]
  3.  
    - parameters: [10, 20, 30]

获取测试数据及使用

  1.  
    import org.testng.annotations.DataProvider;
  2.  
    import org.testng.annotations.Test;
  3.  
    import org.yaml.snakeyaml.Yaml;
  4.  
     
  5.  
    import java.io.InputStream;
  6.  
    import java.util.ArrayList;
  7.  
    import java.util.List;
  8.  
    import java.util.Map;
  9.  
     
  10.  
    public class ParameterizedTest {
  11.  
     
  12.  
    @DataProvider(name = "testData")
  13.  
    public Object[][] getYamlData() {
  14.  
    List<Object[]> testData = new ArrayList<>();
  15.  
     
  16.  
    Yaml yaml = new Yaml();
  17.  
    InputStream inputStream = getClass().getClassLoader().getResourceAsStream("testdata.yaml");
  18.  
    Map<String, List<List<Integer>>> dataMap = yaml.load(inputStream);
  19.  
     
  20.  
    List<List<Integer>> parametersList = dataMap.get("testdata");
  21.  
    for (List<Integer> parameters : parametersList) {
  22.  
    testData.add(parameters.toArray());
  23.  
    }
  24.  
     
  25.  
    return testData.toArray(new Object[testData.size()][]);
  26.  
    }
  27.  
     
  28.  
    @Test(dataProvider = "testData")
  29.  
    public void testParameterized(int param1, int param2, int param3) {
  30.  
    System.out.println("Test with parameters: " param1 ", " param2 ", " param3);
  31.  
    // 执行测试逻辑,使用参数化数据进行测试
  32.  
    }
  33.  
    }
学新通

5. 执行顺序

  1.  
    TestNG 默认情况下会按照测试方法的名称升序执行。
  2.  
    可以通过设置 priority 属性来指定执行顺序。
  3.  
    也可以使用dependsOnMethods

6. testNG断言

  1.  
    assertEquals(expected, actual):
  2.  
    验证两个值是否相等。如果不相等,会抛出 AssertionError。
  3.  
     
  4.  
    assertNotEquals(expected, actual):
  5.  
    验证两个值是否不相等。如果相等,会抛出 AssertionError。
  6.  
     
  7.  
    assertTrue(condition):
  8.  
    验证给定的条件是否为真。如果条件为假,会抛出 AssertionError。
  9.  
     
  10.  
    assertFalse(condition):
  11.  
    验证给定的条件是否为假。如果条件为真,会抛出 AssertionError。
  12.  
     
  13.  
    assertNull(object):
  14.  
    验证给定的对象是否为 null。如果对象不为 null,会抛出 AssertionError。
  15.  
     
  16.  
    assertNotNull(object):
  17.  
    验证给定的对象是否不为 null。如果对象为 null,会抛出 AssertionError。
  18.  
     
  19.  
    assertSame(expected, actual):
  20.  
    验证两个引用是否指向同一个对象。如果不指向同一个对象,会抛出 AssertionError。
  21.  
     
  22.  
    assertNotSame(expected, actual):
  23.  
    验证两个引用是否指向不同的对象。如果指向同一个对象,会抛出 AssertionError。
学新通

二、Junit5

1. junit5的优势

  1.  
    现代化的设计: JUnit 5 的架构更加模块化和现代化,采用了模块化体系结构,使得集成和扩展更加容易。它引入了 Jupiter(新的测试引擎)和 Vintage(支持 JUnit 4)两个模块,具有更好的灵活性。
  2.  
     
  3.  
    Lambda 表达式支持: JUnit 5 充分利用了 Java 8 的 Lambda 表达式特性,使测试代码更加简洁。TestNG 也支持 Lambda 表达式,但 JUnit 5 的设计更加贴合现代 Java 特性。
  4.  
     
  5.  
    参数化测试: JUnit 5 提供了内置的参数化测试功能,使用 @ParameterizedTest 注解,可以轻松地对测试方法使用不同的参数运行。
  6.  
     
  7.  
    动态测试: JUnit 5 引入了动态测试,允许在运行时生成和执行测试。使用 @TestFactory 注解,可以动态生成测试方法,以适应更加灵活的测试需求。
  8.  
     
  9.  
    扩展机制: JUnit 5 的扩展机制更加强大和灵活,使用 @ExtendWith 注解,可以轻松应用自定义扩展,甚至可以自定义扩展来修改测试运行时的行为。
  10.  
     
  11.  
    条件测试: JUnit 5 允许根据条件决定是否执行测试方法,使用 @EnabledOnOs@DisabledIf 等注解,可以根据操作系统、环境变量等条件来控制测试执行。
  12.  
     
  13.  
    并行执行: TestNG 在并行执行方面有很强的功能,但 JUnit 5 也在逐步增强并行执行的支持,对于简单的并行需求,JUnit 5 也可以胜任。
  14.  
     
  15.  
    灵活性: JUnit 5 允许更多的自定义配置,使得测试执行的控制更加灵活,可以根据不同的项目需求进行调整。
学新通

2. 常用注解

  1.  
    @Test: 用于标记测试方法。
  2.  
     
  3.  
    @DisplayName: 为测试方法或测试类指定一个可读的名称。
  4.  
     
  5.  
    @BeforeEach: 在每个测试方法之前执行的方法。
  6.  
     
  7.  
    @AfterEach: 在每个测试方法之后执行的方法。
  8.  
     
  9.  
    @BeforeAll: 在所有测试方法之前执行的方法,必须是静态方法。
  10.  
     
  11.  
    @AfterAll: 在所有测试方法之后执行的方法,必须是静态方法。
  12.  
     
  13.  
    @Disabled: 标记测试方法或测试类为禁用状态。
  14.  
     
  15.  
    @ParameterizedTest: 用于参数化测试的注解。
  16.  
     
  17.  
    @RepeatedTest: 用于指定重复执行测试方法的次数。
  18.  
     
  19.  
    @Timeout: 用于设置测试方法执行的最大时间。时间是s
  20.  
     
  21.  
    @Tag: 为测试方法添加标签,用于分组和过滤测试。
  22.  
     
  23.  
    @Nested: 用于嵌套测试类。
  24.  
     
  25.  
    @TestFactory: 用于动态测试,返回动态生成的测试方法。
学新通
  1.  
    package AI.Test.testNG;
  2.  
     
  3.  
    import org.junit.jupiter.api.*;
  4.  
     
  5.  
    public class Junit5TestCheck {
  6.  
     
  7.  
    @BeforeAll
  8.  
    static void beforeAll() throws InterruptedException {
  9.  
    System.out.println("Before All");
  10.  
    Thread.sleep(3000);
  11.  
    }
  12.  
     
  13.  
    @BeforeEach
  14.  
    void beforeEach(){
  15.  
    System.out.println("BeforeEach");
  16.  
    }
  17.  
     
  18.  
    @Test
  19.  
    @DisplayName("Junit5TestCheck test1")
  20.  
    void test1(){
  21.  
    System.out.println("test1");
  22.  
    }
  23.  
     
  24.  
    @Test
  25.  
    @RepeatedTest(2)
  26.  
    @DisplayName("Junit5TestCheck test2")
  27.  
    void test2(){
  28.  
    System.out.println("test2");
  29.  
    }
  30.  
     
  31.  
    @Test
  32.  
    @Disabled
  33.  
    @DisplayName("Junit5TestCheck test3")
  34.  
    void test3(){
  35.  
    System.out.println("test3");
  36.  
    }
  37.  
     
  38.  
    @Test
  39.  
    @Timeout(3)
  40.  
    void test4() throws InterruptedException {
  41.  
    Thread.sleep(4);
  42.  
    System.out.println("test4");
  43.  
    }
  44.  
     
  45.  
     
  46.  
    @AfterEach
  47.  
    void afterEach(){
  48.  
    System.out.println("AfterEach");
  49.  
    }
  50.  
     
  51.  
    @AfterAll
  52.  
    static void afterAll(){
  53.  
    System.out.println("After All");
  54.  
    }
  55.  
     
  56.  
    }
学新通

3. TestFactory使用示例

TestFactory其实就是参数化执行同一条用例

通常情况下,我们会使用 @ParameterizedTest 注解来参数化执行不同的测试用例,每次测试会使用不同的参数进行运行。而 @TestFactory 则是一种更为动态和灵活的方式,它允许你在运行时生成测试用例。

  1.  
    import org.junit.jupiter.api.TestFactory;
  2.  
    import org.junit.jupiter.api.DynamicTest;
  3.  
    import org.junit.jupiter.api.Test;
  4.  
     
  5.  
    import java.util.stream.Stream;
  6.  
     
  7.  
    import static org.junit.jupiter.api.Assertions.assertEquals;
  8.  
    import static org.junit.jupiter.api.DynamicTest.dynamicTest;
  9.  
     
  10.  
    public class DynamicTestExample {
  11.  
     
  12.  
    @TestFactory
  13.  
    Stream<DynamicTest> dynamicTestFactory() {
  14.  
    return Stream.of(
  15.  
    dynamicTest("Test 1", () -> assertEquals(2, add(1, 1))),
  16.  
    dynamicTest("Test 2", () -> assertEquals(4, add(2, 2))),
  17.  
    dynamicTest("Test 3", () -> assertEquals(6, add(3, 3)))
  18.  
    );
  19.  
    }
  20.  
     
  21.  
    int add(int a, int b) {
  22.  
    return a b;
  23.  
    }
  24.  
    }
学新通

4. ParameterizedTest

  1.  
    import org.junit.jupiter.params.ParameterizedTest;
  2.  
    import org.junit.jupiter.params.provider.CsvSource;
  3.  
    import static org.junit.jupiter.api.Assertions.assertEquals;
  4.  
     
  5.  
    public class ParameterizedTestExample {
  6.  
     
  7.  
    @ParameterizedTest
  8.  
    @CsvSource({"1, 2, 3", "0, 0, 0", "-1, -2, -3"})
  9.  
    void testAddition(int a, int b, int result) {
  10.  
    assertEquals(result, add(a, b));
  11.  
    }
  12.  
     
  13.  
    int add(int a, int b) {
  14.  
    return a b;
  15.  
    }
  16.  
    }
学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgekkeb
系列文章
更多 icon
同类精品
更多 icon
继续加载