当前位置: 首页 > news >正文

单元测试框架深入(一):单元测试框架深入

一、一个简单的例子

1、引入Maven依赖:JUnit框架和Surefire插件

2.在src/test/java目录下新建名字以“Test”结尾的测试类,并用@Test注释测试方法

3.运行单元测试用例

或用mvn命令运行单元测试:

二、单元测试基础之单元测试框架:Junit 4

项目父模块已经引入了JUnit 4,所以在项目中选用JUnit4

官网:JUnit – About

API文档:JUnit API

FAQ:JUnit – Frequently Asked Questions

Maven依赖:

<dependency>

<groupId>junit</groupId>

<artifactId>junit</artifactId>

<version>4.12</version>

</dependency>

1、Junit:用于编写和运行测试用例的开源框架

JUnit主要提供了如下3个方面的能力:

  1. Assertions:断言实际值是否等于期望值,包含一组重载方法;

(2)Fixtures:用于保证测试用例可重复性的固定的基准环境;

(4)Test runners:用于运行测试用例的机制。

2、Assertions

所有断言方法都是org.junit.Assert类的静态方法,例如:

import static org.junit.Assert.assertArrayEquals;

import static org.junit.Assert.assertEquals;

import static org.junit.Assert.assertFalse;

import static org.junit.Assert.assertNotNull;

import static org.junit.Assert.assertNotSame;

import static org.junit.Assert.assertNull;

import static org.junit.Assert.assertSame;

import static org.junit.Assert.assertThat;

import static org.junit.Assert.assertTrue;

3、Fixtures

在测试方法执行之前或之后执行,用于保证测试方法的执行环境是确定的。Junit4支持4个注解:

@BeforeClass:在当前测试类的所有测试方法之前执行,只执行一次;

@AfterClass:在当前测试类的所有测试方法之后执行,只执行一次;

@Before:在每个测试方法执行之前都会执行一次;

@After:在每个测试方法执行之后都会执行一次。

4、Test runners

(1)JUnit运行测试用例的入口是JUnitCore类,支持如下两种方式:

方式1:在Java应用中

org.junit.runner.JUnitCore.runClasses(TestClass1.class, ...);

方式2:在命令行中

java org.junit.runner.JUnitCore TestClass1 [...other test classes...]

JUnit默认使用一个叫做BlockJUnit4ClassRunner的Runner来运行测试用例,可以用@RunWith(XXX.class)注解测试类来替换成其它Runner(如提供Spring容器支持的SpringJUnit4ClassRunner)。

(2)默认情况下,JUnit会为每个测试方法创建测试对象

测试类:至少包含一个测试方法的类;

测试方法:由@Test注解的实例方法;

生命周期方法:由@BeforeAll,、@AfterAll、@BeforeClass或@AfterClass注解的方法。

注意:测试方法和生命周期方法不能是抽象方法且不能有返回值;

测试类、测试方法和生命周期方法不能是private,但是也不一定要public。

三、单元测试基础之运行环境:Maven的Surefire插件和Failsafe插件

1、测试代码与业务代码不同,没有直接的main函数入口,通常需要借助特定的工具来运行

(1)IDE支持,如IDEA、Eclipse、NetBeans和VS等;

(2)构建工具支持,如Maven和Ant;

(3)JUnit提供的命令行工具。

2、Maven的default生命周期

Maven默认情况下为每个阶段绑定相应的goal。例如:当在POM文件中将模块的<packaging>元素设为jar时,Maven会把如下goal绑定到相应的阶段

其中,被绑定到test阶段的surefire:test用于运行应用中的单元测试。为了方便设置Surefire插件的参数,建议把它显式地添加到POM文件中。例如:

<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>2.19.1</version></plugin></plugins>
</build>

在POM文件所在目录执行:

mvn package

Maven在执行到test阶段的时候,会查找并运行src/test/java目录下的单元测试。

3、Surefire插件Failsafe插件

(1)单元测试 vs 集成测试

