如何优化 Jest 的测试速度?

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