Jest 是一款使用广泛的 JavaScript 测试框架,它可以协助前端开发者快速编写测试用例,测试代码的质量。当测试用例的数量增加时,测试执行时间相应也会增加,这给开发者带来的负担也会随之增加。在测试过多或大型的项目中,优化测试速度变得尤为重要,因为缓慢的测试速度会降低开发者的效率。在本文中,我们将讨论如何通过优化 Jest 配置及测试用例设计来提高测试速度。
1. 单元测试与集成测试的区别
在硬编码编写代码前,我们需要定义、计划和创建好测试用例,以确保代码的正确性,测试用例包括两种类型:单元测试与集成测试。单元测试是指针对某一个函数或模块进行的测试,可以通过让函数或模块运行来检查其正确性。另一方面,集成测试则需要将多个系统组合在一起,以确保它们可以无缝地协同工作。
在测试时,如果遇到了诸如 API 调用,计算复杂度较高的算法、IoT 组件集成等高耗时的操作,则应在集成测试中处理。
2. 如何优化 Jest 配置
针对 Jest 测试速度较慢的原因,我们可以通过调整 Jest 配置文件文件中的变量来优化测试速度。
2.1. TestMatch
TestMatch 是最基本的 Jest 配置,用于指定 Jest 应该如何查找测试文件,而文件的查找所耗费的时间是相当可观的,特别是在大型项目中。
我们可以通过以下的格式来指定 Jest 的测试文件:
-------------- - - ---------- - ------------------------------ --------------------------------- -- -
在这个配置中,我们使用 testMatch 字段来定义 Jest 的测试文件查找规则。在这种情况下,Jest 将在 tests 目录中,以及在文件名中包含 .test.js 或者 .spec.js 后缀的任何文件上运行测试。
同时,我们还可以添加一个 lookup 表示符,指定 Jest 的查找范围。下面是一个示例:
-------------- - - ------ - ----------------- -- ---------- - --------------------------- ------------------------------ -- -
上面的示例配置指定 Jest 只在以 /test 开头的文件夹中查找测试文件。
2.2. Bail
Bail 的作用是,在第一个测试用例失败后自动停止测试。默认情况下,Jest 会在所有测试用例执行完毕后一次性返回结果,这可能会消耗大量时间。使用 Bail,可以提高测试性能。
当我们在 Jest 配置中添加 bail: true 后, Jest 只运行该测试套件中的第一个失败用例,并停止测试。在测试套件配置文件中的示例为:
-------------- - - ----- ----- --
2.3. Cache
Cache 可以用于缓存 Jest 运行测试时的结果,这有助于加快测试的执行速度。默认情况下,Jest 会在每个测试运行之前重置所有缓存。这对于测试简单代码来说是一个很好的功能,但是对于测试执行时间很长的测试而言,这将耗费很多时间。因此启用 Cache 功能可以显著提高测试性能。
在 Jest 配置中启用缓存,需要将 cache 字段设置为 true:
-------------- - - ------ ----- --
此外,Jest 还提供了一种缓存的生成方式,可以将其输出到文件中:
-------------- - - --------------- ------------------- --
2.4. CollectCoverage
CollectCoverage 用于收集应用程序中代码的测试覆盖率。启用 Coverage Sampling 有助于提高应用程序的稳定性。这会导致 Jest 的执行速度变慢,但是它能够提供更深入的测试结果。例如:
-------------- - - ---------------- ----- ------------------ - --------------- -- --
2.5. Max Workers
在多 CPU 或多核处理器的电脑上,Jest 的默认行为是同时使用 CPU 核心来并行执行测试。你可以通过增加 --maxWorkers 参数,以允许 Jest 创建更多的进程来执行测试任务:
---- --------------
3. 如何优化测试用例设计
当优化 Jest 配置不是一个特别有效的选项时,使用更好的测试用例设计是一个更好的选择。通过了解一些测试最佳实践,可以优化测试代码。
3.1. 集成测试和单元测试的区别
针对性能敏感或耗时操作的单测,应该放到低速 USB 的断电节点机上执行。这将使测试更加符合实际情况,能够快速识别工作流程中存在的问题。如果必要的话,在一个 CI 环境中运行集成测试,这可以更快地找到问题所在。
3.2. 隔离测试
测试用例的最终需求是提高测试的执行效率,也就是需要减少测试的执行时间。为了快速执行测试,首先要避免将无序测试合并在一起。单元测试应针对每一个组件进行独立测试,而不是在一个统一桶中运行测试,这样有助于快速识别和解决问题。
3.3. 避免交互式测试
使用非交互式测试套件可以加快复杂测试的执行速度。这是因为交互式测试需要人工干预,这会影响测试速度。一个更好的选择是使用代码覆盖率测试,记录代码中存在的问题。
3.4. 缩小执行范围
多数情况下,你不需要测试整个应用程序。相反,你应该缩小要测试的应用程序的范围,测试所有功能。这样做可以提高测试速度。
3.4.1. 局部测试和全局测试的优化
局部测试优先于全局测试,它们识别和解决问题的速度更快。在全局测试中,Jest 测试所有的测试套件。这会导致大量的时间消耗。如果你想加快测试速度,应该创建一系列单元测试,运行它们以缩小测试的范围。
3.5. 资源管理
在 Jest 的测试代码中使用外部资源需要连接外部服务或数据库,这会减慢测试速度。为了避免这种情况,你可以使用 Jest 的 mocking 或 Stubbing 功能来模拟外部服务或者数据库。
-------------- --------- -- -- - --- -------- ----- ----------- - - - --- -- ----- ------- -- - --- -- ----- ------- -- - --- -- ----- ------ -- -- ------------- -- - ------- - ---------------------- --- ------------ -- - ------------------ --- ---------- --- ---- ---- -- ----- -- --- ------- -- -- - ----- --------- - ------------------------------- ------------------------- - ---- ----- ----- ------- --- ------------------------------------------------ ----- ----- ------- - --- ---------- ------ ------------------- ------------------ -- - -------------------------------------- - --- -- ----- ------- -- - --- -- ----- ------- -- --- ---------------------------------------- --- --- ---------- ----- ---- ---- -- ----- ------- -- -- - ----- --------- - ------------------------------- ------------------------- - ---- ----- ----- ------- ------------------------------------------------ ----- ----- ------- - --- ---------- ------ ---------------------------------- -- - ----------------------------------------- ---------------------------------------- --- --- ---
上面的示例使用了 Sinon.js,它有助于模拟外部资源的行为。这可以使测试不受外部因素影响。
3.6. 选择对象
在 Jest 的测试代码中,选择正确的对象很重要。如果您使用错误的对象,它们可能不受快照测试代码的影响,从而导致测试失败。确保您使用正确的对象以确保快照测试的正确性。
3.7. 使用 Should/Expect/Assert
使用 Should/Expect/Assert 函数,你可以编写易于阅读和维护的测试代码。在阅读测试代码时,人们通常会看到这些断言函数。使用 Should/Expect/Assert 函数类型可以使测试代码更加易于阅读和理解。
例如,下面是一个使用 expect 的测试代码,它可以帮助你更加清晰地理解测试的意图:
-------------- ------- ---- ---------- -------- -- - ---------- ------ - ---- ---- --- --- ----- -------- -- - --------------------- --------------- --- ---
在这个方法中,我们使用了 Jest 的全局 expect 函数。
结论
优化 Jest 的测试速度需要慎重考虑。选择正确的测试细节,例如应该如何配置 Jest 变量和测试代码该如何编写,这些细节可以对测试产生重要的影响。同时,使用额外的索引、缓存,可以达到一定的优化效果,以提高 Jest 测试的效率,并确保测试更好地符合不同的业务需求。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/67354bdd0bc820c5824d97fc