浅谈单元测试的那些事

news2025/1/18 7:34:38

Part 01 什么是单元测试

单元测试是一种软件测试方法,用于测试软件系统的最小可测试单元,例如函数、方法或类的行为。单元测试通常由开发人员编写,并在编写代码时就开始执行。这样可以保证实时检测代码中的错误、缺陷和潜在的问题,确保代码满足预期的行为和输出。

单元测试可以分为如下几个步骤,然后在开发中就可以不断地编写、执行、分析测试用例,并修复问题。

确定测试目标:在编写单元测试之前,开发人员需要明确测试目标和预期结果。这有助于确保测试的准确性和完整性。

编写测试用例:测试用例是单元测试的核心。测试用例应该覆盖代码的各种情况和条件,并检测其行为和输出。

执行测试用例:测试用例可以手动执行,也可以通过自动化测试框架执行。自动化测试框架可以帮助开发人员更快速和有效地执行测试用例,并自动报告测试结果。

分析测试结果:分析测试结果可以帮助开发人员更好地理解代码的行为和输出,发现问题和改进代码。

修复问题:在发现问题之后,开发人员需要及时修复问题,确保代码的质量和稳定性。修复问题后,需要重新运行测试用例,确保问题已经解决并且没有引入新的问题。

Part 02 单元测试的作用

确保代码质量:单元测试可以帮助开发人员检测代码中的错误、缺陷和潜在的问题。通过及时发现和修复这些问题,可以保证代码的质量和稳定性。

提高代码可维护性:单元测试可以帮助开发人员更好地理解代码,了解其行为和预期输出,这使得代码更易于维护和修改。

提高开发效率:通过早期发现和解决问题,可以减少后期的调试时间和资源成本,提高开发效率。

促进团队合作:单元测试可以作为开发团队的交流和协作工具。团队成员可以分享代码和测试结果,并共同解决问题。

改进设计和架构:单元测试可以促进更好的设计和架构实践。通过编写可测试的代码和测试用例,可以帮助开发人员更好地理解系统的组成部分,并促进设计和架构的优化。

Part 03 Java项目中单元测试方案推荐

- Junit5

JUnit是Java领域内最为流行的单元测试框架,Junit测试又称白盒测试,旨在验证被测试的软件如何(How)完成功能和完成什么样(What)的功能。Junit的最新版本Junit 5集合了 Junit Platform、Junit Jupiter、Junit Vintage等。其中,Junit Platform是在JVM上启动测试框架的基础;Junit Jupiter提供了新的编程模型,包含了一个测试引擎,在Junit Platform上运行;Junit Vintage 提供了兼容JUnit4.x,Junit3.x的测试引擎,帮助老项目依赖包的过度升级。Springboot2.2.0+中默认集成:

<dependency>
      <groupId>org.openjdk.jmh</groupId>
      <artifactId>jmh-core</artifactId>
      <version>1.23</version>
  </dependency>
  <dependency>
      <groupId>org.openjdk.jmh</groupId>
      <artifactId>jmh-generator-annprocess</artifactId>
      <version>1.23</version>
  </dependency>

常用注解及说明如下:

@test :表示方法是测试方法(即框架操作对象),与JUnit4的@Test不同,JUnit5的@Test非常单一不能声明任何属性,拓展的测试都由Jupiter提供

@DisplayName :为测试类或者测试方法设置展示的名称

@BeforeAll :表示在所有单元测试方法之前执行

@AfterAll :表示在所有单元测试方法之后执行

@BeforeEach :表示在每个单元测试方法之前执行

@AfterEach :表示在每个单元测试方法之后执行

@timeout :表示测试方法运行超过指定时间将会抛出TimeoutException异常

@Disabled :表示测试类或测试方法不执行,类似于JUnit4中的@Ignore

@RepeatedTest :表示方法需要重复执行的次数

@ExtendWith :为测试类或测试方法提供@Autowired的IOC注入

- JMH

JMH(Java Microbenchmark Harness)是java领域用于代码微基准测试的工具套件,主要是基于方法层面的基准测试,精度可以达到纳秒级,它是由Java虚拟机团队开发的。当你定位到热点方法,希望进一步优化方法性能的时候,就可以使用 JMH 对优化的结果进行量化的分析

springboot集成方式导入依赖包如下(最新版本1.36):

<dependency>
      <groupId>org.openjdk.jmh</groupId>
      <artifactId>jmh-core</artifactId>
      <version>1.23</version>
  </dependency>
  <dependency>
      <groupId>org.openjdk.jmh</groupId>
      <artifactId>jmh-generator-annprocess</artifactId>
      <version>1.23</version>
  </dependency>

