JUnit单元测试之旅

news2024/12/27 10:03:15

目录

  • 1. 什么是单元测试和JUnit
  • 2. JUnit入门与基本注解
    • 2.1测试类的定义:
    • 2.2 生命周期注解:
    • 2.3断言注解:
    • 2.4 参数化
      • 单参数
      • 多参数
      • 通过方法获取参数
    • 2.5 测试套件
  • 三.用到的依赖包

1. 什么是单元测试和JUnit

单元测试(Unit Testing)是对软件中的最小可测试单元进行检查和验证。它主要包括:

  • 测试单元:软件中的最小可测试功能模块,如方法、类等。
  • 测试用例:用于验证测试单元的输入、执行和输出是否正确的测试脚本。
  • 测试套件:包含多个测试用例的集合。

JUnit是Java语言中最广泛使用的单元测试框架。它允许编写和运行可以重复执行的测试,并且可以自动化测试过程。
JUnit主要功能包括:

  • 测试套件(Test Suite)控制多个测试用例;
  • 断言(Assertions)验证测试结果;
  • 设置超时时间;
  • 忽略测试(Ignored Tests );
  • 提供测试结果报告等。

JUnit是Java语言中最广泛使用的单元测试框架

2. JUnit入门与基本注解

2.1测试类的定义:

使用@Test注解标注测试方法
按照以往的经验,我们想运行一个程序必须在main方法运行,但是junit给了我们一个注解,我们只需要在方法上注解之后,就可以直接点击运行,以下是代码实例

    @Test
    public void Test01(){
        System.out.println("这是第一个注解");

    }
    @Test
    public void Test02(){
        System.out.println("这是我们的Test02");
    }

在这里插入图片描述
标识测试方法:@Test告诉JUnit这个方法是一个测试方法,需要运行并验证。没有@Test注解的方法不会被认为是测试方法,不会运行。

2.2 生命周期注解:

@BeforeAll,@AfterAll,@BeforeEach,@AfterEach
解释完@Test之后我们来看看这四个注解的意思,再看看他们的执行顺序,话不多说,我们直接上代码

public class JunitTest02 {
    @BeforeAll
    static void SetUp() {
        System.out.println("这是我们BeforeAll里面的语句");
    }

    @AfterAll
    static void TearDown() {
        System.out.println("这是AfterAll的语句");
    }


    @BeforeEach
    void BeforeEachTest() {
        System.out.println("这是BeforeEach里面的语句");
    }

    @AfterEach
    void AfterEachTest() {
        System.out.println("这是AfterEach里面的语句");
    }
    @Test
    void Test01() {
        System.out.println("这是JunitTest里面的Test01");
    }

    @Test
    void Test02() {
        System.out.println("这是JunitTest里面的Test02");
    }

}

执行结果:
在这里插入图片描述
具体的解释过程:

  1. @BeforeAll:在所有的测试执行之前执行一次
  2. @BeforeEach:每个测试方法执行之前执行
  3. 测试方法:test1()和test2()被执行
  4. @AfterEach:每个测试方法执行之后执行
  5. @AfterAll:在所有的测试执行之后执行一次
    所以具体的生命周期如下:
    BeforeAll在所有的测试用例运行之前跑对应的方法
    BeforeEach在每一个测试用例执行之前跑对应的方法
    AfterAll在所有的测试用例运行之前跑对应的方法
    AfterEach在每一个测试用例执行之前跑对应的方法

2.3断言注解:

具体来解释一下:
在JUnit5中,断言(Assertions)注解用来验证测试结果是否正确。主要的断言注解有:

  • @AssertEquals:判断两个对象或两个原始类型是否相等。
  • @AssertTrue:判断给定的布尔值是否为 true。
  • @AssertFalse:判断给定的布尔值是否为 false。
  • @AssertNull:判断给定的对象引用是否为 null。
  • @AssertNotNull:判断给定的对象引用是否不为 null。
  • @AssertSame:判断两个对象引用是否指向同一个对象。
  • @AssertNotSame:判断两个对象引用是否指向不同的对象。

具体例子如下:

 @ParameterizedTest
    @ValueSource(strings = {"null1"})
    void Test02(String  num){
        Assertions.assertNull(num);
    }

出现的运行情况
在这里插入图片描述

** @ParameterizedTest
    // @ValueSource(ints = {1})注解提供测试参数1。
    @ValueSource(ints = {1})
    //方法Test01()有一个int类型参数num。由于@ParameterizedTest的存在,该方法会使用@ValueSource提供的测试参数1执行一次。
    void Test01(int num) {
        System.out.println(num);
        /*
        - assertEquals(1, num):判断num是否等于1,通过。

         */
        Assertions.assertEquals(1, num);
    }**

