随着前端技术的不断发展,JavaScript 已经成为每个前端开发者必不可少的一项技能。除了编写出高质量的 JavaScript 代码,测试也是代码质量保障的重要手段。其中,Jest 是一个常用的测试框架,它不仅易用性强,而且还有很多丰富的特性和扩展,使我们能够轻松地编写、运行和维护各种类型的测试。
Jest 的基础概念
在开始使用 Jest 之前,我们需要了解几个基本概念:
- 测试用例(test case):对代码中某个模块或功能进行测试的一组测试代码;
- 断言(assertion):对某一结果进行判断的代码,如果结果符合预期,则测试通过;
- 测试套件(test suite):包含多个测试用例的集合。
安装 Jest
我们可以通过 npm 安装 Jest:
npm install --save-dev jest
编写测试用例
假设我们要测试以下函数:
function sum(a, b) { return a + b; }
首先,我们需要创建一个名为 sum.test.js
的文件,用于编写测试用例。Jest 默认会自动识别并运行以 .test.js
或 .spec.js
结尾的文件。
一般而言,我们需要使用 test
函数来定义一个测试用例,并使用断言来判断实际输出是否符合预期。例如:
test('sum', () => { expect(sum(1, 2)).toBe(3); expect(sum(2, 3)).toBe(5); });
在测试用例中,我们使用 expect
函数来表示期望值,用以与实际值进行比较。如果实际值与期望值不相同,就会抛出错误。在上面的例子中,我们测试了 sum
函数的两个输入,并使用 toBe
断言判断它们的输出结果是否符合预期。
运行测试用例
当我们完成了测试用例的编写之后,就可以运行测试用例了。我们可以在项目的根目录下创建一个名为 package.json
的文件,并在其中添加以下配置:
{ "scripts": { "test": "jest" } }
然后,在命令行中执行以下命令即可运行所有的测试用例:
npm test
如果测试通过,输出结果应如下:
PASS sum.test.js ✓ sum (2 ms) Test Suites: 1 passed, 1 total Tests: 1 passed, 1 total Snapshots: 0 total Time: 0.616 s, estimated 1 s Ran all test suites.
Jest 的高级特性
Jest 不仅仅是一个测试框架,它还有很多高级特性,可以使我们的测试更加便利和高效。
匹配器(matchers)
除了 toBe
断言之外,Jest 还提供了很多其他的匹配器,使我们可以根据不同的条件进行断言。例如:
- toEqual:判断两个对象或数组是否相等;
- toBeTruthy/toBeFalsy:判断一个值是否为真/假;
- toContain:判断一个值是否包含在某个数组或字符串中;
- toMatch:判断一个字符串是否匹配某个正则表达式。
我们可以在测试用例中随意组合这些匹配器,以便测试不同的结果。例如:
-- -------------------- ---- ------- ---------------- -- -- - ----- ---- - - -- -- -- - -- ----- ---- - - -- -- -- - -- --------------------------- ----- --- - --------- --------- ------------------------------- ----- --- - ------- ------- ----------------------------- ---
异步处理
在实际的开发过程中,我们经常需要对异步代码进行测试。Jest 提供了多种异步处理方式,使我们可以方便地测试异步代码。
回调函数
如果要测试一个带有回调函数的异步操作,我们可以使用 done
参数来通知 Jest 该测试用例已经完成。例如:
-- -------------------- ---- ------- ---------------- ---- -- - -------- ------------- - ------------- -- - ----------- -- ------ - -------------- -- - -------------------------- ------- --- ---
在上面的例子中,我们通过 done
参数来通知 Jest,该测试完成。当回调函数被调用时,expect
断言会自动执行,并根据实际结果来判断测试是否通过。
Promise
如果要测试一个返回 Promise 的异步操作,我们可以直接返回 Promise,并使用 resolve
和 reject
函数模拟异步操作的结果。例如:
-- -------------------- ---- ------- --------------- -- -- - -------- ----------- - ------ --- ----------------- ------- -- - ------------- -- - ---------------- -- ------ --- - ------ --------------------- -- - -------------------------- --- ---
在上面的例子中,我们使用 return
返回 Promise,然后在 then
回调函数中进行断言。如果 Promise 被 reject,则测试用例会自动失败。
Async/Await
如果你正在使用 ES2017 中引入的 async/await
特性,Jest 也提供了专门的语法,以方便测试异步代码。例如:
-- -------------------- ---- ------- ------------------- ----- -- -- - -------- ----------- - ------ --- ----------------- ------- -- - ------------- -- - ---------------- -- ------ --- - ----- ---- - ----- ------------ -------------------------- ---
在上面的例子中,我们使用 async/await
来处理异步代码,从而可以使测试代码更加简洁明了。
覆盖率统计
除了编写测试代码之外,我们还需要对测试代码进行覆盖率统计,以确保我们的测试用例能够覆盖到所有的代码路径。Jest 提供了一个内置的覆盖率统计工具,可以轻松地生成测试覆盖率报告。
我们可以在 package.json
文件的 scripts
配置中添加 --coverage
参数,启用 Jest 的覆盖率统计功能。
{ "scripts": { "test": "jest --coverage" } }
然后,在命令行中执行 npm test
命令,就可以生成测试覆盖率报告了。
Jest 的覆盖率统计工具会将代码覆盖率分为行、函数和语句等多个维度,以帮助我们全面了解代码的测试覆盖率。这些报告可以帮助我们发现测试代码中可能存在的问题,以及哪些代码路径尚未被覆盖到,从而指导我们进一步完善测试用例。
结论
通过本文的介绍,我们了解了 Jest 的基础概念和运用方法,以及一些高级特性。使用 Jest 可以让我们轻松地编写、运行和维护各种类型的测试,提高我们代码的质量和可靠性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/676e625de9a7045d0d68f96c