单元测试在软件测试中是最基础的测试,它通常在程序员完成编码以后完成,如果是测试驱动的开发 (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 原则相关推荐

  1. pringboot 单元测试 空指针_单元测试中的 FIRST 原则

    单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证.进行单元测试,可以尽早地发现编写代码中错误,减少后期测试开销和维护成本,提高软件质量. 下文讲解写出好单元测试需要遵守 ...

  2. 编写单元测试代码遵守BCDE原则,以保证被测试模块的交付质量,那么下列说法正确的是

    多选 编写单元测试代码遵守BCDE原则,以保证被测试模块的交付质量,那么下列说法正确的是:答案在文末 A. Border,边界值测试,包括循环边界.特殊取值.特殊时间点.数据顺序等. B. Corre ...

  3. 单元测试中使用Mockito模拟对象

    单元测试应该小巧玲珑,轻盈快捷.然而,一个待测的对象可能依赖另一个对象.它可能需要跟数据库.邮箱服务器.Web Service.消息队列等服务进行交互.但是,这些服务可能在测试过程中不可用.假设这些服 ...

  4. Java中单元测试中:@BeforeClass,@Before,@Test,@After,@AfterClass中的问题详解

    在Junit4中还有的测试注解有:  @BeforeClass ,@Before,@Test,@After,@AfterClass 1.其中:@BeforeClass,@AfterClass是Juni ...

  5. 9 单元测试中不得不知的概念

    单元测试中不得不知的概念 前言 软件单元及单元测试 驱动函数和桩函数 总结 前言 做单元测试,如果不弄清楚什么是单元,那十八般武器也无的放矢了.可能在单元测试中听到最多的就是驱动函数.桩函数和逻辑覆盖 ...

  6. 设计模式中遵循的原则:单一职责、开发-封闭、依赖倒转

    设计模式中遵循的原则:单一职责.开放-封闭.依赖倒转 单一职责原则 一个类而言,应该仅有一个引起它变化的原因. 如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会消弱或者抑制这 ...

  7. 单元测试中,模拟一个新对象

    在单元测试中,会遇到有上百个属性的实体,而这些属性中,大多都是以String Int32 等类型为主,而如果模拟这个实体,给这个实体赋随机值,也要写上百行代码,效率极低 因此,我们可以通过反射来处理. ...

  8. 软件设计中的一些原则

    本文为大家介绍软件设计中的一些原则,都是经过长期经验总结出来的知识,每一个程序员都应该了解,相信对大家在进行软件设计的过程中会有很大帮助. Don't Repeat Yourself (DRY) DR ...

  9. mockito mock void方法_纯干货,浅谈Mockito在单元测试中的实际应用

    本文接上文"接口方没写代码,对接方只能停工吗?",在这里简单介绍Mockito在单元测试中的实际应用.本文使用场景较单一,如有雷同,不甚荣幸,闲言少叙,开门见山.本文将使用mock ...

最新文章

  1. 《模拟信息转换器(AIC)的实现技术研究》读书笔记
  2. 套接字错误处理函数的封装思想及函数实现
  3. 前端学习(1429):ajax封装四
  4. Java™ 教程(不可变对象)
  5. WordPress安装插件提示输入FTP账户信息
  6. 关于使用CKplayer播放m3u8视频出现没有视频的问题分析
  7. Python 类与对象
  8. kylin2.1.0 + CHD5.7环境搭建
  9. oracle关系数据库概述
  10. 数据库分页【Limt与Limt..OFFSET 】
  11. 计算机无法识别出硬件,电脑检测不到网卡硬件信息怎么办
  12. iOS 仿钉钉文字水印
  13. SpringMVC框架 |自定义类型转换器与日期格式化
  14. TIM微秒级计时学习笔记
  15. 报错:HTTP 401 Unauthorized
  16. ubuntu更换pip3源提高下载速度
  17. ESB Evaluation
  18. 爱数:以全域数据管理能力,助推智慧城市落地
  19. html5自动抠图api,js钢笔抠图插件_jQuery之家-自由分享jQuery、html5、css3的插件库
  20. vue js 可随意拖动盒子 以及禁止拖拽

热门文章

  1. 中等职业学校计算机应用专业教学标准,中等职业学校计算机应用专业教学标准.doc...
  2. import、from...improt、from...import *三者的区别
  3. 设计之下——搜狐新闻客户端的用户体验设计(全彩)
  4. maven插件学习(maven-shade-plugin和maven-antrun-plugin插件)
  5. 简易ajax,简单的AJAX实现(HELLO AJAX)
  6. Python 的 最全的sys
  7. C语言之复数的加减乘除
  8. 数据结构—笔记整理—初识数据结构
  9. Java实现回溯算法中的装载问题---(详细)
  10. 【2019CVPR学习】翻译-Graph Attention Convolution for Point Cloud Semantic Segmentation