单元测试中的 FIRST 原则
单元测试在软件测试中是最基础的测试,它通常在程序员完成编码以后完成,如果是测试驱动的开发 (TDD) 那么更需要在编码完成之前就写好单元测试。单元测试是白盒测试,它只测试软件中的某块代码,而不像集成测试那样需要和软件组件之外的其他组件联合测试,在持续集成 (CI/CD) 中,软件构建 (build) 完成以后的第一个测试可能就是单元测试。
那么程序员在写单元测试的时候要达到什么要求呢? FIRST 原则就是一个指导编写单元测试的原则。FIRST 是下面几个单词的缩写:
Fast,
Isolated/Independent,
Repeatable,
Self-Validating,
Timely/Thorough.
和 SOLID 设计原则一样, FIRST 经常会在程序员之间的交流中被引用到。下面我们简要介绍一下什么是 FIRST。
Fast 快
程序员的每个单元测试应该很快能够被执行完,如果要给一个标准的话,应该是秒级的。单元测试只测试自己的代码,不应该像集成测试那样,连接外部的组件。如果是和时间相关的测试,不应该真的等待时间流逝再看结果,而应该使用 Mock 来模拟时间。
比如下面的代码,我们通过 IDateTimeProvider 接口,模拟了时间,就不用等一个小时才能拿到结果。这个测试显然能够在 1 秒之内结束。
public interface IDateTimeProvider
{/// <summary>/// Get current date time./// </summary>DateTime Now { get; }
}[TestClass]
public class DateTest {[TestMethod]void Weekday_should_be_Monday_after_sunday(){ var datetimeMock = new Mock<IDateTimeProvider>();var car = new MyCar(dateTimeMock) // car.Speed = 30; // 30千米/小时var now = DateTime.Now;datetimeMock.Setup(o => o.Now).Returns(now);car.Start();datetimeMock.Setup(o => o.Now).Returns(now.AddHours(1));int d1 = car.Distance;Assert.AreEqual(30, d1);}
}
Isolated / Independent 隔离 / 独立
每个单元测试不应该依赖于其他的单元测试结果。它应该能够独立运行,而不是要求某些单元测试完成以后才能完成这个单元测试。同样的某个单元测试的结果,也不应该影响其他单元测试的运行结果。如果需要一些配置,这些配置应该在本单元测试的初始化阶段完成。
Repeatable 可重复
单元测试无论在任何环境下都应该得到相同的结果,而不应该受到数据库,网络等环境因素的影响。单元测试的结果只跟我们的代码有关,而不应该和环境有关。如果单元测试失败,它应该是我们代码的某个地方有问题,或者是初始值设置的问题。这样在拿到单元测试的结果的时候,我们就可以专注于我们的代码,而不是环境因素。
Self-Validating 自我校验
单元测试只会返回一个布尔结果,要么成功,要么失败,而不是要程序员自己检查运行结果以后才能判断是否成功。在单元测试中,我们应该加上断言,比如 Assert.IsTrue, Assert.AreEqual等,这些断言直接决定测试结果是否成功。
Timely / Thorough 及时/完整
如果我们的开发方式是测试驱动开发 (TDD) ,那么这一条指的是单元测试应该在生产代码 (production code) 完成前完成。如果你不用 TDD,这一条指的是单元测试要达到下面的标准
- 覆盖所有基本路径 (Happy Path)
- 边界条件
- 安全问题
- 覆盖所有可能的功能性用例,而不只是应付 100% 代码覆盖率的要求
结论
单元测试是代码测试中的基础测试,FIRST是写好单元测试的重要原则,它要求我们的单元测试快速,独立,可重复,自我校验,及时/完整。
本文是程序员经常用到的原则之一,下面我们还会介绍 AAA 和 DRY。
下面的链接中,有我写的软件设计之 SOLID 原则,欢迎阅读。
参考链接:
软件设计中的 SOLID 原则
编写代码中的 DRY 原则
单元测试中的 AAA 规则
F.I.R.S.T principles of testing
Writing Your F.I.R.S.T Unit Tests
单元测试中的 FIRST 原则相关推荐
- pringboot 单元测试 空指针_单元测试中的 FIRST 原则
单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证.进行单元测试,可以尽早地发现编写代码中错误,减少后期测试开销和维护成本,提高软件质量. 下文讲解写出好单元测试需要遵守 ...
- 编写单元测试代码遵守BCDE原则,以保证被测试模块的交付质量,那么下列说法正确的是
多选 编写单元测试代码遵守BCDE原则,以保证被测试模块的交付质量,那么下列说法正确的是:答案在文末 A. Border,边界值测试,包括循环边界.特殊取值.特殊时间点.数据顺序等. B. Corre ...
- 单元测试中使用Mockito模拟对象
单元测试应该小巧玲珑,轻盈快捷.然而,一个待测的对象可能依赖另一个对象.它可能需要跟数据库.邮箱服务器.Web Service.消息队列等服务进行交互.但是,这些服务可能在测试过程中不可用.假设这些服 ...
- Java中单元测试中:@BeforeClass,@Before,@Test,@After,@AfterClass中的问题详解
在Junit4中还有的测试注解有: @BeforeClass ,@Before,@Test,@After,@AfterClass 1.其中:@BeforeClass,@AfterClass是Juni ...
- 9 单元测试中不得不知的概念
单元测试中不得不知的概念 前言 软件单元及单元测试 驱动函数和桩函数 总结 前言 做单元测试,如果不弄清楚什么是单元,那十八般武器也无的放矢了.可能在单元测试中听到最多的就是驱动函数.桩函数和逻辑覆盖 ...
- 设计模式中遵循的原则:单一职责、开发-封闭、依赖倒转
设计模式中遵循的原则:单一职责.开放-封闭.依赖倒转 单一职责原则 一个类而言,应该仅有一个引起它变化的原因. 如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会消弱或者抑制这 ...
- 单元测试中,模拟一个新对象
在单元测试中,会遇到有上百个属性的实体,而这些属性中,大多都是以String Int32 等类型为主,而如果模拟这个实体,给这个实体赋随机值,也要写上百行代码,效率极低 因此,我们可以通过反射来处理. ...
- 软件设计中的一些原则
本文为大家介绍软件设计中的一些原则,都是经过长期经验总结出来的知识,每一个程序员都应该了解,相信对大家在进行软件设计的过程中会有很大帮助. Don't Repeat Yourself (DRY) DR ...
- mockito mock void方法_纯干货,浅谈Mockito在单元测试中的实际应用
本文接上文"接口方没写代码,对接方只能停工吗?",在这里简单介绍Mockito在单元测试中的实际应用.本文使用场景较单一,如有雷同,不甚荣幸,闲言少叙,开门见山.本文将使用mock ...
最新文章
- 《模拟信息转换器(AIC)的实现技术研究》读书笔记
- 套接字错误处理函数的封装思想及函数实现
- 前端学习(1429):ajax封装四
- Java™ 教程(不可变对象)
- WordPress安装插件提示输入FTP账户信息
- 关于使用CKplayer播放m3u8视频出现没有视频的问题分析
- Python 类与对象
- kylin2.1.0 + CHD5.7环境搭建
- oracle关系数据库概述
- 数据库分页【Limt与Limt..OFFSET 】
- 计算机无法识别出硬件,电脑检测不到网卡硬件信息怎么办
- iOS 仿钉钉文字水印
- SpringMVC框架 |自定义类型转换器与日期格式化
- TIM微秒级计时学习笔记
- 报错:HTTP 401 Unauthorized
- ubuntu更换pip3源提高下载速度
- ESB Evaluation
- 爱数:以全域数据管理能力,助推智慧城市落地
- html5自动抠图api,js钢笔抠图插件_jQuery之家-自由分享jQuery、html5、css3的插件库
- vue js 可随意拖动盒子 以及禁止拖拽
热门文章
- 中等职业学校计算机应用专业教学标准,中等职业学校计算机应用专业教学标准.doc...
- import、from...improt、from...import *三者的区别
- 设计之下——搜狐新闻客户端的用户体验设计(全彩)
- maven插件学习(maven-shade-plugin和maven-antrun-plugin插件)
- 简易ajax,简单的AJAX实现(HELLO AJAX)
- Python 的 最全的sys
- C语言之复数的加减乘除
- 数据结构—笔记整理—初识数据结构
- Java实现回溯算法中的装载问题---(详细)
- 【2019CVPR学习】翻译-Graph Attention Convolution for Point Cloud Semantic Segmentation