运行效果如下:
在这里插入图片描述

 @ParameterizedTest
    // @ValueSource(ints = {1})注解提供测试参数1。
    @ValueSource(ints = {1})
    void Test03( int num){
        Assertions.assertNotEquals(1, num);
    }

运行结果如下:
在这里插入图片描述
我这里只是列举了一些操作,大家可以下去自己尝试一下,看看其他的,是怎么样的情况.

2.4 参数化

单参数

这里我们使用但参数的引入注解是@ValueSource,下面就是这个参数的具体解释。
@ValueSource是一个JUnit的参数化测试注解。它允许使用不同的参数多次运行同一个测试方法。
基本用法是:

  1. 在测试方法上使用@ValueSource(ints = {…})注解,指定测试参数数组。
  2. 测试方法必须只有一个参数,这个参数会在不同测试 iterations 中使用 @ValueSource 指定的不同值。
  3. JUnit 会根据指定的参数数组,多次运行此测试方法,实现参数化。
    具体的例子如下:
    @ParameterizedTest
    @ValueSource(ints = {1, 2, 3})
    void Test04(int num) {
        System.out.println(num);
    }

    @ParameterizedTest
    @ValueSource(strings = {"1", "2", "3"})
    void Test05(String number) {
        System.out.println(number);
    }

多参数

我们使用csv的方式.
@CsvFileSource是一个JUnit的参数化测试注解,用于从CSV文件中读取测试参数.
具体的步骤如下:

  1. 创建一个CSV文件
  2. 在测试方法上使用@CsvFileSource注解,指定CSV文件的路径

具体例子如下:

//使用Csv文件
    @ParameterizedTest
    @CsvFileSource(resources = "test02.csv")
    public void Test06(int id,String name){
        System.out.println("学号:" + id + ",姓名:" + name);
        
    }
   @ParameterizedTest
    @CsvFileSource(resources = "test01.csv")
    void Test07(String name){
        System.out.println(name);
    }

最终的输出结果:
在这里插入图片描述
在这里插入图片描述

test01和test02的内容格式如下:
在这里插入图片描述

