无痛开启 JavaScript 测试之 Jest

阅读时长 6 分钟读完

随着前端技术的不断发展,JavaScript 已经成为每个前端开发者必不可少的一项技能。除了编写出高质量的 JavaScript 代码,测试也是代码质量保障的重要手段。其中,Jest 是一个常用的测试框架,它不仅易用性强,而且还有很多丰富的特性和扩展,使我们能够轻松地编写、运行和维护各种类型的测试。

Jest 的基础概念

在开始使用 Jest 之前,我们需要了解几个基本概念:

  • 测试用例(test case):对代码中某个模块或功能进行测试的一组测试代码;
  • 断言(assertion):对某一结果进行判断的代码,如果结果符合预期,则测试通过;
  • 测试套件(test suite):包含多个测试用例的集合。

安装 Jest

我们可以通过 npm 安装 Jest:

编写测试用例

假设我们要测试以下函数:

首先,我们需要创建一个名为 sum.test.js 的文件,用于编写测试用例。Jest 默认会自动识别并运行以 .test.js.spec.js 结尾的文件。

一般而言,我们需要使用 test 函数来定义一个测试用例,并使用断言来判断实际输出是否符合预期。例如:

在测试用例中,我们使用 expect 函数来表示期望值,用以与实际值进行比较。如果实际值与期望值不相同,就会抛出错误。在上面的例子中,我们测试了 sum 函数的两个输入,并使用 toBe 断言判断它们的输出结果是否符合预期。

运行测试用例

当我们完成了测试用例的编写之后,就可以运行测试用例了。我们可以在项目的根目录下创建一个名为 package.json 的文件,并在其中添加以下配置:

然后,在命令行中执行以下命令即可运行所有的测试用例:

如果测试通过,输出结果应如下:

Jest 的高级特性

Jest 不仅仅是一个测试框架,它还有很多高级特性,可以使我们的测试更加便利和高效。

匹配器(matchers)

除了 toBe 断言之外,Jest 还提供了很多其他的匹配器,使我们可以根据不同的条件进行断言。例如:

  • toEqual:判断两个对象或数组是否相等;
  • toBeTruthy/toBeFalsy:判断一个值是否为真/假;
  • toContain:判断一个值是否包含在某个数组或字符串中;
  • toMatch:判断一个字符串是否匹配某个正则表达式。

我们可以在测试用例中随意组合这些匹配器,以便测试不同的结果。例如:

-- -------------------- ---- -------
---------------- -- -- -
  ----- ---- - - -- -- -- - --
  ----- ---- - - -- -- -- - --
  ---------------------------

  ----- --- - --------- ---------
  -------------------------------

  ----- --- - ------- -------
  -----------------------------
---

异步处理

在实际的开发过程中,我们经常需要对异步代码进行测试。Jest 提供了多种异步处理方式,使我们可以方便地测试异步代码。

回调函数

如果要测试一个带有回调函数的异步操作,我们可以使用 done 参数来通知 Jest 该测试用例已经完成。例如:

-- -------------------- ---- -------
---------------- ---- -- -
  -------- ------------- -
    ------------- -- -
      -----------
    -- ------
  -

  -------------- -- -
    --------------------------
    -------
  ---
---

在上面的例子中,我们通过 done 参数来通知 Jest,该测试完成。当回调函数被调用时,expect 断言会自动执行,并根据实际结果来判断测试是否通过。

Promise

如果要测试一个返回 Promise 的异步操作,我们可以直接返回 Promise,并使用 resolvereject 函数模拟异步操作的结果。例如:

-- -------------------- ---- -------
--------------- -- -- -
  -------- ----------- -
    ------ --- ----------------- ------- -- -
      ------------- -- -
        ----------------
      -- ------
    ---
  -

  ------ --------------------- -- -
    --------------------------
  ---
---

在上面的例子中,我们使用 return 返回 Promise,然后在 then 回调函数中进行断言。如果 Promise 被 reject,则测试用例会自动失败。

Async/Await

如果你正在使用 ES2017 中引入的 async/await 特性,Jest 也提供了专门的语法,以方便测试异步代码。例如:

-- -------------------- ---- -------
------------------- ----- -- -- -
  -------- ----------- -
    ------ --- ----------------- ------- -- -
      ------------- -- -
        ----------------
      -- ------
    ---
  -

  ----- ---- - ----- ------------
  --------------------------
---

在上面的例子中,我们使用 async/await 来处理异步代码,从而可以使测试代码更加简洁明了。

覆盖率统计

除了编写测试代码之外,我们还需要对测试代码进行覆盖率统计,以确保我们的测试用例能够覆盖到所有的代码路径。Jest 提供了一个内置的覆盖率统计工具,可以轻松地生成测试覆盖率报告。

我们可以在 package.json 文件的 scripts 配置中添加 --coverage 参数,启用 Jest 的覆盖率统计功能。

然后,在命令行中执行 npm test 命令,就可以生成测试覆盖率报告了。

Jest 的覆盖率统计工具会将代码覆盖率分为行、函数和语句等多个维度,以帮助我们全面了解代码的测试覆盖率。这些报告可以帮助我们发现测试代码中可能存在的问题,以及哪些代码路径尚未被覆盖到,从而指导我们进一步完善测试用例。

结论

通过本文的介绍,我们了解了 Jest 的基础概念和运用方法,以及一些高级特性。使用 Jest 可以让我们轻松地编写、运行和维护各种类型的测试,提高我们代码的质量和可靠性。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/676e625de9a7045d0d68f96c

纠错
反馈