转自http://www.ruanyifeng.com/blog/2015/12/a-mocha-tutorial-of-examples.html
众所周知对于任何一个项目来说,做好单元测试都是必不可少的一项工作。今天在逛CnodeJs社区的时候,无意中看到一篇介绍nodejs测试工具mocha的贴子。于是自己捣鼓了一阵之后,好像还蛮有趣的样子,因此把我摸索入门的过程记录下来跟大家分享一下:
1、准备工作
- 先新建一个项目文件夹,命名为simpleTest。
- 然后在simpleTest文件夹中创建一个名为test的文件夹,将来用来测试的脚本都放在这个文件夹里面
2、模块安装
首先使用npm以全局方式安装mocha模块:
sudo npm install -g mocha
然后通过命令行进入到simpleTest文件夹中,安装should模块:
sudo npm install should
3、简单实例
准备工作就绪之后,我们可以开始来尝试一些简单的实例,看看我们是如何使用mocha和should.js是进行测试工作的。可以直接先在项目根目录下执行mocha命令,看看有什么情况发生,执行后的结果如下图所示:
运行了,但是什么都没有发生。因为mocha扫描了test文件夹,没有发现可以执行的测试脚本文件。下面我们往test目录中添加一个名为test.js的测试文件,代码如下:
1 require("should"); 2 3 var name = "zhaojian"; 4 5 describe("Name", function() { 6 it("The name should be zhaojian", function() { 7 name.should.eql("zhaojian"); 8 }); 9 }); 10 11 var Person = function(name) { 12 this.name = name; 13 }; 14 var zhaojian = new Person(name); 15 16 describe("InstanceOf", function() { 17 it("Zhaojian should be an instance of Person", function() { 18 zhaojian.should.be.an.instanceof(Person); 19 }); 20 21 it("Zhaojian should be an instance of Object", function() { 22 zhaojian.should.be.an.instanceof(Object); 23 }); 24 }); 25 describe("Property", function() { 26 it("Zhaojian should have property name", function() { 27 zhaojian.should.have.property("name"); 28 }); 29 });
然后重新执行mocha命令,得到的结果如下:
可以看到控制台上已经显示四个测试用例都成功通过了。如果有测试用例没有通过的话,例如我们加上判断name是不是等于epson的语句,控制台的显示如下:
控制台中的信息会明确地告诉我们有多少个测试用例没有通过,并且指出没有通过的测试用例是在哪个模块中的哪个单元。
接下来我们来分析一下之前的代码,首先为了使用should.js的断言库,在代码的开头部分必须引入should模块,但是mocha模块则无需显式引入。
每一个describe语句都可以看作是一个测试模块,它只是起着划分各个模块部分的作用,describe语句的第一个参数就是对该模块的描述。
在describe语句中的it语句才是测试的主体部分,每一个it语句都是一个测试单元,一个测试模块中可以有很多个测试单元。it语句的第一个参数的作用就是描述该单元的测试任务或要求,以便在测试用例数量较多时可以清楚地知道究竟有哪些功能的测试没有通过。
在it语句的回调函数中就可以通过书写should.js断言库中的语句进行测试了。should模块是assert模块的扩展,它的语法可以在上面的代码中看到,都是类似zhaojian.should.be.an.instanceof(Person) 这样的,跟我们日常用的语法几乎一模一样, 非常易于使用。由于篇幅的关系,我只在前面举了一些简单的例子,有关更多should.js的用法可以参考这里的文档: https://github.com/visionmedia/should.js。另外mocha也可以与其他的第三方断言库搭配使用,在这里就不过多介绍了,有兴趣的话可以自己去看。接下来将介绍如何对异步函数进行测试的例子。
4、异步测试
接下来为了进行异步测试,在test目录下创建一个名为testReadFile.js的文件,代码如下:
1 var fs = require("fs"); 2 require("should"); 3 4 describe("readFile", function() { 5 it("The file content should be zhaojian", function(done) { 6 fs.readFile("text.txt", "utf8", function(err, data) { 7 data.should.eql("zhaojian"); 8 done(); 9 }); 10 }); 11 });
再创建一个名为text.txt的文本文件,其内容如下:
执行mocha命令进行测试,结果如下:
观察上面的代码,有一点必须注意的是:在进行异步测试的时候,it语句的回调函数会带有一个参数done。我们必须在要测试的异步函数的回调函数的最后加上done()这一句,否则测试就会出错,因为测试不等异步函数执行完毕就结束了。