Skip to main content

自动化测试

· 6 min read

自动化测试意味着测试是独立于代码的。它们以各种方式运行我们的函数,并将结果与预期结果进行比较。

行为驱动开发(BDD)包含了三部分内容:测试、文档和示例。在 BDD 中,规范先行,实现在后。

测试开发流程

  1. 编写初始规范,测试最基本的功能。
  2. 创建一个最初始的实现。
  3. 检查它是否工作,我们运行测试框架 Mocha 来运行测试。当功能未完成时,将显示错误。我们持续修正直到一切都能工作。
  4. 现在我们有一个带有测试的能工作的初步实现。
  5. 我们增加更多的用例到规范中,或许目前的程序实现还不支持。无法通过测试。
  6. 回到第 3 步,更新程序直到测试不会抛出错误。
  7. 重复第 3 步到第 6 步,直到功能完善。

测试库

以下这些库都既适用于浏览器端,也适用于服务器端。

  • Mocha: 提供了包括通用型测试函数 describeit,以及用于运行测试的主函数。
  • 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 代码块会立即终止。
  • 规范有三种使用方式:

    • 作为 测试 —— 保证代码正确工作。
    • 作为 文档 —— describeit 的标题告诉我们函数做了什么。
    • 作为 案例 —— 测试实际工作的例子展示了一个函数可以被怎样使用。
  • 除了手动地编写 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会分析这些报告,提供一个可视化的界面来展示代码覆盖率,并能够跟踪覆盖率随时间的变化。它还可以在代码审查过程中提供覆盖率信息,帮助开发者确保新提交的代码得到了适当的测试。