做者:Marcin Wanago翻译:疯狂的技术宅javascript
原文:https://wanago.io/2018/08/27/...前端
未经容许严禁转载java
本文是 JavaScript 测试教程 系列中的第1部分webpack
有多种不一样种类的测试,我会首先解释其中的一部分。首先,我将介绍单元测试的基础知识,即测试应用程序的每一个部分并检查它们是否适合使用。为此咱们将使用 Facebook 开发的测试框架 Jest。它已经准备就绪,并具备进行测试所需的功能。程序员
测试是用来检查你代码的代码。测试会使你对本身的程序更有信心。它们还可以防止你在修复一个 bug 时生成另外一个 bug。你能够测试程序的方方面面,从单个函数及其返回值到在浏览器中运行的复杂程序。因为这是本课程的第一篇文章,所以我会简要对比一些流行的测试类型。web
单元测试覆盖了代码块,确保它们在运行时没有问题。被测试的单元能够是函数、模块和类等。单元测试应该相互隔离而且彼此独立。对于给定的输入,用单元测试检查结果,经过尽早发现问题并避免退化,能够帮助你确保程序的每一个部分都能按预期工做。面试
即便你的全部单元测试都经过了,也只能表明每一个部分能够正常工做。尽管如此,该程序仍可能失败。集成测试涵盖跨模块流程,其中各个模块在一块儿工做时进行组合和测试。多亏了他,你能够用一种方法来确保你的代码在总体上可以正常运行。正则表达式
与其余类型的测试相反,端到端测试始终在浏览器(或相似浏览器)环境中运行。它多是打开的真正浏览器,而且在其中运行测试。它也多是无头浏览器环境,即没有用户界面运行的浏览器。 E2E 测试的重点是在咱们正在运行的程序中模拟实际用户。他们将模拟滚动,单击和键入之类的行为,并从实际用户的角度检查咱们的程序是否运行良好。npm
Jest 是 Facebook 开发的测试框架。它的目标之一是经过现成可用的工具提供“零配置”体验。它已经存在了一段时间,而且快速可靠。json
npm install --save-dev jest
别忘了把它添加到 npm 脚本中。
"scripts": { "test": "jest" }
为了简单起见,我在这里将 Jest 与简单的纯 Node.js 模块一块儿使用(不包括 webpack)。稍后咱们将学习如何在 React 中使用 Jest
首先,让咱们建立一些能够测试的简单函数。
function divide(a, b) { return a / b; } module.exports = divide;
Jest 用正则表达式肯定要测试的文件。默认状况下,若是它们位于 tests 目录中或以 test 或 .spec 为后缀,将执行 .js 和 .jsx 文件。你能够在项目的 package.json 文件中用 testRegex 属性指定。
"jest": { "testRegex": "(/__tests__/.*|(\\.|/)(test|spec))\\.jsx?$" }
最后,让咱们建立测试文件。为了遵循默认的命名配置,咱们将其命名为 divide.test.js。
const divide = require('./divide'); test('dividing 6 by 3 equals 2', () => { expect(divide(6, 3)).toBe(2); });
用 npm run test
命令运行该测试:
PASS ./divide.test.js ✓ dividing 6 by 3 equals 2 (5ms)
test 函数用来运行测试。它包含三个参数:测试的名称,包含指望值的函数和超时(以毫秒为单位)。超时默认为 5 秒,并指定若是测试花费的时间太长,则停止测试以前要等待多长时间。
expect 函数用于测试值。做为参数,它接受你要测试的值:在咱们的例子中,它是 divide 函数的返回。你能够调用一组 matcher 函数(例子中使用的 toBe)以某种方式测试该值。有关完整信息,请访问 Jest 文档。
每一个文件一般会有一个以上的测试。使用 Jest,你可使用 describe 函数对它们进行分组。它建立了一个能够合并多个测试的块。为了更好地显示它,让咱们在全局 Math 对象上进行一些测试。
describe('in the math global object', () => { describe('the random function', () => { it('should return a number', () => { expect(typeof Math.random()).toEqual('number'); }) it('should return a number between 0 and 1', () => { const randomNumber = Math.random(); expect(randomNumber).toBeGreaterThanOrEqual(0); expect(randomNumber).toBeLessThan(1); }) }); describe('the round function', () => { it('should return a rounded value of 4.5 being 5', () => { expect(Math.round(4.5)).toBe(5); }) }); })
你可能会注意到用了
it 函数而不是
test 函数。它是经常使用的别名。运行
it === test
会返回
true。
像这样对测试进行分组可使代码更整洁。你应该关心程序代码和对其进行测试的代码的质量。
若是出现问题,除了使代码更具可读性以外,它还有助于提供更友好的错误消息。若是将测试改成包含 expect(typeof Math.random()).toEqual('string')
,则会看到如下消息:
FAIL ./math.test.js ● in the math global object › the random function › should return a number expect(received).toEqual(expected) Expected value to equal: "string" Received: "number"
做为介绍,咱们已经解释了最基本的 JavaScript 测试类型。涵盖的第一类测试是“单元测试”。为了执行它们,咱们已经了解了 Jest 框架的基础知识。它包括有关如何运行测试(安装和文件命名)的知识。为了运行测试,咱们使用了test、 it 和 describe 函数。