自动化测试意味着测试是独立于代码的。它们以各种方式运行我们的函数,并将结果与预期结果进行比较。
行为驱动开发(BDD)包含了三部分内容:测试、文档和示例。在 BDD 中,规范先行,实现在后。
测试开发流程
- 编写初始规范,测试最基本的功能。
- 创建一个最初始的实现。
- 检查它是否工作,我们运行测试框架 Mocha 来运行测试。当功能未完成时,将显示错误。我们持续修正直到一切都能工作。
- 现在我们有一个带有测试的能工作的初步实现。
- 我们增加更多的用例到规范中,或许目前的程序实现还不支持。无法通过测试。
- 回到第 3 步,更新程序直到测试不会抛出错误。
- 重复第 3 步到第 6 步,直到功能完善。
测试库
以下这些库都既适用于浏览器端,也适用于服务器端。
- Mocha: 提供了包括通用型测试函数
describe
和it
,以及用于运行测试的主函数。 - Chai: 提供很多断言(assertion)支持的库。它提供了很多不同的断言。
- Sinon: 用于监视函数、模拟内建函数和其他函数的库。
Mocha
describe("pow", function() {
it("raises to n-th power", function() {
assert.equal(pow(2, 3), 8);
});
});
一个规范(specification, spec)包含三个主要的模块:
describe("title", function() { ... })
表示我们正在描述的功能是什么。it("use case description", function() { ... })
以一种 易于理解 的方式描述特定的用例,第二个参数是用于对其进行测试的函数。保持测试之间独立,一个it
只测试一个功能。assert.equal(value1, value2)
如果实现是正确的,它应该在执行的时候不产生任何错误。当assert
触发一个错误时,it
代码块会立即终止。
规范有三种使用方式:
- 作为 测试 —— 保证代码正确工作。
- 作为 文档 ——
describe
和it
的标题告诉我们函数做了什么。 - 作为 案例 —— 测试实际工作的例子展示了一个函数可以被怎样使用。
除了手动地编写
it
代码块,我们可以使用for
循环来生成它们:describe("pow", function() {
function makeTest(x) {
let expected = x * x * x;
it(`${x} in the power 3 is ${expected}`, function() {
assert.equal(pow(x, 3), expected);
});
}
for (let x = 1; x <= 5; x++) {
makeTest(x);
}
});可以使用嵌套的
describe
来进行分组:describe("pow", function() {
describe("raises x to power 3", function() {
function makeTest(x) {
let expected = x * x * x;
it(`${x} in the power 3 is ${expected}`, function() {
assert.equal(pow(x, 3), expected);
});
}
for (let x = 1; x <= 5; x++) {
makeTest(x);
}
});
// ……可以在这里写更多的测试代码,describe 和 it 都可以添加在这。
});可以设置 before/after 函数来在运行测试之前/之后执行。也可以使用 beforeEach/afterEach 函数来设置在执行 每一个 it 之前/之后执行。
describe("test", function() {
before(() => alert("Testing started – before all tests"));
after(() => alert("Testing finished – after all tests"));
beforeEach(() => alert("Before a test – enter a test"));
afterEach(() => alert("After a test – exit a test"));
it('test 1', () => alert(1));
it('test 2', () => alert(2));
});
/*
运行顺序为:
Testing started – before all tests (before)
Before a test – enter a test (beforeEach)
1
After a test – exit a test (afterEach)
Before a test – enter a test (beforeEach)
2
After a test – exit a test (afterEach)
Testing finished – after all tests (after)
*/
Codecov
Codecov是一个代码覆盖率服务,它提供了一种测量软件测试覆盖率的方法,并帮助开发者了解哪些代码行被测试覆盖到,哪些没有。它可以与GitHub、Bitbucket和GitLab等代码托管平台集成,并支持多种编程语言和测试框架。
开发者可以在本地运行测试套件并生成覆盖率报告,然后将这些报告上传到Codecov。Codecov会分析这些报告,提供一个可视化的界面来展示代码覆盖率,并能够跟踪覆盖率随时间的变化。它还可以在代码审查过程中提供覆盖率信息,帮助开发者确保新提交的代码得到了适当的测试。