如何写单元测试

news2024/11/28 6:46:20

单元测试理论知识

什么是单元测试?

单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。通常而言,一个单元可能是单个程序、类、对象、方法等。

为什么需要单元测试

为什么要做单元测试?软件中存在的错误发现得越早,修改和维护的费用就越低,难度也越小。单元测试是在软件开发验证过程的底层和早期进行的测试活动,目的是把缺陷消灭在萌芽状态。

单元测试有什么作用?

  • 实现敏捷开发,单元测试的主要好处之一是它使编码过程更加敏捷。当软件中添加越来越多的功能时,有时需要更改旧的设计和代码,但是更改已测试的代码既有风险又耗费时间。如果有单元测试,则有助于安全重构。

  • 提高代码质量,由于单元测试是在集成测试之前对最小可测单元的测试,所以能够尽早的发现软件代码中的缺陷,并在不影响其他代码部分的情况下解决问题。这些问题包括程序实现中的错误和单元规范中的缺陷及缺失。通过代码检查和已有缺陷的完善,代码质量可以得到大幅度提高。

  • 消除深度未知隐患,软件开发天生就具有极大的复杂性,没人能100%保证自己写出来的程序没有问题。开发中的初步功能验证我们会用仿真,或模型及代码调试技巧进行结果值确认,这种测试一般只能覆盖部分执行路径,未覆盖执行路径就留下了很多未知隐患。为了保证我们的程序在各种情况下都能按照预设响应,就需要对我们的模型或者代码进行严格的基于需求的测试和覆盖率测试(俗称:白盒测试),而这种测试只能在单元测试中进行。

  • 优化设计和架构,单元测试可以辅助优化设计和架构,比如通过处理器在环(Processor In the Loop)来评估最长执行时间(WCET),内存和堆栈使用量,优化设计和架构,尽早地回避集成后的执行时间及内存的溢出问题

  • 满足行业规范要求,满足Automotive SPICE过程及ISO26262安全规范对单元测试的要求,以从第三方认证公司获取相关认证证书。

什么时候单元测试?

单元测试越早越好,早到什么程度?极限编程讲究TDD,即测试驱动开发,先编写测试代码,再进行开发。在实际的工作中,可以不必过分强调先什么后什么,重要的是高效性和实用性。从经验来看,对于单元测试可以先编写产品函数的框架、编写测试函数,再针对产品函数的功能编写测试用例,然后编写产品函数的代码。在实际编码过程中,每写一个功能点就进行相应的测试,并且随时补充测试用例

常见单元测试框架

TestNG vs Junit4

Testng支持分组测试 Testng参数化测试支持复杂类型参数,而junit只支持基本类型 Testng支持依赖测试
Testng提供XML灵活配置测试运行套件

在这里插入图片描述
在这里插入图片描述

执行流程

在这里插入图片描述

单元测试框架使用

预期异常测试

当期望被测代码抛出一个异常,可以通过在 @Test 注解后加入预期的 Exception 来进行添加。
在这里插入图片描述

忽略测试

当期望被测代码抛出一个异常,可以通过在 @Test 注解后加入预期的 Exception 来进行添加。
在这里插入图片描述

超时测试

在这里插入图片描述

参数化测试

多数情况下,会遇到业务逻辑需要大量测试的场景。 参数化测试允许开发人员使用不同的参数值多次运行相同的测试。注解@Parameters返回数组的集合。每个数组包括每个测试执行输入/输出数字。每个数组中的元素数必须和构造参数的数目相同
在这里插入图片描述

@DataProvider当需要传递复杂的参数(列表、对象…),在这种情况下,可以使用数@DataProvider注解。
被@Test标注的方法通过dataProvider属性指明其数据提供者。这个名字需与@DataProvider(name=“…”)中的名字相一致。
在这里插入图片描述
对象作为参数:
在这里插入图片描述

依赖测试(TestNG)

有时,我们可能需要以特定顺序调用测试用例中的方法,或者可能希望在方法之间共享一些数据和状态。
使用dependOnMethods和dependsOnGroups来实现依赖测试。 如果依赖方法失败,则将跳过所有后续测试方法

在这里插入图片描述

Mock测试

在做单元测试的时候,有时候我们要测试的方法会有很多外部依赖的对象或者一些其他服务的调用。 而我们没法控制这些外部依赖的对象。
为了解决这个问题,我们需要用到 Mock 来模拟这些外部依赖的对象,从而控制它们。只需要关心我们自己的业务逻辑是否正确。