1)单元测试一般是类级别的,通常是方法级别的。每个测试用例通常只验证一个方法或一个类的功能,不负责检查跨类或者跨系统的交互;

2)集成测试的测试粒度比单元测试的粗,例如验证整个API服务或RPC服务的功能是否符合预期。由于要启动整个服务,会对外界环境(如数据库、Apollo配置)有比较强的依赖,有些应用可能还需要把包部署到外部容器才能进行测试。

(2)Maven对单元测试和集成测试的支持:Surefire插件和Failsafe插件

1)Surefire插件:用于运行单元测试。运行测试用例和验证结果在同一个构建阶段,一旦发现测试用例运行失败,就马上终止构建并标志为失败。

2)Failsafe插件:用于运行集成测试。运行测试用例和验证结果在不同的构建阶段,测试用例运行失败不会马上终止构建,所以可以在终止构建前把测试用例依赖的外部环境释放掉。它的命名就跟这一特性有关——即使测试用例失败也能以安全的方式结束构建过程。

4、Surefire插件和Failsafe插件与Maven的default生命周期

<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>2.19.1</version><configuration><argLine>${test.jvm.option}</argLine></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-failsafe-plugin</artifactId><version>2.18.1</version><configuration><argLine>${test.jvm.option}</argLine></configuration><executions><execution><goals><goal>integration-test</goal><goal>verify</goal></goals></execution></executions></plugin></plugins>
</build>

默认情况下,Surefire插件的surefire:test 绑定到test阶段,负责运行和验证单元测试;

Failsafe插件的failsafe:integration-test 绑定到integration-test阶段,负责运行集成测试;failsafe:verify 绑定到verify阶段,负责验证集成测试。

在POM文件所在目录执行:

mvn verify

Maven依次编译源码,让Surefire插件运行单元测试用例,打包,让Failsafe插件运行集成测试用例。

5、Surefire插件和Failsafe插件分别运行哪些测试用例?

(1)Surefire插件默认查找并运行符合以下条件的测试类

(2)Failsafe插件默认查找并运行符合以下条件的测试类

可以通过<include>和<exclude>属性来添加或排除特定的测试类。

总结:对比Surefire插件的默认执行测试类可见,这两个插件的测试类可以重叠,可以让某些测试类既在test阶段执行也在integration-test阶段执行。如果不想让这两种测试类重叠,可以将所有单元测试类的类名以“Test”结尾并且不以“IT”开头,并将集成测试类的类名以“IT”结尾并且不以“Test”开头。

6、如何跳过测试用例?

方式1:总是跳过运行单元测试和集成测试

将skipTests参数(默认false)设置为true,跳过运行单元测试和集成测试:

<project>
[...]<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>3.0.0-M5</version><configuration><skipTests>true</skipTests></configuration></plugin></plugins></build>[...]
</project>

方式2:默认跳过运行单元测试和集成测试,但是在需要的时候通过mvn命令参数关闭跳过

将skipTests属性设置为true,在需要的时候指定mvn命令参数skipTest为false:

<project>[...]<properties><skipTests>true</skipTests></properties>[...]<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>3.0.0-M5</version><configuration><skipTests>${skipTests}</skipTests></configuration></plugin></plugins></build>[...]
</project>

mvn install -DskipTests=false

如果只打算跳过由Failsafe插件执行的集成测试,可以用skipITs参数代替。

方式3:跳过单元测试和集成测试的编译和运行

指定mvn命令参数maven.test.skip(默认false)为true,。

mvn install -Dmaven.test.skip=true

方式4:运行单元测试,但是忽略测试结果

指定mvn命令参数maven.test.failure.ignore(默认false)为true:

mvn test -Dmaven.test.failure.ignore=true

  1. Surefire插件和Failsafe插件如何运行测试用例?

(这里以Surefire插件为例,Failsafe插件类似)

  1. 默认情况下,Surefire插件创建一个子进程来运行所有测试类;

(2)子进程的主要工作就是指定类加载路径并运行测试类:

java -classpath foo.jar:bar.jar MyApp

