Junit5单元测试框架详解

简介: 前面我们学习了Selenium自动化测试框架,但是有的时候测试用例会很多,我们需要一个工具来管理这些测试用例,而Junit就是一个很好的管理工具,简单点来说,Junit就是一个针对Java的单元测试框架;

一. 关于Junit5


Java 语言的单元测试框架相对统一,JUnit 和TestNG 几乎始终处于市场前两位。其中 JUnit 以较长的发展历史和源源不断的功能演进,得到了大多数用户的青睐;


Junit5 由 JUnit Platform + JUnit Jupiter + JUnit Vintage3 部分构成,借用 IBM Developer 的一张图来说明 JUnit 5 的架构 :

a3d1a630307d824191682417d2c42e8d.png

JUnit Platform :


其主要作用是在 JVM 上启动测试框架。它定义了一个抽象的 TestEngine API 来定义运行在平台上的测试框架;也就是说其他的自动化测试引擎或开发人员自己定制的引擎都可以接入 Junit 实现对接和执行。同时还支持通过命令行、Gradle 和 Maven 来运行;


JUnit Jupiter :


这是 Junit5 的核心,可以看作是承载 Junit4 原有功能的演进,包含了 JUnit 5 最新的编程模型和扩展机制;很多丰富的新特性使 JUnit ⾃动化测试更加方便、功能更加丰富和强大。也是测试需要重点学习的地方;Jupiter 本身也是⼀一个基于 Junit Platform 的引擎实现,对 JUnit 5 而言,JUnit Jupiter API 只是另一个 API;


JUnit Vintage :


Junit 发展了10数年,Junit 3 和 Junit 4 都积累了大量的⽤用户,作为新一代框 架,这个模块是对 JUnit3,JUnit4 版本兼容的测试引擎,使旧版本 junit 的⾃动化测试脚本也可以顺畅运行在 Junit5 下,它也可以看作是基于 Junit Platform 实现的引擎范例;


JUnit 5 对 Java 运行环境的最低要求是 Java 8;


二. Junit使用


2.1 添加Maven依赖

我们在操作 Junit 的时候要添加相应的依赖,可以去Maven仓库自行下载,这里给出一段代码:


<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api -->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>5.9.1</version>
        </dependency>

2.2 注解

1)Test


表示方法是测试方法,与Junit4的@Test不同,不能声明任何属性,因为JUnit Jupiter中的测试扩展需要通过专用的注解;


public class Junit_Test {
    @Test
    void Test01(){
        System.out.println("测试用例1");
    }
    @Test
    void Test02(){
        System.out.println("测试用例2");
    }
}


5de75d64df674a11afbefba6ae7fa7c5.png


2)Disable


用于禁用一个测试类或测试方法;类似于JUnit 4的' @Ignore '。即执行单元测试时,会忽略对应的测试类或者测试方法;


public class Junit_Test {
    @Test
    void Test01(){
        System.out.println("测试用例1");
    }
    @Test
    void Test02(){
        System.out.println("测试用例2");
    }
    @Disabled
    void Test03(){
        System.out.println("测试用例3");
    }
}


119781ef5dc04dee8410ac12b616a1d4.png


3) BeforeAll 和 AfterAll


BeforeAll:表示方法在所有测试方法之前运行;


AfterAll:表示方法在所有测试方法之后运行;

public class Junit_Test {
    @AfterAll
    // 需要添加一个关键字static,是针对这个类的
    static void Test05(){
        System.out.println("测试用例AfterAll");
    }
    @Test
    void Test01(){
        System.out.println("测试用例1");
    }
    @Test
    void Test02(){
        System.out.println("测试用例2");
    }
    @Disabled
    void Test03(){
        System.out.println("测试用例3");
    }
    @BeforeAll
    // 需要添加一个关键字static,是针对这个类的
    static void Test04(){
        System.out.println("测试用例BeforeAll");
    }

119781ef5dc04dee8410ac12b616a1d4.png

针对这个操作,通常情况下,创建驱动,打开网页,都放到BeforeAll里面,关闭浏览器放到AfterAll里;


4)BeforeEach 和 AfterEach


BeforeEach:表示方法应该在当前类中每个 @Test, @RepeatedTest, @ParameterizedTest 或 @TestFactory 方法之前执行;类似于Junit4的@Before 。即在每个单元测试之前执行,如果测试类有n个测试方法,则被执行n次;


AfterEach:


表示方法应该在当前类中每个 @Test, @RepeatedTest, @ParameterizedTest 或 @TestFactory 方法之后执行;类似于Junit4的@After 。即在每个单元测试之后执行,如果测试类有n个测试方法,则被执行n次;


