专栏首页京程一灯JavaScript 测试教程 part 1:用 Jest 进行单元测试[每日前端夜话0xE7]

JavaScript 测试教程 part 1:用 Jest 进行单元测试[每日前端夜话0xE7]

本文是 JavaScript 测试教程 系列中的第1部分

  • 1. JavaScript测试教程-part 1:用 Jest 进行单元测试
  • 2. JavaScript测试教程–part 2:引入 Enzyme 并测试 React 组件
  • 3. JavaScript测试教程–part 3:测试 props,挂载函数和快照测试
  • 4. JavaScript测试教程–part 4:模拟 API 调用和模拟 React 组件交互

有多种不同种类的测试,我会首先解释其中的一部分。首先,我将介绍单元测试的基础知识,即测试应用程序的每个部分并检查它们是否适合使用。为此我们将使用 Facebook 开发的测试框架 Jest。它已经准备就绪,并具有进行测试所需的功能。

测试的类型

测试是用来检查你代码的代码。测试会使你对自己的程序更有信心。它们还能够防止你在修复一个 bug 时生成另一个 bug。你可以测试程序的方方面面,从单个函数及其返回值到在浏览器中运行的复杂程序。由于这是本课程的第一篇文章,因此我会简要对比一些流行的测试类型。

单元测试

单元测试覆盖了代码块,确保它们在运行时没有问题。被测试的单元可以是函数、模块和类等。单元测试应该相互隔离并且彼此独立。对于给定的输入,用单元测试检查结果,通过尽早发现问题并避免退化,可以帮助你确保程序的每个部分都能按预期工作。

集成测试

即使你的所有单元测试都通过了,也只能代表每个部分可以正常工作。尽管如此,该程序仍可能失败。集成测试涵盖跨模块流程,其中各个模块在一起工作时进行组合和测试。多亏了他,你可以用一种方法来确保你的代码在整体上能够正常运行。

端到端测试(E2E)

与其他类型的测试相反,端到端测试始终在浏览器(或类似浏览器)环境中运行。它可能是打开的真正浏览器,并且在其中运行测试。它也可能是无头浏览器环境,即没有用户界面运行的浏览器。E2E 测试的重点是在我们正在运行的程序中模拟实际用户。他们将模拟滚动,单击和键入之类的行为,并从实际用户的角度检查我们的程序是否运行良好。

用 Jest 进行单元测试

Jest 是 Facebook 开发的测试框架。它的目标之一是通过现成可用的工具提供“零配置”体验。它已经存在了一段时间,并且快速可靠。

1npm install --save-dev jest

别忘了把它添加到 npm 脚本中。

package.json
1"scripts": {
2  "test": "jest"
3}

为了简单起见,我在这里将 Jest 与简单的纯 Node.js 模块一起使用(不包括 webpack)。稍后我们将学习如何在 React 中使用 Jest

首先,让我们创建一些可以测试的简单函数。

divide.js
1function divide(a, b) {
2  return a / b;
3}
4module.exports = divide;

Jest 用正则表达式确定要测试的文件默认情况下,如果它们位于 tests 目录中或以 test.spec 为后缀,将执行 .js.jsx 文件。你可以在项目的 package.json 文件中用 testRegex 属性指定。

package.json
1"jest": {
2  "testRegex": "(/__tests__/.*|(\\.|/)(test|spec))\\.jsx?$"
3}

最后,让我们创建测试文件。为了遵循默认的命名配置,我们将其命名为 divide.test.js

divide.test.js
1const divide = require('./divide');
2
3test('dividing 6 by 3 equals 2', () => {
4  expect(divide(6, 3)).toBe(2);
5});

npm run test 命令运行该测试:

1 PASS  ./divide.test.js
2  ✓ dividing 6 by 3 equals 2 (5ms)

test 函数用来运行测试。它包含三个参数:测试的名称,包含期望值的函数和超时(以毫秒为单位)。超时默认为 5 秒,并指定如果测试花费的时间太长,则中止测试之前要等待多长时间。

expect 函数用于测试值。作为参数,它接受你要测试的值:在我们的例子中,它是 divide 函数的返回。你可以调用一组 matcher 函数(例子中使用的 toBe)以某种方式测试该值。有关完整信息,请访问 Jest 文档。

分组测试