(3)Surefire插件支持以多线程多进程的方式运行测试用例,以加快测试速度。

相关文章:

单元测试框架深入(一):单元测试框架深入

一、一个简单的例子 1、引入Maven依赖&#xff1a;JUnit框架和Surefire插件 2.在src/test/java目录下新建名字以“Test”结尾的测试类&#xff0c;并用Test注释测试方法 3.运行单元测试用例 或用mvn命令运行单元测试&#xff1a; 二、单元测试基础之单元测试框架&#xff1a;J…...

苏门X学士常识学习

前言 苏轼&#xff08;1037年—1101年&#xff09;是北宋的文坛领袖&#xff0c;很喜欢奖掖后进。其门下最有名的是“苏门四学士”&#xff0c;另外还有“苏门六学士”和“苏门后四学士”之说。 一、苏门四学士 苏轼在《与李昭玘书》中说&#xff1a; 轼蒙庇粗遣&#xff0…...

MD5算法:高效安全的数据完整性保障

摘要&#xff1a;在数字世界中&#xff0c;确保数据完整性和安全性至关重要。消息摘要算法就是一种用于实现这一目标的常用技术。其中&#xff0c;Message Digest Algorithm 5&#xff08;MD5&#xff09;算法因其高效性和安全性而受到广泛关注。本文将详细介绍MD5算法的优缺点…...

JavaScript基础五对象 内置对象 Math.random()

内置对象-生成任意范围随机数 Math.random() 随机数函数&#xff0c; 返回一个0 - 1之间&#xff0c;并且包括0不包括1的随机小数 [0, 1&#xff09; 如何生成0-10的随机数呢&#xff1f; Math.floor(Math.random() * (10 1)) 放大11倍再向下取整 如何生成5-10的随机数&…...

curl之网络接口

