「这是我参与11月更文挑战的第13天,活动详情查看:2021最后一次更文挑战」
作者: Tanaka Mutakwa 译者:前端很美 来源:hackernoon
在构建软件系统时,测试是开发流程的关键部分之一。作为一名程序员,我们希望代码按预期运行,希望编写的程序没有bug,从而使得用户体验到最好的产品,本文将探讨一种被称为单元测试的测试方法。什么是单元测试?我们该如何实施单元测试?它的优点和缺点分别是什么?
什么是单元测试
单元测试是把软件系统的分为小的部分来测试,单元测试是由开发人员编写和运行的自动化测试,以确保应用程序的一部分(被称为单元)按预期工作。一个单元应该是系统中逻辑上最小的代码段,可以是单个函数、方法、过程、模块、类或对象。一般来说,一个单元有几个输入和一个输出。单元测试由程序员在编码期间完成。
只有各个小的部分运行良好,整个代码系统才会运行良好,通过为最小的可测试单元编写测试,程序员才能建立整个系统会按预期运行的自信心。一旦软件开发人员编写了单元测试,他们就可以在本地机器上运行它用以检查测试是否通过。还可以运行所有其他预先存在的测试来检查代码是否通过测试。
程序员通常使用单元测试框架来编写自动运行的测试用例,单元测试框架是用来编写和运行单元测试的软件工具,包括构建测试的基础以及执行测试和报告结果的功能。一些流行的语言已经有了成熟的测试框架,例如javascript的Jest、用于 Java 的 JUnit 和用于所有 .Net 语言的 NUnit。
在测试用例执行期间,框架会记录失败的测试并形成报告,视故障严重程度,框架可能会停止后续测试。 单元测试也可以设置为在代码发布到生产环境之前在每个新构建上执行。通过这种方式,软件开发人员可以确保只有通过所有单元测试的代码才能进入实时环境。 如果在构建过程中任何单元测试失败,软件开发人员可以在尝试再次发布之前先修复问题。
单元测试例子
下面是一个js中单元测试的简单例子。有一个简单的sum函数,它接收两个数字作为参数并返回两个数字相加的结果。
function sum(a, b) {
return a + b;
}
module.exports = sum;
sum函数的简单单元测试代码如下:
const sum = require('./sum');
test('adds 1 + 2 to equal 3', () => {
expect(sum(1, 2)).toBe(3);
});
上面的单元测试写明了它的期望( 1 + 2等于3),然后使用测试输入参数 1 和 2 执行 sum 函数。我们期望函数执行后的结果等于3。
如果结果不等于 3,则测试将失败,我们将知道 sum 函数的实现在某处存在错误。❌
如果结果等于 3,测试将通过。✅
然后,我们可以为 sum 函数添加更多单元测试,并使用其他参数来覆盖不同的情况,例如负数或无效参数,以检查错误是否得到了正确处理。这个例子虽然简单,然而,它却展示了单元测试是如何工作的。
单元测试的优点
单元测试是一种软件测试方法,用来测试软件的各个单元、组件或模块以确定它们是否适合使用。 因此,它有很多好处。 随着软件系统的发展,软件开发人员从单元测试中获益更多。 如果在早期开发中进行了适当的单元测试,最终将节省软件开发人员的时间和金钱。
单元测试在开发周期的早期发现问题。 这包括软件开发人员开发中的bug。 在编码中发现bug的成本远低于之后的检测、识别和纠正错误的成本。
单元测试帮助软件开发人员创建更好的软件。 如果编写得不好,代码可能无法或难以进行单元测试,因此单元测试可以迫使软件开发人员以更好的方式构建函数和对象。 编写完整的测试集的过程迫使软件开发人员仔细考虑输入、输出和错误条件,从而更清晰地定义单元所需的行为。
由于单元测试的模块化特性,软件开发人员可以测试软件系统的各个部分,而无需等待其他部分完成。
单元测试允许软件开发人员在以后轻松重构代码或升级系统库,并确保现有代码仍然正常工作。 软件开发人员所做的任何导致现有单元测试失败的更改都可以快速识别并解决。 单元测试能够检测到破坏现已有代码的运行的修改。
单元测试创建系统文档作为积极的副作用。 希望了解单元提供哪些功能以及如何使用它的软件开发人员可以查看单元测试以获得对单元接口 (API) 的基本了解。
单元测试还有一个有益的副作用是创建文档,开发人员可以通过单元测试明白提供哪些功能以及如何使用,可以获得对接口 (API) 的基本了解。
单元测试的局限性
单元测试不会捕获软件系统中的每个错误。 除非它是一个非常简单的系统,否则很难评估软件系统中的每个执行路径。 单元测试仅限于测试单元本身的功能。 它不会捕获其他错误,例如集成错误或性能错误。
如果测试单元的核心功能是与系统外部交互,那么单元测试会变得很困难。 在单元测试时,诸如数据库、文件系统或外部 API 之类的外部事物可能会带来麻烦。 软件开发人员可能不得不模拟与外部的交互,这可能具有挑战性,而且作为测试还不够详尽。
总结
编写单元测试作为系统开发的一部分通常会让人感觉成本高昂且速度缓慢。 需要编写更多代码,编写好的单元测试也需要时间和精力。 开发团队常犯的错误是不写单元测试。 但是随着软件系统的增长,它将受益于单元测试。单元测试有助于更轻松地添加新功能、重构现有功能。尽早添加单元测试将节省软件开发人员的时间和金钱。