JMH的应用场景如下:

(1)想准确地知道某个方法需要执行多长时间及执行时间和输入之间的相关性;

(2)对比接口不同实现在给定条件下的吞吐量;

(3)查看多少百分比的请求在多长时间内完成。

上述两个方案前者是确保代码运行的正确性,后者旨在测试代码运行的性能,在项目实战中可以做到强强联合,确保代码质量和稳定性,帮助完善或改进设计和架构,编写高质量的单元测试需要遵循最佳实践。

Part 04 总结

单元测试的目的是为了验证软件开发的功能、性能、完整性。当软件发生变化时,单元测试可以帮助开发人员确定哪些部分受到影响,以及如何更改代码。还可以帮助开发人员了解他们的代码,从单元测试中获得反馈,从而更好继续开发软件。文中提到的基于JUnit5和JMH两种互补方案,可以从代码功能和性能两个角度保证软件交付成果。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取   

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

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

相关文章

打包Java程序为.exe文件

文章目录 将Java程序打包成Jar包打包为.exe文件效果展示文件检索联系作者 ​&#x1f451;作者主页&#xff1a;Java冰激凌 接上篇 我们还未介绍到如何打包为一个.exe文件 将Java程序打包成Jar包 1. file -> Project Structure 或者直接使用全局快捷键&#xff08;Ctrl Al…

Java调用ChatGPT实现可连续对话和流式输出

目录 1. 配置阶段1.1 依赖引入1.2 配置application.yml文件1.3 注解添加 2. 使用2.1 生成回答2.1.1 测试 2.2 生成图片2.2.1 测试 2.3 下载图片2.3.1 测试 2.4 生成流式回答2.4.1 流式回答输出到IDEA控制台2.4.2 流式回答输出到浏览器页面2.4.3 流式回答结合Vue输出到前端界面 …

Docker: 改变容器化世界的革命性技术

目录 1.1什么是虚拟化 1.2什么是Docker 1.3容器与虚拟机的比较 1.4Docker组建 2、Docker安装 2.2设置ustc的镜像 2.3Docker的启动与停止 3、docker常用命令 3.1镜像 3.2容器相关命令 1.1什么是虚拟化 在计算机中&#xff0c;虚拟化&#xff08;Vitualization&#x…

这可能是最全的Web测试各个测试点,有这一篇就够了

前言 什么是Web测试&#xff1f; Web测试测试Web或Web应用程序的潜在错误。它是在上线前对基于网络的应用程序进行完整的测试。 Web测试检查 功能测试 易用性测试 接口测试 性能测试 安全测试 兼容性测试 1、功能测试 测试网页中的所有链接、数据库连接、网页中用于提交或从…

结合具体代码理解yolov5-7.0锚框(anchor)生成机制

最近对yolov5-7.0的学习有所深入&#xff0c;感觉官方代码也比较易读&#xff0c;所以对网络结构的理解更进一步&#xff0c;其中对锚框生成这块没太看明白细节&#xff0c;也想弄明白这块&#xff0c;于是前前后后好好看了代码。现在把我的学习收获做一下记录。个人见解&#…

如何在大规模服务中迁移缓存

当您启动初始服务时&#xff0c;通常会过度设计以考虑大量流量。但是&#xff0c;当您的服务达到爆炸式增长阶段&#xff0c;或者如果您的服务请求和处理大量流量时&#xff0c;您将需要重新考虑您的架构以适应它。糟糕的系统设计导致难以扩展或无法满足处理大量流量的需求&…

第三章 decimal模块

1. decimal 模块介绍 decimal 模块是 Python 提供的用于进行十进制定点和浮点运算的内置模块。使用它可以快速正确地进行十进制定点和浮点数的舍入运算&#xff0c;并且可以控制有效数字的个数。 使用 decimal 模块主要是因为它与 Python 自带的浮点数相比&#xff0c;有以下…

关于Stream流和Lambda表达式,这些技巧你都知道吗?

&#x1f4a7; 关于 S t r e a m 流和 L a m b d a 表达式&#xff0c;这些技巧你都知道吗&#xff1f; \color{#FF1493}{关于Stream流和Lambda表达式&#xff0c;这些技巧你都知道吗&#xff1f;} 关于Stream流和Lambda表达式&#xff0c;这些技巧你都知道吗&#xff1f;&…

2014年全国硕士研究生入学统一考试管理类专业学位联考写作试题

2014年1月真题: 四、写作:第56~57小题&#xff0c;共65分。其中论证有效性分析30 分&#xff0c;论说文35分。 56.论证有效性分析: 分析下述论证中存在的缺陷和漏洞&#xff0c;选择若干要点&#xff0c;写一篇600字左右的文章&#xff0c;对该论证的有效性进行分析和评论。…

