优质单元测试的十大标准,你有遵循吗?
优秀的测试套件可以让人在更改代码时感到安全,从而使工作更为轻松;糟糕的测试套件会让人痛苦不堪,且浪费大量时间。编写好的、可维护的单元测试存在着一些特定规则,可使单元测试质量更高、更具效率。
1、尽可能简短
因为我们测试的是由单个代码单元交付的单个功能,所以测试应该相当短是有意义的。至于具体需要多短就取决于多种因素,但通常不会超过几行代码。
2、切忌自我重复
良好的编码实践应用于测试代码的方式与应用于生产代码的方式相同。从实践经验上来说,单元测试中最容易违反的规则之一是“Dont Repeat Yourself”。有些人甚至声称单元测试根本不应该共享任何代码。那是全然的废话。当然,我们希望尽可能保持测试的可读性,但是复制粘贴不是解决方案。
3、选择组合而非继承
一旦了解了前面的两点,你可能会想要为自己的测试创建一些包含常用代码的基类。如果确实如此,请立马停止!这样的基类就像磁铁一样吸引着各种不相关的共享代码,并且增长非常迅速,直到接管你的项目、迭代、产品……为保证这些不被它逐步侵蚀,务必使用组合方式!
4、使其速度更快
单元测试几乎可以一直运行。出于这个原因,一定要模拟外部依赖项和其他可能会减慢测试速度的东西,这通常是数据库、外部系统或文件操作。同时,不要做得太过——完全隔离被测单元也不是一个好的解决方案。
5、使其具有确定性
每当听到有人拥有了95%的可用测试套件,并认为这已经足够好到可以投入生产时,我总是哭笑不得,因为单元测试应该必须保证100%可工作性。只有100%通过测试才意味着一切正常(对于单元,您还需要其他类型的测试)。如果你的单元测试看起来不可靠,请确保找到根本原因并尽快修复它。
6、不要为测试标注“可忽略”
在第四条和第五条的基础上,必须要提及的是给测试添加“可忽略”注释,这并不是修复测试套件的方法,反而会使测试套件更加不可靠,因为它并不能避免回归Bug之类的问题。
7、测试你的测试
这一条不是说为你的测试编写测试,而是指进行如突变测试、测试驱动开发或频繁地在代码库中“随机更改东西”这样的实践,以查看是否有测试失败。还可以经常做一些脑力练习,试图找出自己的测试中无法发现的对代码的潜在更改。
8、合理命名测试
尽管我不相信每个项目都应该为测试使用一些花哨的命名约定,但合理的命名能够通过只读失败的测试用例的名称来判断代码的哪一部分被破坏了。
9、每个测试仅包含一个逻辑断言
为了实现仅仅通过读取失败测试的名称就可以判断出错误的目标,需要的不仅仅是好的名称。一个测试检查也必须限制一些事情。因此,一个好的单元测试应该只包含一个逻辑断言,即只检查被测试方法的一个输出/副作用。
10、设计你的测试
这是一个元技巧,它涵盖了本文中所有其他技巧以及在这里没有提到的技巧。对待测试要像对待/编写代码一样谨慎。考虑良好的设计原则和指标,如测试代码和生产代码之间的低耦合,以及代码的重复、死代码等。
请记住,一个好的测试套件可以使您在更改和重构代码时感到安全,从而使您的工作更加轻松,而糟糕的测试套件则会使您痛苦不堪,浪费大量的时间,并使代码几乎不可能更改。
以上十个标准不一定需要全部遵循,可根据团队、个人情况进行选择性取舍。
作者:陈琦,资深敏捷测试顾问,作为国内知名项目管理软件——禅道的团队成员,主要负责开源自动化测试管理框架——ZTF的开发工作。拥有十多年的敏捷过程实践经验,现致力于测试自动化和DevOps相关领域的实践和研究。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
常见机器学习算法背后的数学
不同的机器学习算法是如何从数据中学习并预测未见数据的呢? 机器学习算法是这样设计的,它们从经验中学习,当它们获取越来越多的数据时,性能就会提高。每种算法都有自己学习和预测数据的方法。在本文中,我们将介绍一些机器学习算法的功能,以及在这些算法中实现的有助于学习过程的一些数学方程。 机器学习算法的类型 机器学习算法大致可以分为以下四类: 监督学习:预测的目标或输出变量是已知的。这些算法生成一个函数,该函数将输入映射到输出变量。回归和分类算法属于这一类。在回归中,输出变量是连续的,而在分类中,输出变量包含两个或更多的离散值。一些监督学习算法包括线性回归,逻辑回归,随机森林,支持向量机,决策树,朴素贝叶斯,神经网络。 无监督学习:目标或输出变量是未知的。这些算法通常对数据进行分析并生成数据簇。关联、聚类和维数约简算法属于这一类。K-means聚类、PCA(主成分分析)、Apriori算法等是非监督学习算法。 半监督学习:它是监督和非监督学习方法的结合。它使用已知数据来训练自己,然后标记未知数据。 强化学习:机器或代理被训练从“试错”过程中学习。机器从过去的决策经验中学习,并利用它的学习来预测未...
- 下一篇
QUIC协议详解之Initial包的处理
从服务器发起请求开始追踪,细说数据包在 QUIC 协议中经历的每一步。大量实例代码展示,简明易懂了解 QUIC。 前言 本文介绍了在 QUIC 服务器在收到 QUIC 客户端发起的第一个 UDP 请求— Initial 数据包的分析、处理和解密过程,涉及Initial数据包的格式,数据包头部保护的去除, Packet Number 的计算,负载数据的解密,client hello 的解析,等等。本文的 C 实现采用 OpenSSL,并基于 IETFQUIC Draft-27。 术语 **PacketNumber :**数据包序号 **Initial Packet:**初始数据包 **Variable-length Integer Encode:**可变长度整型编码 **HMAC:**Hash-based messageauthencation code,基于 Hash 的验证信息码 **HKDF: **HMAC-based Extract-and-Expand KeyDerivation Function,基于 HMAC 的提取扩展密钥衍生函数 AEAD: authenticated ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Hadoop3单机部署,实现最简伪集群
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker安装Oracle12C,快速搭建Oracle学习环境