如何开展单元测试

1、是什么

单元测试(Unit Testing)又称为模块测试,是针对程序模块来进行正确性检验的测试工作。

  • 程序模块是软件设计的最小单位,程序单元是应用的最小可测试部件

  • 在面向过程编程中,一个单元就是单个程序、函数、过程等

  • 在面向对象编程中,最小单元就是方法,包括基类(超类)、抽象类、或者派生类(子类)中的方法

2、测什么

1、并不是所有的项目都需要单元测试,一次性的项目不需要单元测试,持续迭代的产品需要单元测试,
通常只有底层模块或者核心模块的测试中才会采用单元测试
2、并不是所有的"单元"都需要单元测试,服务代码、管理者代码、存储代码都应该是简单的顺序执行、没有逻辑的代码,
不需要单元测试。同理,单元测试的代码不需要单元测试——单元测试的代码应该只包含简单的顺序执行、没有逻辑的代码

2.1 单元测试规则

1、必须进行测试的是通用、公共的Utils函数 2、复杂交互操作需要进行一定的测试 3、网络请求可以交给系统测试,或者不进行测试

2.2 可测试的代码

对于一个逻辑单元(方法),依赖于两个方面:一个是输入的参数,另一个是对外部的方法调用
只要确保输入参数不包含外部环境的上下文,同时内部代码对外部的调用也不包含环境上下文的访问,这个方法就是可单元测试的

2.3 判断可测试的代码

1、方法的运行是否需要mock
2、方法是否可以直接运行
3、方法的参数是否可以自由模拟,不依赖外部环境

2.4 改造代码

如果代码里有逻辑,但是不可单元测试的话,就需要改造代码
首先隔离逻辑代码和外部环境代码,再对逻辑代码进行单元测试

3、怎么测

3.1 单元测试的写法

1、通过提供预期的输入和预期的结果,与单元的实际运行结果进行对比,就可以知道单元的工作是否和预期的一致
2、各种输入参数的边界条件都需要测试到
3、单元测试的覆盖率可以帮助识别单元测试是否存在没有运行到的代码

3.2 命名方法

1、测试代码和业务代码的组织架构要保持一致,一一对应
2、单元测试的类名后加Test
3、单元测试的方法前加test
4、处于同一包名下,方便访问protected类型的方法

3.3 单元测试执行

1、构建输入参数,并预测该输入所产生的输出
2、调用要测试的目标方法,获取输出
3、Assert目标方法的输出是否和预期的输出一致

3.3.1 输入数据

1、被测试函数的输入参数
2、被测试函数内部需要读取的全局静态变量
3、被测试函数内部需要读取的成员变量
4、函数内部调用子函数获得的数据
5、函数内部调用子函数改写的数据
6、嵌入式系统中,在中断调用时改写的数据

3.3.2 预计输出

1、被测试函数的返回值
2、被测试函数的输出参数
3、被测试函数所改写的成员变量
4、被测试函数所改写的全局变量
5、被测试函数中进行的文件更新
6、被测试函数中进行的数据库更新
7、被测试函数中进行的消息队列更新

3.4 原则

1、覆盖分支和循环条件的所有路径
2、每个理想的测试Case独立于其它Case

4、谁来测

单元测试更偏技术,它们通常关注代码细节,甚或是编程语言特有的概念,所以编写单元测试主要应该由研发负责
测试人员更了解如何制定测试计划,根据特定分析,如等价类划分和边界值分析,定义有价值的值。
因此,程序员需要从测试人员那里“窃取”这类知识,
或者,他们可以和测试人员结对,一起讨论需要编写的测试,但是,之后应该由程序员实现它们
条件允许,结对是最好的选择

5、何时测

开发过程中,单元测试应该来测试那些可能会出错的地方,或是那些边界情况
维护过程中,单元测试应该跟着QA的bug report来走,每一个bug都应该有个单元测试。
于是研发就会对自己的代码变更有两个自信,一是bug被fixed,二是相同的bug不会再次出现

