Skip to content

Junit5嵌套测试

JUnit5 嵌套测试

什么是嵌套测试

嵌套测试(Nested Tests)是一种测试组织方式,在 JUnit 5 中引入。它允许将相关的测试方法组织在一个嵌套类中,以更好地结构化和组织测试代码。

通常情况下,一个测试类中的每个测试方法都是平等的,它们相互独立地测试被测试代码的不同方面或功能。然而,在某些情况下,我们可能需要对测试方法进行更细致的组织和分组,以提高测试代码的可读性和可维护性。

通过使用嵌套测试,我们可以以更清晰的方式表达测试目的和意图。通过嵌套类,我们可以将相关的测试方法组织在一起,并使用一个共同的上下文环境,从而更加直观地理解整个测试的目标。

  • 测试用例体现业务的层级

uml diagram

使用场景

有时候我们需要对一组相关的测试方法进行组织和分组,测试用例之间的关系并不是完全分开的,这时候使用到嵌套测试可以更好地组织和管理相关的测试方法,提高测试代码的可读性和可维护性。此外,嵌套测试还可以带来更清晰的测试报告,使测试结果更易于理解。

  • 定制化执行用例
  • 用例层级、业务关系更加清晰

案例

1. 我们先尝试一下如果不适用嵌套测试的方法,对不同模块的功能进行测试的情况。
  • 代码示例
package junit5.nest;

import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
public class NestExampleTest {
    //不使用嵌套测试进行测试
    @Test
    void managementLogin(){
        System.out.println("管理员登录测试");
    }

    @Test
    void deleteUser(){
        System.out.println("删除用户");
    }

    @Test
    void getMortgageScore(){
        System.out.println("房屋贷款");
    }

}
  • 从左下方的执行结果可以发现执行结果的展示无法体现测试模块间的层级关系。
2. 接下来改为使用 Nest 嵌套测试,与未嵌套时的结果进行对比。
  • 代码示例
package junit5.nest;

import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
public class NestExampleTest {
    //不使用嵌套测试进行测试
//    @Test
//    void managementLogin(){
//        System.out.println("管理员登录测试");
//    }
//
//    @Test
//    void deleteUser(){
//        System.out.println("删除用户");
//    }
//
//    @Test
//    void getMortgageScore(){
//        System.out.println("房屋贷款");
//    }


//使用到嵌套测试可以更好地组织和管理相关的测试方法,提高测试代码的可读性和可维护性。
// 此外,嵌套测试还可以带来更清晰的测试报告,使测试结果更易于理解。
    @Nested
    class AuthorityManagement{
        @Nested
        class Management{
            @Test
            void managementLogin(){
                System.out.println("管理员登录测试");
            }
            @Nested
            class ManagementDelete{
                @Test
                void deleteUser(){
                    System.out.println("删除用户");
                }
            }
        }
        @Nested
        class Client{
        }
    }
    @Nested
    class DataManagement{
        @Nested
        class CreditScore{
            @Nested
            class MortgageScore{
                @Test
                void getMortgageScore(){
                    System.out.println("房屋贷款");
                }
            }
        }
    }
}
  • 通过使用嵌套测试,测试结果可以更清晰的表达测试目的和意图。嵌套类可以将相关的测试方法组织在一起,并使用一个共同的上下文环境,从而更加直观地理解整个测试的目标。