编写测试

Reads: 2007 Edit

1 配置环境

新建工程 mocha-demo, 首先生成npm工程,运行命令

npm init

作为项目的依赖进行安装

$ npm install --save-dev mocha

编写了一个hello.js,并且输出一个简单的求和函数:

// hello.js

module.exports = function (...rest) {
    var sum = 0;
    for (let n of rest) {
        sum += n;
    }
    return sum;
};

这个函数非常简单,就是对输入的任意参数求和并返回结果。

如果我们想对这个函数进行测试,可以写一个test.js,然后使用Node.js提供的assert模块进行断言:

// test.js

const assert = require('assert');
const sum = require('./hello');

assert.strictEqual(sum(), 0);
assert.strictEqual(sum(1), 1);
assert.strictEqual(sum(1, 2), 3);
assert.strictEqual(sum(1, 2, 3), 6);

在的package.json中设置一个测试脚本:

"scripts": {
    "test": "mocha"
  }

然后运行:

npm test
或者运行
npm test 测试文件名.js

assert模块非常简单,它断言一个表达式为true。如果断言失败,就抛出Error。可以在Node.js文档中查看assert模块的所有API。

参考资料: https://nodejs.org/dist/latest/docs/api/assert.html

单独写一个test.js的缺点是没法自动运行测试,而且,如果第一个assert报错,后面的测试也执行不了了。

如果有很多测试需要运行,就必须把这些测试全部组织起来,然后统一执行,并且得到执行结果。这就是我们为什么要用mocha来编写并运行测试。

2 编写配置文件

编写 hello-test.js

const assert = require('assert');

const sum = require('./hello');

describe('#hello.js', () => {

    describe('#sum()', () => {
        it('sum() should return 0', () => {
            assert.strictEqual(sum(), 0);
        });

        it('sum(1) should return 1', () => {
            assert.strictEqual(sum(1), 1);
        });

        it('sum(1, 2) should return 3', () => {
            assert.strictEqual(sum(1, 2), 3);
        });

        it('sum(1, 2, 3) should return 6', () => {
            assert.strictEqual(sum(1, 2, 3), 6);
        });
    });
});

这里我们使用mocha默认的BDD-style的测试。describe可以任意嵌套,以便把相关测试看成一组测试。

每个it("name", function() {...})就代表一个测试。例如,为了测试sum(1, 2),我们这样写:

it('sum(1, 2) should return 3', () => {
    assert.strictEqual(sum(1, 2), 3);
});

编写测试的原则是,一次只测一种情况,且测试代码要非常简单。我们编写多个测试来分别测试不同的输入,并使用assert判断输出是否是我们所期望的。

运行测试

下一步,我们就可以用mocha运行测试了。运行命令

npm test hello-test.js

关于作者

王硕,网名信平,十多年软件开发经验,业余架构师,精通Java/Python/Go等,喜欢研究技术,著有《PyQt 5 快速开发与实战》《Python 3.* 全栈开发》,多个业余开源项目托管在GitHub上,欢迎微博交流。


Comments

Make a comment

www.ultrapower.com ,王硕的博客,专注于研究互联网产品和技术,提供中文精品教程。 本网站与其它任何公司及/或商标无任何形式关联或合作。