每个文件通常会有一个以上的测试。使用 Jest,你可以使用 describe 函数对它们进行分组。它创建了一个可以合并多个测试的块。为了更好地显示它,让我们在全局 Math 【https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random】对象上进行一些测试。

 1describe('in the math global object', () => {
 2
 3  describe('the random function', () => {
 4    it('should return a number', () => {
 5      expect(typeof Math.random()).toEqual('number');
 6    })
 7    it('should return a number between 0 and 1', () => {
 8      const randomNumber = Math.random();
 9      expect(randomNumber).toBeGreaterThanOrEqual(0);
10      expect(randomNumber).toBeLessThan(1);
11    })
12  });
13
14  describe('the round function', () => {
15    it('should return a rounded value of 4.5 being 5', () => {
16      expect(Math.round(4.5)).toBe(5);
17    })
18  });
19
20})

你可能会注意到用了 it 函数而不是 test 函数。它是常用的别名。运行 it === test 会返回 true

像这样对测试进行分组可以使代码更整洁。你应该关心程序代码和对其进行测试的代码的质量。

如果出现问题,除了使代码更具可读性之外,它还有助于提供更友好的错误消息。如果将测试改为包含 expect(typeof Math.random()).toEqual('string'),则会看到以下消息:

1 FAIL  ./math.test.js
2  ● in the math global object › the random function › should return a number
3
4    expect(received).toEqual(expected)
5
6    Expected value to equal:
7      "string"
8    Received:
9      "number"

总结

作为介绍,我们已经解释了最基本的 JavaScript 测试类型。涵盖的第一类测试是“单元测试”。为了执行它们,我们已经了解了 Jest 框架的基础知识。它包括有关如何运行测试(安装和文件命名)的知识。为了运行测试,我们使用了testitdescribe 函数。

原文:https://wanago.io/2018/08/27/testing-javascript-tutorial-types-of-tests-of-unit-testing-with-jest/

本文分享自微信公众号 - 前端先锋(jingchengyideng),作者:疯狂的技术宅

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 情人节,孤单的你要让自己的github项目更加高大上

    昨天把这个博客网站的代码开源放在了github上,然后刚好不巧看到百度EFE写的文章前端开源项目持续集成三剑客,突然想起好多项目的ReadMe文件确实看着很酷炫...

    疯狂的技术宅
  • 用 Jest 进行 JavaScript 测试[每日前端夜话0xB6]

    在技术术语中测试意味着检查我们的代码是否符合某些预期。例如:给定一些输入,一个名为“transformer”的函数应返回预期的输出。

    疯狂的技术宅
  • 在HTTP/2中管理CSS和JS

    在HTTP/2的时代里,在你的网站里发布CSS和JS跟以前大不相同了,以下是我实践的一份建议。

    疯狂的技术宅
  • 为什么对比测试可能会扼杀转化率

    前言:对比测试可能导致产品转化率下降?你没听错,看完本文你就会找到答案! 如果你已经尝试了所有方法,但产品的转化率依然处于下滑趋势,那么对比测试可能是导致这种现...

    iCDO互联网数据官
  • 如何组建测试团队(一)

    张树臣
  • A/B测试

    在营销活动中,A / B测试能用于优化落地页,为其吸引更多流量,并将这些流量转化为有效线索。据统计,A/B测试能为B2B企业的落地页新增30%~40%的线索,电...

    Ptengine
  • 全栈软件测试工程师宝典连载(1)

    《软件测试艺术》作者G.J.Myers对软件测试定义。软件测试是为了发现错误而执行程序的过程。它包括以下三个方面。

    小老鼠
  • 自动化测试与手动测试 必须知道的重要差异

    我们知道,每个项目都有三个重要方面,例如质量,成本和时间。任何项目的目标都是在控制完成项目所需的成本和时间的同时获得预期的输出。

    用户7466307
  • 软件测试的方法

    尽早和尽量多的发现被测对象中的缺陷,应该是测试人员测试过程中最常提起的一个测试目标,也是所谓测试价值的一个的重要体现。发现缺陷的目的是推动开发人员定位和修复问题...

    用户7880705
  • 测试无定法,测试必有法:软件测试策略运用之道

    软件测试实施中,综合运用测试策略,就是根据项目的实际情况协调好手上有限的测试资源和要素,从项目整体上分析测试难点、破解测试痛点、控制测试风险,在恰当的测试阶段运...

    新梦想IT职业教育

扫码关注云+社区

领取腾讯云代金券