专栏名称: 51Testing软件测试网
51Testing软件测试网,人气最旺的软件测试技术门户,提供软件测试社区交流,软件测试博客,人才服务,测试沙龙,测试杂志,测试资料下载等全方位信息服务,是国内最专业的软件测试就业培训、企业服务供应商...
目录
相关文章推荐
51好读  ›  专栏  ›  51Testing软件测试网

Mocha+Chai单元测试并没有想象中难

51Testing软件测试网  · 公众号  · 测试  · 2017-01-16 17:32

正文

请到「今天看啥」查看全文




作为过来人,首先想说的是: 不要怕!

刚从前端转来做Node的,从来没接触过单元测试,一听这个名词就觉得高大上。加上周围一些前端儿也基本没有接触过单元测试,总把单元测试看得比较遥远,中文教程也点到即止并有点过分重视命令行参数的讲解,让我迟迟不敢轻易入坑。

然而,当项目确实希望用到单元测试的时候,我决定抛开内心的恐惧,硬着头皮认认真真地读英文版的Mocha和chai Assert文档,发现,真的不过如此而已!远远没有想象中的难,Hour级入门。

现在,我有一种感觉:不跑单元测试会让我感到恐慌......

这一次又给了我深刻的教训:接触一个新技术的时候,不要慌,不要害怕,不过分依赖过来人的看法,不亲自实践又怎知难易呢?

罗里吧嗦了一大堆,现在开始步入正题......

一、单元测试

单元测试分为两种:

  • TDD: Test-Driven Development,测试驱动开发,注重输出结果。

  • BDD: Behavior Driven Development,行为驱动开发,注重测试逻辑。

对于TDD、BDD的区别可查看: 关于TDD、BDD和DDD的一些看法 。

对于单元测试,推荐查看 【译】每个单元测试必须回答的 5 个问题 。

mocha默认的模式是BDD。

二、 Mocha介绍

在Node.js中,目前比较流行的单元测试组合是 mocha + chai 。mocha是一个测试框架,chai是一个断言库,所以合称”抹茶”。

断言库类型有: jasmine 、 should.js 、 chai 、 assert 。哪个更好主要看团队和项目需要吧,个人喜欢chai断言库的assert风格,更接近原生也更人性化。

Mocha主要特性有:

  • 支持异步的测似用例,如Promise;

  • 支持代码覆盖率coverage测试报告;

  • 支持配置不同的测试(如断言库);

… …

本文使用的是: Mocha + chai(assert风格) 。

安装如下:

npm install mocha -g

npm install mocha

npm install chai

跑Mocha测试的命令:

mocha [debug] [options] [files]

如:

mocha --recursive test/

三、Mocha的三个基本方法:

Mocha有三个基本方法:

describe(moduleName, function)

describe是可嵌套的,描述测试用例是否正确。

describe('测试模块的描述', function() {

// ....

});

it(info, function)

info为描述性说明。一个it对应一个单元测试用例。

describe('单元测试的描述,一般写明用途和返回值', function() {

// ....

});

assert.equal(exp1, exp2)

mocha的断言语句,判断exp1是否等于exp2。

四、Mocha的异步代码测试:

done

一个it里面只有一个done。

done标识回调的最深处,也是嵌套回调函数的末端。

备注: 在mocha v3.x版本,Promise回调不需要使用 done 来标识回调最深处,并且在Promise回调中是用done回报错。

describe('User', function() {

describe('#save()', function() {

it('should save without error', function(done) {

var user = new User('Luna');

user.save(done);

});

});

});

五、 Test Hooks方法:

before() 、 after() 、 beforeEach() 、 afterEach() 是基于BDD风格提出的。用于预处理和test后的处理。

Test Hooks方法的几个注意点:

  • beforeEach会对当前describe下的所有子case生效;

  • before和after的代码没有特殊顺序要求;

  • 同一个describe下的执行顺序为before、beforeEach、afterEach、after;

  • 当一个it有多个before的时候,执行顺序是从最外围的describe的before开始,其他同理。

describe('hooks', function() {

before(function() {

// runs before all tests in this block

});

after(function() {

// runs after all tests in this block

});

beforeEach(function() {

// runs before each test in this block

});

afterEach(function() {

// runs after each test in this block

});

// test cases

});

Hooks的三种写法:

beforeEach(function() {

});

beforeEach(function nameFun() {

});

beforeEach("some description", functio n() {

});

... ...

推荐阅读

点击阅读☞ 先解决思想:为何要写单元测试?

点击阅读☞ 写单元测试是个技术活

点击阅读☞ 关于验收测试的几个困惑

点击阅读☞ 写PHP代码,你搞过单元测试吗?

点击阅读☞ 单元测试军规:如何编写更好的单元测试

点击左下角“阅读原文”查看更多内容!







请到「今天看啥」查看全文