public class Junit_Test {
    @AfterAll
    // 需要添加一个关键字static,是针对这个类的
    static void Test05(){
        System.out.println("测试用例AfterAll");
    }
    @Test
    void Test01(){
        System.out.println("测试用例1");
    }
    @Test
    void Test02(){
        System.out.println("测试用例2");
    }
    @Disabled
    void Test03(){
        System.out.println("测试用例3");
    }
    @BeforeAll
    // 需要添加一个关键字static,是针对这个类的
    static void Test04(){
        System.out.println("测试用例BeforeAll");
    }
    @BeforeEach
    void Test06(){
        System.out.println("测试用例BeforeEach");
    }
    @AfterEach
    void Test07(){
        System.out.println("测试用例AfterEach");
    }
}


9efd99c0b35943749480f2eb4c66f439.png


5)ParameterizedTest


表示方法是参数化测试,这里我们需要引入对应的依赖,这里和Junit的版本保持一致:


<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-params -->
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-params</artifactId>
    <version>5.9.1</version>
    <scope>test</scope>
</dependency>
@ParameterizedTest
    // 传入整形参数
    @ValueSource(ints = {1,2,3})
    void Test08(int num){
        System.out.println(num);
    }
    @ParameterizedTest
    // 传入字符串
    @ValueSource(strings ={"1","2","3"})
    void Test09(String nums){
        System.out.println(nums);
    }


ce03fb31e97a401ab59e94a43a7e7dec.png



CSV获取参数:


@ParameterizedTest
    @CsvFileSource(resources = "test01.csv")
    void Test10(String name){
        System.out.println(name);
    }


8705c2957d3d4343a2e4493fc29cbd2f.png


方法获取参数,可传入不同类型的参数:


// 通过方法名获取参数
    @ParameterizedTest
    @MethodSource("method")
    void Test11(int num, String name) {
        System.out.println(num + ":" + name);
    }
    // 输出不同类型的参数
    public static Stream<Arguments> method() {
        return Stream.of(Arguments.arguments(1, "张三"),
                Arguments.arguments(2, "李四"),
                Arguments.arguments(3, "王五"));
    }

e33a170fe17e41e19b8076851d8d1aad.png

6)TestMethodOrder


按照指定顺序来执行测试用例


// 按照指定顺序
//@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
// 按照随机顺序
@TestMethodOrder(MethodOrderer.Random.class)
public class Junit_Test1 {
    // 第三个执行
    @Order(3)
    @Test
    void Test01() {
        System.out.println("测试用例1");
    }
    // 第一个执行
    @Order(1)
    @Test
    void Test02() {
        System.out.println("测试用例2");
    }
    // 第二个执行
    @Order(2)
    @Test
    void Test03() {
        System.out.println("测试用例3");
    }
}


2.3 断言

断言(assertions)是测试方法中的核心部分,用来对测试需要满足的条件进行验证。这些断言方法都是 orgjuiit.jupiter.api.Assertions的静态方法。JUnit5内置的断言可以分成如下几个类别:检查业务逻辑返回的数据是否合理;


1)assertEquals :判断两个对象或两个原始类型是否相等


@ParameterizedTest
    @ValueSource(ints = {1})
    void Test04(int num){
        // 第一个参数是预期的,第二个参数是实际的
        Assertions.assertEquals(1,num);
        System.out.println(num);
    }

2)assertNotEquals:判断两个对象或两个原始类型是否不相等


@ParameterizedTest
    @ValueSource(ints = {1})
    void Test04(int num){
        // 第一个参数是预期的,第二个参数是实际的
        // 判断是否相等
        //Assertions.assertEquals(1,num);
        // 判断不相等
        Assertions.assertNotEquals(2,num);
        System.out.println(num);
    }

3)assertSame:判断两个对象引用是否指向同一个对象


@ParameterizedTest
    @ValueSource(ints = {1})
    void Test04(int num) {
        // 判断是否指向同一个对象
        Object obj1 = new Object();
        Object obj2 = new Object();
        Assertions.assertSame(obj1, obj2, "不是同一个对象");
    }

4)assertNotNull:判断给定的对象引用是否不为null


@ParameterizedTest
    @ValueSource(ints = {1})
    void Test04(int num){
        // 判断是否为空
        String str = null;
        Assertions.assertNull(str);
    }

2.4 套件

使用 JUnit5 测试套件,您可以运行分散到多个测试类和不同包中的测试;


1)SelectClasses指定通过class运行测试套件时要选择的类


@Suite
// 先执行Junit_Test.class,再执行Junit_Test1.class
@SelectClasses({Junit_Test.class,Junit_Test1.class})
public class RunSuite {
}

1)SelectPackages指定通过包运行测试套件时要选择的类


@Suite
@SelectPackages(value = {"Pack1","Pack2"})
public class RunSuite {
}

到这里关于Junit常用的操作就介绍完了,有问题的小伙伴可以私信我,感觉有帮助的,希望可以留下你们的小赞~~