在这里插入图片描述

当我们需要测试 UserService 服务时,如果构建真实的 userDao, DB, xxxService、RPC实例, 然后注入到 UserService 中,既笨重又繁琐。 Mock 对象后的框架图

在这里插入图片描述
UserDao, xxxService 和 RPC 都被我们使用了虚拟的对象(Mock 对象) 来替换了, 因此我们就可以对 UserService 进行测试, 而不需要关注它的复杂的依赖了.

Mock框架

地址:https://javadoc.io/static/org.mockito/mockito-core/4.8.1/org/mockito/Mockito.html
一些常用的 mock 库包括 Mockito、JMockIt、EasyMock、PowerMock…没有优劣没有好坏,只有合适与否。
Mockito可以对普通的方法进行Mock,如:public等。PowerMock可以实现完成对private/static/final方法的Mock

Mockito 是一个强大的用于 Java 开发的模拟测试框架, 通过 Mockito 我们可以创建和配置 Mock 对象, 进而简化有外部依赖的类的测试。Mockito对比其他Mock框架:

  • 相对于其他几个老牌框架来说比较新并且应用更广泛。

  • 相对于其他几个老牌框架来说比较新并且应用更广泛。

  • 编码设计简洁优美,使用简单快捷,成本低。
    抽象出测试中的经典概念,如when().thenReturn()、doThrow().when()、verify()、times()、never()以及各种注解很容易理解

Mockito框架

使用 Mockito 的大致流程如下:

  • 创建外部依赖的 Mock 对象, 然后将此 Mock 对象注入到测试类中。
  • 执行测试代码.
  • 校验测试代码是否执行正确。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

常见单元测试插件

squaretest

在这里插入图片描述
在这里插入图片描述

TestMe

https://weirddev.com/testme/

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

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

相关文章

Linux学习-63-源码包服务管理方法

14.5 源码包服务管理(启动与自启动) 14.5.1 源码包服务的启动管理 源码包服务中所有的文件都会安装到指定目录当中,并且没有任何垃圾文件产生(Linux 的特性),所以服务的管理脚本程序也会安装到指定目录中…

[东华杯2021] ezgadget

复现环境配置: 链接:https://pan.baidu.com/s/1t5-fV7SUETDEI5-qbZZQrw 提取码:8do5运行 java -jar ezgadget.jar访问127.0.0.1:8888就可以了 分析: ToStringBean.java package com.ezgame.ctf.tools;import java.io.Seriali…

Nevrona Rave Reports基于报表库

Nevrona Rave Reports基于报表库 Rave Reports被描述为一套复杂的Delphi和CBuilder组件,它能够实现强大的进化过程,并为用户和开发人员提供灵活的数据库覆盖。Rave可视报表设计器基本上是一个基于组件的系统,它是专门为覆盖范围而编写的。与传…

Discourse 为什不建议使用 Gmail 的 SMTP

最开始我们也用了 Gmail 的 SMTP 服务。 这里有个问题是 Gmail 的日发送邮件限制,很多人可能认为 Gmail 是没有日常发送邮件限制的,通常不是这样的,因为如果你是手工回复和发送邮件的话,这个限制还是很难达到的。 如果是计算机或…

docker镜像如何下载到本地

Docker save 命令 | 菜鸟教程 查看镜像 docker images 保存到本地 docker save 999c20aee5da > /home/artipub.tar 999c20aee5da为镜像ID docker save : 将指定镜像保存成 tar 归档文件。 语法 docker save [OPTIONS] IMAGE [IMAGE...] OPTIONS 说明: -o :…

Xlua在unity中使用luaide打断点

本功能可以让你使用同一个编辑器实现对c#和lua打断点 编辑器:vscode 注:这是luaide的付费版才能使用断点的功能,请尊重原作者的辛苦付出! 如有需要请访问官方进行操作,官方链接如下: ShowDoc一个非常适合IT团队的在…

UDS知识整理(六):通讯控制——0x28服务

目录 一、0x28服务(通讯控制)简介 二、0x28服务信息格式 (1)请求格式 (2)正响应格式 (3)负响应格式 三、0x28服务举例 (1)打开接收与发送通讯功能 一、…