其实大家看到上面的例子,或许大家还有一个东西没有明白,什么是.CSV文件,我这里来带大家认识一下:
什么是CSV?
CSV(Comma-Separated Values,逗号分隔的值)是一种简单、实用的文件格式,用于存储和表示包括文本、数值等各种类型的数据。CSV 文件通常以 .csv 作为文件扩展名。这种文件格式的一个显著特点是:文件内的数据以逗号 , 分隔,呈现一个表格形式。CSV 文件已广泛应用于存储、传输和编辑数据。
CSV文件的结构
每行表示一条记录:CSV 文件中的每一行代表一条记录,相当于数据库中的一行数据。
逗号分隔:每行数据中,使用逗号 , 进行数据分隔,代表不同的数据。
引号包围:当数据单元格中的内容含有逗号时,为避免混淆,需要引号 (单引号 ’ 或双引号 ")将这个数据包围起来,防止误认为是两个不同数据。

具体格式如下:

姓名,年龄,性别
张三,25,男
李四,28,男
王五,22,女

通过方法获取参数

在JUnit5中,@MethodSource注解用于从指定方法中获取测试参数。其基本用法如下:

  1. 定义一个返回Stream或Iterable的参数提供方法.
public static Stream<Arguments> Generator() {
        return Stream.of(Arguments.arguments(
                "1,张三",
                "2,李四"
        ));
    }
  1. 在测试方法上使用@MethodSource注解引用此方法
 @ParameterizedTest
    @MethodSource("Generator")
    void Test07(String num, String name) {
        System.out.println(num + ":" + name);
    }

具体的运行结果:

在这里插入图片描述

  1. JUnit会调用stringProvider()方法获取参数,并使用这些参数重复执行testWithStringArgument()方法,实现参数化测试。

2.5 测试套件

测试套件(Test Suite)是一组组织在一起的测试案例。它允许您将单元测试组合在一起,以匹配整个功能或模块。
测试套件的主要优点是:

  1. 组织测试:可以按功能、类别等组织管理相关测试,提高可维护性。
  2. 批量执行:可以一次性执行套件中的全部测试,方便回归测试等场景。
  3. 层次清晰:套件可以嵌套套件,形成层次结构,mirror应用的结构。
  4. 管理测试顺序:可以控制套件中测试的执行顺序。
  5. 测试报告:套件执行会生成汇总报告,使得测试结果更加直观全面。

这里我们使用的是使用@Suite注解定义一个用于存储测试的容器类.
具体对@Suite做出解释:
@Suite是JUnit中的一个注解,用于定义测试套件。
具体的使用步骤:
1.加入@Suite注解
2.在类上添加@Suite.SelectPackages或者 @SelectClasses注解列出该套件包含的测试:

具体的包目录
在这里插入图片描述

具体的包里面的类

public class Test07 {
    @Test
    void Test007() {
        System.out.println("Test08 pacage Test007");
    }
}
public class Test09 {
    @Test
    void Test01() {
        System.out.println("package test09 test01");
    }
}
import org.junit.jupiter.api.Test;

public class JunitTest01 {

    @Test
    public void Test01(){
        System.out.println("这是第一个注解");

    }
    @Test
    public void Test02(){
        System.out.println("这是我们的Test02");
    }
}

这里提供俩种方式:

通过class运行测试用例

@Suite
@SelectClasses({JunitTest01.class})
    public class RunSuite {
    }

具体运行结果

在这里插入图片描述

通过包运行测试用例

@Suite
@SelectPackages(value = {"Test08","Test09"})
    public class RunSuite {
    }

具体的运行结果
在这里插入图片描述

三.用到的依赖包

 <dependencies>
        <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>3.141.59</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.11.0</version>
        </dependency>
        <!-- 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>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-params</artifactId>
            <version>5.9.1</version>
        </dependency>
 
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-suite</artifactId>
            <version>1.9.1</version>
            <scope>test</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.junit.platform/junit-platform-suite -->
    </dependencies>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/592421.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PyCharm使用指南 - 如何创建密码短语生成器(上)

PyCharm是一种Python IDE&#xff0c;其带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具。此外&#xff0c;该IDE提供了一些高级功能&#xff0c;以用于Django框架下的专业Web开发。 PyCharm 最新下载 本文将展示如何使用免费的 PyCharm Community Edition 开…

Java 泛型的介绍

文章目录 1.学习目标2.什么是泛型3.引入泛型语法 4.泛型类的使用语法示例 6.泛型的上界语法示例 7.泛型的方法定义语法示例 8.通配符通配符解决什么问题通配符上界通配符下界 9.包装类基本数据类型和对应的包装类装箱和拆箱自动装箱和自动拆箱 1.学习目标 1.以能阅读 java 集合…

EventLoop事件循环

JavaScript是单线程语言 单线程执行任务队列的问题: 如果前一个任务非常耗时,则后续任务不得不等待,从而导致程序假死的问题。 同步任务和异步任务 ​ 为了防止某个耗时任务程序导致假死的问题,javascript把待执行的任务分为两类: 同步任务(synchronous) 又叫非耗时任务,指…

vue3-实战-02-管理后台项目集成

目录 1-集成element-plus 2-src别名配置 3-环境变量配置 4-svg图标配置 4.1-svg插件安装配置 4.2-svg封装为全局组件 5-集成sass 6-mock数据 7-axios二次封装 上一篇文章记录了项目初始化和项目配置&#xff0c;本章我们来进行项目集成。 1-集成element-plus 本次管…

【PWN · 总结】system返回shell(‘/bin/sh‘、‘sh‘、$(0))

pwn题中要通过system/excute等返回shell&#xff0c;进而cat flag。今天遇到一题&#xff0c;参数$(0)也可返回&#xff0c;有必要记录一下。 目录 前言 一、/bin/sh 1.strings 2.IDA 3.pwntools 4.ROPgadget 5.libc中寻找 二、sh 三、$(0) exp IDA查看机器码 …

交换机的4种网络结构方式:级联方式、堆叠方式、端口聚合方式、分层方式

交换机是计算机网络中重要的网络设备之一&#xff0c;用于实现局域网&#xff08;LAN&#xff09;内部的数据转发和通信。交换机可以采用不同的网络结构方式来满足不同的网络需求和拓扑结构。本文将详细介绍交换机的四种网络结构方式&#xff1a;级联方式、堆叠方式、端口聚合方…

c语言编程练习题:7-112 约分最简分式

#include <stdio.h> int gcd(int a,int b) {if(a<b)return gcd(b,a);if(a%b0)return b;elsegcd(b,a%b); } int main(){int a,b;if (scanf("%d/%d",&a,&b)!EOF){// 分析不敲钟的时间int gcd_value gcd(a,b);printf("%d/%d",a/gcd_value,b…

DMBOK知识梳理for CDGA/CDGP——第二章 数据处理伦理

关 注gzh “大数据食铁兽” 回复“知识点”获取《DMBOK知识梳理for CDGA/CDGP》常考知识点&#xff08;第二章数据处理伦理&#xff09; 第二章 数据处理伦理 第二章在 CDGA考试中分值占比不高&#xff0c;CDGP考试不考核。主要侧重点是考概念性的知识&#xff0c;难度较…

Matlab进阶绘图第22期—不等宽柱状图

不等宽柱状图是一种特殊的柱状图。 与常规柱状图相比&#xff0c;不等宽柱状图可以通过柱高与柱宽分别表达两个维度的数据&#xff0c;因此在多个领域得到应用。 在《Matlab论文插图绘制模板第91期》中&#xff0c;虽有介绍过利用Matlab自带bar函数绘制不等宽柱状图的方法&am…

LDGRB-01 3BSE013177R1 将数字输入和继电器输出结合

LDGRB-01 3BSE013177R1包的一部分是全面的通信选项&#xff0c;包括Modbus主/从或CS31&#xff0c;这种产品很少提供。128kB的用户内存和0.1秒/指令的程序处理时间只是AC500-eCo令人印象深刻的性能的两个例子。除了与现有AC500系列的互操作性&#xff0c;AC500-eCo系统还使用基…

PMP-范围管理的重要性

本篇文章主要是方便从事项目管理的“初学者”们了解范围管理的重要性 一、什么是范围管理 项目范围管理包括确保项目做且只做所需的全部工作&#xff0c;以成功完成项目的各个过程。管理项目范围主要在于定义和控制哪些工作应该包括在项目内&#xff0c;哪些不应该包括在项目内…

推动创意成果:创意过程如何改变 2023 年的业务

时下全球经济放缓&#xff0c;很多企业业务都陷入了增长瓶颈&#xff0c;如何突破&#xff1f;今天我们来聊聊一般业务突破的3种方式&#xff1a; 发现一片新的蓝海&#xff0c;迅速杀入占领生态位&#xff08;快&#xff09;&#xff1b; 发现结构性红利机会&#xff0c;大量投…

低代码开发重要工具:jvs-rules 规则引擎功能介绍(二)

一、JVS规则引擎接口管理 接口管理是将逻辑引擎对接所有的接口进行统一管理&#xff0c;便于各种应用统一引用。 接口的界面展示 接口列表的展示&#xff0c;接口列表是根据系统内部支持的接口进行展现&#xff0c;包括查看接口的详情 详情中包括&#xff0c;入参与出参的展…

QT(QPainter画圆弧)

文章目录 前言一、QPainter画圆弧方法二、使用示例三、画一个彩色环总结 前言 本篇文章给大家介绍一下如何使用QPainter来画圆弧。 一、QPainter画圆弧方法 drawArc() 函数是 Qt 绘图类库中的一个函数&#xff0c;用于在画布上绘制圆弧。可以通过设置起点角度和圆弧弧度来控…

Keil_C51之Memory_mode解析

有时我们会遇到这样的报错&#xff1a; *** ERROR L107: ADDRESS SPACE OVERFLOW SPACE: DATA SEGMENT: _DATA_GROUP_ LENGTH: 002CH Program Size: data117.0 xdata0 code6242 Target not created. Build Time Elapsed: 00:00:00 报错截图如下&#xff1a; 这类报…

程序员怎么玩转Linux

Linux下可以使用Python编写爬虫程序&#xff0c;常用的爬虫框架有Scrapy和BeautifulSoup。 Scrapy是一个基于Python的开源网络爬虫框架&#xff0c;可以快速高效地从网站上获取数据。它提供了强大的数据提取和处理功能&#xff0c;支持异步网络请求和分布式爬取等特性。 Beau…

九耶丨阁瑞钛伦特-springmvc(五)

Spring是最流行的企业级开发框架之一&#xff0c;它提供了一套完整的IOC&#xff08;控制反转&#xff09;和AOP&#xff08;面向切面编程&#xff09;解决方案&#xff0c;可以帮助软件开发人员快速开发出高效、可扩展的应用程序。Spring MVC是Spring框架中的一个模块&#xf…

cesium模型在前端页面加载后亮度异常的处理

一.问题产生与分析 通常情况下&#xff0c;后端生成的模型数据&#xff0c;以默认参数加载在前端页面时亮度能显示是正常的&#xff0c;如果不正常&#xff0c;猜测可能与生成的原数据有关&#xff08;数据本身在前端页面加载亮度就低&#xff09; 二.问题解决 前端页面针对这…

OpenHarmony 3.2 Release新特性解读之驱动HCS

OpenAtom OpenHarmony&#xff08;以下简称“OpenHarmony”&#xff09;开源社区&#xff0c;在今年4月正式发布了OpenHarmony 3.2 Release版本&#xff0c;标准系统能力进一步完善&#xff0c;提升了系统的整体性能、稳定性和安全性。此次版本对于驱动也提供了一些新的特性&am…

ELK高可用集群添加用户名密码认证

确定主节点 GET _cat/nodes?v带*的就是主节点&#xff0c;这里是zcpt-prd-ELK-01节点 生成根证书elastic-stack-ca.p12&#xff08;进入主节点&#xff09; 注意操作es7.7.0使用es用户 su es进入主节点的bin目录下执行 ./elasticsearch-certutil ca会要求输入密码直接回车…