目录
相关文章
|
11天前
|
测试技术 C# 数据库
C# 单元测试框架 NUnit 一分钟浅谈
【10月更文挑战第17天】单元测试是软件开发中重要的质量保证手段,NUnit 是一个广泛使用的 .NET 单元测试框架。本文从基础到进阶介绍了 NUnit 的使用方法,包括安装、基本用法、参数化测试、异步测试等,并探讨了常见问题和易错点,旨在帮助开发者有效利用单元测试提高代码质量和开发效率。
109 64
|
1天前
|
测试技术 Android开发 UED
探索软件测试中的自动化框架选择
【10月更文挑战第29天】 在软件开发的复杂过程中,测试环节扮演着至关重要的角色。本文将深入探讨自动化测试框架的选择,分析不同框架的特点和适用场景,旨在为软件开发团队提供决策支持。通过对比主流自动化测试工具的优势与局限,我们将揭示如何根据项目需求和团队技能来选择最合适的自动化测试解决方案。此外,文章还将讨论自动化测试实施过程中的关键考虑因素,包括成本效益分析、维护难度和扩展性等,确保读者能够全面理解自动化测试框架选择的重要性。
10 1
|
7天前
|
监控 安全 jenkins
探索软件测试的奥秘:自动化测试框架的搭建与实践
【10月更文挑战第24天】在软件开发的海洋里,测试是确保航行安全的灯塔。本文将带领读者揭开软件测试的神秘面纱,深入探讨如何从零开始搭建一个自动化测试框架,并配以代码示例。我们将一起航行在自动化测试的浪潮之上,体验从理论到实践的转变,最终达到提高测试效率和质量的彼岸。
|
10天前
|
Web App开发 敏捷开发 存储
自动化测试框架的设计与实现
【10月更文挑战第20天】在软件开发的快节奏时代,自动化测试成为确保产品质量和提升开发效率的关键工具。本文将介绍如何设计并实现一个高效的自动化测试框架,涵盖从需求分析到框架搭建、脚本编写直至维护优化的全过程。通过实例演示,我们将探索如何利用该框架简化测试流程,提高测试覆盖率和准确性。无论你是测试新手还是资深开发者,这篇文章都将为你提供宝贵的洞见和实用的技巧。
|
2天前
|
测试技术 持续交付
探索软件测试中的自动化框架:优势与挑战
【10月更文挑战第28天】 随着软件开发的快速进步,自动化测试已成为确保软件质量的关键步骤。本文将探讨自动化测试框架的优势和面临的挑战,以及如何有效地克服这些挑战。
9 0
|
23天前
|
机器学习/深度学习 并行计算 数据可视化
目标分类笔记(二): 利用PaddleClas的框架来完成多标签分类任务(从数据准备到训练测试部署的完整流程)
这篇文章介绍了如何使用PaddleClas框架完成多标签分类任务,包括数据准备、环境搭建、模型训练、预测、评估等完整流程。
66 0
目标分类笔记(二): 利用PaddleClas的框架来完成多标签分类任务(从数据准备到训练测试部署的完整流程)
|
23天前
|
机器学习/深度学习 数据采集 算法
目标分类笔记(一): 利用包含多个网络多种训练策略的框架来完成多目标分类任务(从数据准备到训练测试部署的完整流程)
这篇博客文章介绍了如何使用包含多个网络和多种训练策略的框架来完成多目标分类任务,涵盖了从数据准备到训练、测试和部署的完整流程,并提供了相关代码和配置文件。
39 0
目标分类笔记(一): 利用包含多个网络多种训练策略的框架来完成多目标分类任务(从数据准备到训练测试部署的完整流程)
|
26天前
|
Web App开发 设计模式 测试技术
自动化测试框架的搭建与实践
【10月更文挑战第5天】本文将引导你理解自动化测试框架的重要性,并通过实际操作案例,展示如何从零开始搭建一个自动化测试框架。文章不仅涵盖理论,还提供具体的代码示例和操作步骤,确保读者能够获得实用技能,提升软件质量保障的效率和效果。
|
13天前
|
测试技术 开发者
探索软件测试中的自动化测试框架
在软件开发的世界中,质量是至关重要的。为了确保软件产品的质量,软件测试扮演着不可或缺的角色。本文将深入探讨自动化测试框架的概念、重要性以及如何有效地实施它们来提高软件测试的效率和效果。我们将从自动化测试的基本概念开始,逐步深入到不同类型的自动化测试工具和框架,最后探讨如何在实际项目中选择合适的自动化测试策略。
|
3月前
|
XML Java 测试技术
Spring5入门到实战------17、Spring5新功能 --Nullable注解和函数式注册对象。整合JUnit5单元测试框架
这篇文章介绍了Spring5框架的三个新特性:支持@Nullable注解以明确方法返回、参数和属性值可以为空;引入函数式风格的GenericApplicationContext进行对象注册和管理;以及如何整合JUnit5进行单元测试,同时讨论了JUnit4与JUnit5的整合方法,并提出了关于配置文件加载的疑问。
Spring5入门到实战------17、Spring5新功能 --Nullable注解和函数式注册对象。整合JUnit5单元测试框架