如何设计分布式系统-分布式事务-TCC?

如何设计分布式系统-分布式事务-2PC、3PC?_技术分子的博客-CSDN博客 TCC 事务模型的思想类似 2PC 提交,下面对比 TCC 和基于 2PC 事务 XA 规范对比。 第一阶段 TCC 中锁定资源。 第二阶段 TCC根据锁定资源情况进行确认和取消操作。 区别 2PC/XA 是数…

【STL常用容器】:string 容器

文章目录前言一、string容器的基本概念二、字符串的创建构造三、string 赋值操作四、string 字符串拼接五、string 查找和替换六、string字符串比较七、string 字符的存取八、string的插入和删除九、string 子串例:取出邮箱中的用户名前言 时不可以苟遇,…

【JavaScript闭包】JavaScript何为闭包,浅谈闭包的形成和意义

谈到js,必然逃不了闭包。 闭包到底是啥呢?我查了不少资料,解释真的是各种各样,千奇百怪,令人困惑。 我们先来看看一下各种解释 红宝石书:闭包指的是那些引用了另一个函数作用域中变量的函数。mdn : 闭包&a…

英语不好,能不能学会编程?

编程的人都会问: 我英文差能学会编程吗?? 学会编程不须要多浅近的英语水平,想要学会编程,简略的英语水平足够了。当初的程序开发环境又很敌对,基本上关上之后不须要怎么配置,间接写代码就行&a…

Assignment写作摘要方面包含哪些内容?

英文Assignment摘要需要包含问题陈述、动机、方法、结果和结论五个要素。本文小编针对每个要素给出一些常用的句型,以供大家参考使用。 Assignment英文摘要五要素常用句型整理 1、问题陈述(problem statement)常用句型 陈述要解决的问题详解,这个问题又哪…

【JSP】EL表达式

EL表达式EL表达式干什么用的?EL表达式的使用面试题如何输出对象属性值?域中取数据注意事项EL表达式的空处理如何从Map集合中取数据如何从数组或者List集合中获取数据局部忽略EL表达式EL表达式的内置对象EL表达式的运算符EL表达式干什么用的? …

手把手教你写一个图片预览组件

一、前言 本篇主要介绍,vue项目手写一个图片预览组件,组件主要包括图片方法、图片缩小、显示原图、下载、复制等功能。 二、实现方式 首先我们需要做一个图片预览组件都有的功能表头,如下图 主要功能包括,放大、缩放比例显示、…

设计模式:02观察者模式--labview实现

引言 在观察者模式中,一种叫做被观察者的对象维护了观察者对象的集合,当被观察者对象发生改变时候,它会通知观察者。 在被观察者对象所维护的观察者集合中,能够添加或者删除观察者。被观察者状态变化能够传递给观察者。这样观察者…

路西德Lucid EDI项目测试流程

Lucid Motors路西德汽车拥有电动汽车制造、储能技术和代工生产等业务,目前已成功研制出其第一辆汽车Lucid Air,并开始对外销售。随着企业的不断发展,对自动化的要求也越来越高,作为制造型企业,Lucid早已实现机械自动化…

多个JDK版本可以吗:JDK17、JDK19、JDK1.8轻松切换(无坑版)小白也可以看懂

多个版本JDK切换 多个JDK:JDK17、JDK19、JDK1.8轻松切换(无坑版)小白也可以看懂 提示:看了网上很多教程,5w观看、32w观看、几千观看的,多多少少带点坑,这里我就把踩过的坑都给抹了 文章目录多个…

架构演进技巧

架构演进剖析 架构演进定义 定义:通过设计新的系统架构(4R)来应对业务和技术的发展变化 目的:1、应对业务发展带来新的复杂度;2、应用技术发展带来的复杂度新的解决方法 关键:1、新架构;2、…

UDS知识整理(五):安全访问——0x27服务

目录 一、0x27服务(安全访问)简介 二、0x27服务信息格式 (1)请求格式 (2)正响应格式 (3)负响应格式 三、0x27服务服务举例 (1)请求种子与发送KEY 一、…

实变函数与泛函分析基础

集合的运算 并集:1、任意两个集合 2、任意多个集合的并集或和集: 设 一族集合 ;由一切 的 元素组成的集合,其中 是固定指标集, 是 中变化的指标。 记为 ,可表示为 是 有限集, 记 …