菜单

测试

相关源文件

本文档概述了根据干净代码原则测试 JavaScript 代码的最佳实践。适当的测试是编写高质量、可维护代码的关键组成部分。有关补充测试的错误处理技术的更多信息,请参阅 错误处理

测试的目的和重要性

测试是可靠软件开发的基础。在干净代码方法中,测试被认为比交付产品本身更重要。没有充分的测试,每次代码更改都可能引入未检测到的错误。测试可确保代码功能的可靠性,并实现更安全的重构。

来源: README.md1833-1848

覆盖率目标

实现高测试覆盖率对于构建可靠的软件至关重要。虽然确切的百分比可能因团队和项目需求而异,但理想目标是对语句和分支都达到 100% 的覆盖率。这种覆盖率有助于确保代码的所有部分都能正常运行,并使开发人员能够自信地进行更改。

要有效地衡量您的测试覆盖率,您应该使用像 Istanbul 这样的覆盖率工具。这些工具会跟踪测试期间执行的代码部分,并提供突出显示未测试区域的报告。

来源: README.md1833-1842

每个测试一个概念

干净的测试应遵循每个测试只测试一个概念的原则。这种方法使测试更具可读性、可维护性,并在测试失败时有助于诊断问题。当测试失败时,它应该清楚地表明哪里出了问题,而无需进行 extensive 调试。

不良与良好测试实践

不良测试模式:在一个测试中包含多个断言或概念,使得难以确定具体哪个功能失败。

良好测试模式:将测试分解为更小的单元,每个单元验证一个概念,从而提供清晰的故障消息和更好的测试组织。

来源: README.md1849-1898

示例:单个概念测试

以下是结构不良的测试和遵循单一概念原则的结构良好测试的比较

不良测试示例:

良好测试示例:

良好的示例清楚地将不同的测试概念分开,使得更容易理解每个测试的目的,并在测试失败时更容易确定具体哪个功能出现故障。

来源: README.md1852-1898

测试框架和工具

有许多 JavaScript 测试框架,每个框架都有其优点。干净代码方法并不强制要求特定的框架,但鼓励选择一个适合您的团队工作流程的框架,并使用它编写全面的测试。

框架特性最佳用途
Jest零配置,内置断言、模拟、覆盖率React 应用,通用 JavaScript
Mocha灵活,基于插件,可在 Node 和浏览器中运行需要自定义的项目
JasmineBDD 语法,内置断言和模拟Angular 应用,BDD 风格测试
Cypress端到端测试,真实浏览器,时间旅行调试UI 和集成测试
AVA并发测试运行,最小 API注重性能的测试

来源: README.md1842-1848

测试驱动开发

测试驱动开发(TDD)是一种开发方法,它强调在编写实现代码之前先编写测试。虽然 TDD 不是干净代码的严格要求,但它可以是一种确保全面测试覆盖率并驱动良好设计的有效方法。

TDD 工作流程遵循三个步骤,通常称为“红-绿-重构”

  1. :编写一个失败的测试,该测试定义了预期的行为
  2. 绿:编写使测试通过所需的最小代码
  3. 重构:在保持测试通过的同时改进代码

来源: README.md1845-1847

测试和干净代码原则

测试和干净代码原则是互补的。测试既是代码的文档,也是代码的验证。编写良好的测试可以说明代码应该如何使用,并确信代码能够正常工作。

下表显示了干净代码原则如何映射到测试实践

干净代码原则测试实践
单一职责每个测试一个概念
有意义的名称清晰、描述性的测试名称
小型函数重点突出的测试用例,设置简单
避免副作用独立的测试,互不干扰
DRY(不要重复你自己)组织良好的测试夹具和助手
SOLID 原则可测试的代码架构

来源: README.md1833-1848 README.md1849-1898

JavaScript 中的关键测试概念

在 JavaScript 中实施测试时,有几个概念尤其重要

测试结构

测试应以一致、逻辑的结构进行组织。大多数 JavaScript 测试框架支持 describe/it 模式,该模式允许对测试进行分层组织

测试隔离

测试应该是独立的,不依赖于其他测试创建的状态。这通常涉及适当的设置和拆卸程序

来源: README.md1849-1898

结论

测试是编写干净、可维护的 JavaScript 代码的基础。通过遵循本文档概述的原则,您可以创建一个全面的测试套件,该套件能确保代码的正确性,并促进持续的维护和增强。

要点

  • 测试比快速交付代码更重要
  • 争取高测试覆盖率(理想情况下是 100% 的语句和分支)
  • 为每个概念编写一个测试,以获得清晰度和可维护性
  • 选择适合您团队的测试框架并保持一致使用
  • 考虑测试驱动开发以改进设计和覆盖率

遵循这些测试实践将带来更可靠的代码、更快的开发周期和更好的开发人员体验。

来源: README.md1833-1848