6、怎么测

团队制度,单元测试是团队成熟度的基本标志
把单元测试执行、代码覆盖率统计和持续集成流水线做集成,以确保每次代码递交,都会自动触发单元测试,
并在单元测试执行过程中自动统计代码覆盖率,最后以“单元测试通过率”和“代码覆盖率”为标准来决定本次代码递交是否能够被接受。

7、局限

1、单元测试只测试程序单元自身的功能
2、单元测试只能表明测到的问题,不能表明不存在未测试到的错误
3、单元测试不能发现集成错误、性能问题、或者其他系统级别的问题,结合其他软件测试活动更为有效

研发可以向QA学习一些设计测试用例的方法。

不能忽视的是,单元测试还要考虑成本和收益

关注灵活就业新业态,关注公账号:贤才宝(贤才宝https://www.51xcbw.com)

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

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

相关文章

40分钟学 Go 语言高并发:服务性能调优实战

服务性能调优实战 一、性能优化实战概述 优化阶段主要内容关键指标重要程度瓶颈定位收集性能指标,确定瓶颈位置CPU、内存、延迟、吞吐量⭐⭐⭐⭐⭐代码优化优化算法、并发、内存使用代码执行时间、内存分配⭐⭐⭐⭐⭐系统调优调整系统参数、资源配置系统资源利用率…

代码随想录-算法训练营day31(贪心算法01:分发饼干,摆动序列,最大子数组和)

第八章 贪心算法 part01● 理论基础 ● 455.分发饼干 ● 376. 摆动序列 ● 53. 最大子序和 贪心算法其实就是没有什么规律可言,所以大家了解贪心算法 就了解它没有规律的本质就够了。 不用花心思去研究其规律, 没有思路就立刻看题解。基本贪心的题目 …

JVM 参数前缀 -XX: 含义 详解

在 Java 虚拟机(JVM)中,参数前缀 -XX: 表示的是 JVM 的非标准(实验性)选项。这些参数用于调整和优化 JVM 的性能、垃圾回收行为、内存分配策略等。 1. 参数分类 -XX: 参数大致分为三类,根据其格式区分&…

有趣的Docker

👉【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中 1. Docker 上的“全世界”命令行 你可以在 Docker 容器中运行一个模拟的 “世界地图”,并通过命令行与它互动。这是一个非常有趣的项目,结合了命令行和图形界面的交互。…

win11无法检测到其他显示器-NVIDIA

https://www.nvidia.cn/software/nvidia-app/ https://cn.download.nvidia.cn/nvapp/client/11.0.1.163/NVIDIA_app_v11.0.1.163.exe 下载安装后,检测驱动、更新驱动。

(数据结构与算法)如何提高学习算法的效率?面试算法重点有哪些?面试需要哪些能力?

面试官眼中的求职者 通过对你算法的考察!!!! 缩进太多!!一般不要超过三层!!!缩进越少,bug越少;逻辑比较复杂,把这些包装成为函数&…

Applied Intelligence投稿

一、关于手稿格式: 1、该期刊是一个二区的,模板使用Springer nature格式, 期刊投稿要求,详细期刊投稿指南,大部分按Soringernature模板即可,图片表格声明参考文献命名要求需注意。 2、参考文献&#xff…

洛谷 P1150:Peter 的烟 ← while循环

【题目来源】https://www.luogu.com.cn/problem/P1150【题目描述】 Peter 有 n 根烟,他每吸完一根烟就把烟蒂保存起来,k(k>1)个烟蒂可以换一个新的烟,那么 Peter 最终能吸到多少根烟呢? 与某些脑筋急转弯…

【学习总结|DAY010】Java 流程控制与数据操作练习四:简易计算器

在这段 Java 代码中,我将解析一段简单的 Java 计算器代码,它能够执行基本的数学运算,包括加法、减法、乘法和除法。 一、主要代码 import java.util.Scanner;public class demo101Calculator {public static void main(String[] args) {Sca…

深入云电脑PC Farm技术探讨,以阿里云、华为云、ToDesk为例

🌝引言 近年来,云计算技术的飞速发展为各行各业的数字化转型带来了全新机遇,其中云电脑作为一种虚拟化桌面解决方案,逐渐成为个人用户与企业的核心选择。从远程办公、在线教育到高性能计算需求,云电脑通过为用户提供随…

力扣88题:合并两个有序数组

力扣88题:合并两个有序数组 题目描述 给定两个按非递减顺序排列的整数数组 nums1 和 nums2,以及它们的长度 m 和 n,要求将 nums2 合并到 nums1,使得合并后的数组仍按非递减顺序排列。 输入与输出 示例 1: 输入&am…

MAUI APP开发蓝牙协议的经验分享:与跳绳设备对接

在开发MAUI应用程序时,蓝牙协议的应用是一个重要的环节,尤其是在需要与外部设备如智能跳绳进行数据交换的场景中。以下是我在开发过程中的一些经验和心得,希望能为你的项目提供帮助。 1. 蓝牙协议基础 蓝牙协议是无线通信的一种标准&#x…

Vector软件CANdb++的信号起始位Bug

问题现象 前几天导入DBC文件发现不对劲,怎么生成代码的起始地址都怪怪的,检查下工程里面的配置,还真的是这样,一路查到输入文件——DBC文件,发现是DBC文件就有错误:一些CAN报文之后8字节长度,也…

Qt 面试题学习12_2024-11-30

Qt 面试题 1、描述Qt的TCP通讯流程2、自定义控件流程3、什么是Qt的插件机制 ? 1、描述Qt的TCP通讯流程 服务端(QTcpServer) 1、创建TcpServer对象 2、使用listen()方法将服务器绑定到本地地址和端口 3、当有新的客户端连接成功发送newConnec…

2022-12-4----Android11(H713m)---- WiFi驱动添加写入mac号补丁

一、问题 用全志的写号工具,写入wifi_mac,设置下边不生效 二、分析 因为我们的WiFi不是用全志平台的,也不是用全志集成好的,而是用希微这家第三方的WiFi/BT,所以该驱动还没完善。 三、修改前的准备 用写号工具写号…

网站维护记录

服务器重启,网站打不开:chown -R manager:manager /run/php-fpm/www.sock wordpress升级需设置ftp: // 设置权限0777 //define("FS_METHOD", "direct"); //define("FS_CHMOD_DIR", 0777); //define("…

单端和差分信号的接线法

内容来源:【单端信号 差分信号与数据采集卡的【RSE】【 NRES】【 DIFF】 模式的连接】 此篇文章仅作笔记分享。 单端输入 单端信号指的是输入信号由一个参考端和一个信号端构成,参考端一般是地端,信号就是通过计算信号端口和地端的差值所得…

C++——名字遮蔽与类的作用域

C 类的作用域以及继承的特殊关系 名字遮蔽与类的作用域继承的特殊关系 名字遮蔽与类的作用域 如果派生类中的成员(包括成员变量和成员函数)和基类中的成员重名,通过派生类对象或者在派生类的成员函数中使用该成员时,将使用派生类…

Solana VS 以太坊:基于数据、市场情绪和催化剂对比分析,Solana 能否实现逆袭?

2023年,加密货币市场再度迎来了波动与重塑。在这一轮周期中,Solana(SOL)凭借其强劲的价格表现和创新的技术架构,成为市场的焦点之一。SOL的价格从2022年12月的低点一路飙升,甚至创下了历史新高264 USDT&…

Mac安装MINIO服务器实现本地上传和下载服务

0.MINIO学习文档 Minio客户端mc使用 | Elibaron学习笔记 1.Mac安装MINIO 中文官方网址:MinIO下载和安装 | 用于创建高性能对象存储的代码和下载内容 (1) brew 安装 brew install minio/stable/minio (2)安装完成,执行brew i…