马克思第二章

1.实践和认识 实践决定认识&#xff0c;认识又反作用于实践 实践的特点&#xff1a; 1.直接现实性 2.自觉能动性 3.社会历史性 实践和认识的关系 1.实践是认识的来源 2.实践是认识的目的 3.实践是认识的发展动力 4.实践是检验认识真理的唯一标准 5.认识又反作用于实践&#xf…

gocv Windows10下编译和安装(opencv4.7)

opencv居然还没有官方的golang版&#xff0c;出乎意料。为了编译安装这玩意&#xff0c;折腾了一下午&#xff0c;记录下&#xff1a; 资源提前下载 1、 MinGW-w64 这里的坑是对于只懂一点点的人&#xff0c;容易选错版本&#xff1a; 没仔细看的人很可能会选win32的&#x…

【EDA软件互转】PADS转Allegro

1. 使用pads软件打开PCB文件&#xff0c;然后执行菜单命令&#xff1a;File->Export->弹出的对话框中点击“保存”。然后按下图设置后点击“OK”按钮&#xff0c;会在当前目录下生成一个前面保存的asc文件&#xff1b;如果点击OK后有弹出其它提示就点击“确定”就好…

在编写测试报告的时候,我们有哪些点需要注意的呢?

测试报告作为测试人员的核心输出项&#xff0c;是体现自己工作价值的重要承载工具&#xff0c;需要我们认真对待&#xff0c;所以我们要重视测试报告的输出&#xff0c;那么在编写测试报告的时候&#xff0c;我们有哪些点需要注意的呢&#xff1f; 1、不要乱用模板 很多测试新…

CTR预估之WideDeep系列(下):NFM/xDeepFM

在上一篇文章中CTR预估之Wide&Deep系列模型:DeepFM/DCN&#xff0c;学习了Wide & Deep这种通用框架&#xff1a;wide组件的线性模型的显性低阶特征交叉提供记忆能力&#xff0c;deep组件的深度网络模型的隐式高阶特征交叉提供泛化能力&#xff0c;还有DeepFM和Deep&…

蓝桥杯刷题篇①

前言&#xff1a;hello各位童学们好呀&#xff01;许久不见&#xff01;本文为本人的蓝桥杯OJ的刷题笔记&#xff01;文章隶属于专栏蓝桥杯&#xff0c;该专栏的目的是为了记录自己的刷题记录和学习过程&#xff0c;激励自己不断前行&#xff0c;为明年的ACM、ICPC、蓝桥杯等比…

CVPR2023最佳论文提名(12篇)

CVPR2023公布了12篇最佳论文候选文章。&#xff08;直接点击标题可以查看原文&#xff5e;&#xff09; Ego-Body Pose Estimation via Ego-Head Pose Estimation 单位&#xff1a;Stanford-----------关键词&#xff1a;姿态估计 3D Registration With Maximal Cliques 单位&…

三层交换机与路由互联配置(华为设备)

#三层交换机与路由器配置配置 #三层交换机与路由器配置配置 路由器配置 #进入系统视图 <Huawei>system-view #关闭系统提示信息 [Huawei]undo info-center enable #配置一个环回口 [Huawei]int LoopBack 0 #配置IP地址 与 掩码 [Huawei-LoopBack0]ip address 1.1.…

基于matlab使用自定义辐射方向图进行天线阵列分析(附源码)

一、前言 此示例演示如何使用自定义天线辐射方向图创建天线阵列&#xff0c;然后如何分析阵列的响应方向图。这种模式可以通过测量或模拟获得。 二、导入辐射图 根据应用的不同&#xff0c;实用的相控天线阵列有时会使用专门设计的天线元件&#xff0c;其辐射方向图无法用闭式方…

Java018——Java方法

什么是方法&#xff1f; 方法的作用&#xff1f; 方法的定义 方法的使用 一、什么是方法&#xff1f; Java方法是语句的集合 二、方法的作用&#xff1f; 它们&#xff08;语句&#xff09;在一起执行一个功能。 三、方法的定义 格式&#xff1a; 修饰符 返回值类型 方法名…

PostgreSQL(九)内置系统视图

目录 一、系统视图二、 pg_stat_activity 视图1.简介2.核心字段3.全部字段 一、系统视图 PGSQL 中提供了一系列内置的视图&#xff0c;包括系统视图和其他视图。 系统视图提供了查询系统表的一些便利的访问方法。其他视图提供了访问内部服务器状态的方法。 官方文档&#xf…