Curl_cftype 连接接口定义 struct Curl_cftype {const char *name; /* name of the filter type */int flags; /* flags of filter type */int log_level; /* log level for such filters */Cu…...

Pytest中doctests的测试方法应用

在 Python 的测试生态中,Pytest 提供了多种灵活且强大的测试工具。其中,doctests 是一种独特而直观的测试方法,通过直接从文档注释中提取和执行测试用例,确保代码示例的正确性。本文将深入介绍 Pytest 中 doctests 的测试方法,包括基本用法和实际案例,以帮助你更好地利用…...

Android 8.1 铃声音量通话音量同步调节

Android 8.1 铃声音量通话音量同步调节 最近收到客户反馈&#xff0c;想要实现铃声音量通话音量同步调节&#xff0c;具体修改参照如下&#xff1a; /frameworks/base/core/java/android/preference/SeekBarVolumizer.java if (defaultUri null) {if (mStreamType AudioMan…...

C++——字符串string

C——字符串string C语言中对字符串的表示通常用指针&#xff0c;新手会面临内存泄漏或者段错误等众多问题。 在 C 中&#xff0c; string 类是标准库的一部分&#xff0c;用于表示和操作字符串。它是对传统的 C 风格字符串&#xff08;以空 字符 ‘\0’ 结尾的字符数组&…...

HBuilder使用[微信小程序开发者工具] 显示 × initialize报错

解决办法 我们先要单独打开 微信开发者工具 点击设置里面的安全,把服务器端口打开 然后再回到我们的HBuilder使用重新打开打开 成功打开...

洛谷P8599 [蓝桥杯 2013 省 B] 带分数

[蓝桥杯 2013 省 B] 带分数 题目描述 100 100 100 可以表示为带分数的形式&#xff1a; 100 3 69258 714 100 3 \frac{69258}{714} 100371469258​。 还可以表示为&#xff1a; 100 82 3546 197 100 82 \frac{3546}{197} 100821973546​。 注意特征&#xff1a;带分…...

grafana安装DevOpsProdigy KubeGraf 1.5.2

安装DevOpsProdigy KubeGraf需要安装kube-state-metrics 官方地址&#xff1a;https://github.com/kubernetes/kube-state-metrics/tree/release-2.10/examples/standard 查看k8s版本和kube-state-metrics对应版本&#xff1a; [rootmaster1 kube-state-metrics]# ll 总用量 …...

大数据 - Hadoop系列《三》- MapReduce(分布式计算引擎)概述

上一篇文章&#xff1a; 大数据 - Hadoop系列《三》- HDFS&#xff08;分布式文件系统&#xff09;概述-CSDN博客 目录 12.1 针对MapReduce的设计构思 1. 如何对付大数据处理场景 2. 构建抽象编程模型 3. 统一架构、隐藏底层细节 12.2 分布式计算概念 12.3 MapReduce定义…...

了解Ansible自动化运维工具及模块的使用

一、Ansible的相关知识 1.1 Ansible工具的了解 Ansible是一个基于Python开发的配置管理和应用部署工具&#xff0c;现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点&#xff0c;Pubbet和Saltstack能实现的功能&#xff0c;Ansible基本上都可以实现。Ansible…...

sql指南之null值用法

注明&#xff1a;参考文章&#xff1a; SQL避坑指南之NULL值知多少&#xff1f;_select null as-CSDN博客文章浏览阅读2.9k次&#xff0c;点赞7次&#xff0c;收藏21次。0 引言 SQL NULL&#xff08;UNKNOW&#xff09;是用来代表缺失值的术语&#xff0c;在表中的NULL值是显示…...

常见消息队列:ActiveMQ、RabbitMQ、RocketMQ、Kafka的区别总结

目录 前言 1、常见消息队列 1.ActiveMQ 2.RabbitMQ 3.RocketMQ 4.Kafka 2、区别 1.消息传递模型 2.消息持久化 3.消息顺序性 4.可靠性 5.生态系统和社区支持 6.表格对比 前言 消息队列可以实现应用程序之间的异步通信&#xff0c;能够实现异步消息的发送和接收&am…...

火柴人大逃亡

欢迎来到程序小院 火柴人大逃亡 玩法&#xff1a;左右两边火柴人&#xff0c;点击左边左边火柴人跳跃&#xff0c;点击右边右边跳跃&#xff0c; 上下快速移动道路&#xff0c;躲过障碍物&#xff0c;看你能坚持多久&#xff0c;快去火柴人大逃亡吧^^。开始游戏https://www.or…...

AI革命新篇章:法国天才团队挑战ChatGPT霸主地位

Mistral AI: Guillaume Lample, Arthur Mensch et Timothe Lacroix. ChatGPT 的霸主地位已被三位来自法国的天才所颠覆&#xff01;如上图这三个人&#xff0c;其中一位曾在 DeepMind 工作&#xff0c;另外两位来自 Meta&#xff0c;他们联手为 AI 领域带来了革命性的变革 我…...

数据双向绑定v-modal

v-model v-model就实现了双向数据绑定&#xff0c;实际上它就是通过Vue提供的事件机制。即在子组件通过$emit()触发一个事件&#xff0c;在父组件使用v-on来监听对应的事件并修改相应的数据。 input的v-model就是通过<input :value"value" input"input"…...

Docker 容器jar 运行报错 at sun.awt.FontConfiguration.getVersion 解决方法

docker jar 运行报错 at sun.awt.FontConfiguration.getVersion 初步判断是在运行 Docker 容器中的 JAR 文件时遇到了与字体配置相关的问题。这个问题可能是由于容器内缺少字体配置或字体文件而引起的。 要解决这个问题&#xff0c;你可以尝试以下方法&#xff1a; 1.安装字…...

光学3D表面轮廓仪服务超精密抛光技术发展

随着技术的不断进步&#xff0c;精密制造领域对材料表面的处理要求越来越高&#xff0c;超精密抛光技术作为当下表面处理的尖端技术&#xff0c;对各种高精密产品的生产起到了至关重要的作用&#xff0c;已广泛应用于集成电路制造、医疗器械、航空航天、3C电子、汽车、精密模具…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...