如何编写好一个测试用例

最近在着手准备编写一个简单的测试用例,这里记录下所了解的关于搭建和编写测试的一些点。

前言

随着开源的概念和精神在越来越多的人中传开,现在的开源框架和工具数量每天都在增加,而我们从这些中挑选的一个关键指标就是其有没有自动化测试用例,因为一个好的测试用例是保证质量的基本前提。

因为最近在写一个 babel-plugin-pipe 插件,这里就简单记录下如何搭建好一个自动化测试用例。

测试框架

在搭建开始之前,我们需要选取一个自动化测试框架。自动化测试框架提供给我们一键开启自动化测试的功能,基于这个框架,我们后面才能不断的编写和完善相关的用例。当前主流的自动化测试框架有两个:

  1. mocha
  2. jest

两者各有优劣,至于如何选择还需要各位看官各凭喜好。而 jest 是 Facebook 大厂出品,对于 react 等框架有天然的易用性。而 mocha 的 api 相对较少,比较适合笔者这种初次搭建的新手。下面重点介绍 mocha 的相关用法。

mocha

第一步,我们给项目安装 mocha 的测试环境。

1
npm install --save-dev mocha

上面是一个简单的测试用例,我们通过测试框架提供的全局 api 来编写。

1
2
3
4
5
6
7
8
var assert = require('assert');
describe('Array', function() {
describe('#indexOf()', function() {
it('should return -1 when the value is not present', function() {
assert.equal([1, 2, 3].indexOf(4), -1);
});
});
});

下面是运行结果:

测试运行结果

除了上面的同步测试结果,还支持根据异步回调的结果进行测试。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// 1. callback 方式,全局 api:done(err)
describe('User', function() {
describe('#save()', function() {
it('should save without error', function(done) {
var user = new User('Luna');
user.save(function(err) {
if (err) done(err);
else done();
});
});
});
});

// 2. promise 方式,和 chai 框架一起使用,chai 后面有介绍
describe('#find()', function() {
it('respond with matching records', function() {
return db.find({type: 'User'}).should.eventually.have.length(3);
});
});

// 3. async/await
describe('#find()', function() {
it('responds with matching records', async function() {
const users = await db.find({type: 'User'});
users.should.have.length(3);
});
});

而如果某个测试失败,则相关的错误对象上会挂载有两个属性,预期的结果 expected 和实际的表现 actual

断言库

上面的测试框架 mocha 只是给当前项目提供了几个全局的 api 编写测试用例,例如上面的 describe unite 和 it item api,而判断某个表达式是否符合预期的结果,这个时候我们需要引入一些断言工具。上面的 require('assert') 就是引入的 NodeJS 内置的断言工具。现在常用的一些断言工具如下:

  1. chai
  2. should
  3. assert

总结

本文主要介绍了当前主流的测试框架和断言库,两者的完美结合可以帮助我们快速高效的编写测试用例。