node.js使用mocha自动化测试程序

之前有过一篇比较简单的关于 mocha 做自动化测试的帖子, mocha测试

今天稍晚详细点说下.

常见的开源项目你都会发现test目录,当然我们自己创建的项目建议也加上此目录,在这个目录下做自动化测试.目前node.js下做自动化测试的工具也很多,今天我们主要来介绍下如何使用mocha进行自动化测试.


安装 mocha 

npm install -g mocha


这样你就可以创建测试脚本了,如下:

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


上面是官网上的一个例子,直接拿过来说明一下.

assert 是一个断言模块,node.js源码中包含此模块,当然你可以选择其他第三方的断言包来做测试.

上面的例子就是想对Array类下 indexOf 方法做一个测试,断言 indexOf 得到的值是否等于前面的赋值.


实际中的测试都比较复杂,可能测试文件 a.js 和测试文件 b.js 是有关系的,也就是说 b.js 中用到的参数都是又 a.js 提供的. 

这是可能要借助一个全局变量文件 globalConstant.js 文件,内容如下:

global.global_user={};

很简单的一个全局用户变量,那么在测试a.js的时候我们需要给这个全局变量赋值,然后测 b.js 的时候再使用这个变量值.


a.js 的内容如下:

var assert = require("assert");
require('../utils/FakeHTTP');

var game_user = {
        user_id: 0,
        token: ''
};

var userid='zhangzhi',
    password='000000';
 //这里的 userid 和 password 俩个参数完全可以设置 before(function(){ ...} 从前面的文件中导出,这里我们简单直接定义.

 //after 是测试完成后把一些后面文件需要的参数全部导出.
after(function() {
        global_share_data.game_user = game_user;
});

describe("Email User", function() {
	//定义user变量
	var game_user = {
	game_id: 0,
        user_id: 0,
        token: ''
    };
    
	it("login by userID and password", function(done) {
            FakeHTTP.request('/account/login', game.makeSign({
                user_id: userid,
                password: password
            }), function(status, res) {
                assert.equal(status, 200);
                assert.equal(!res.error_code, true, res.error);
                assert.ok(res.user_id, 'Not found user_id');
                assert.ok(res.user_token, 'Not found user token');
                game_user.game_id = res.gameID;
                game_user.user_id = res.userid;
                game_user.token = res.user_token;
                done();
            });
        });
});

上面有注释,大概需要大家了解的一个是 before 一个是 after 

before 用在测试用例之前,就是需要提前准备的一些参数,一般是此测试文件之前的文件导出的.

after 是用在测试用例执行完成后,需要导出的一些参数以供后面的测试文件使用这些参数,(所以我上面注释了 userid 和 password 应该是前面文件after 以后,在 a.js before 里使用即可,就不需要在文件里面指定变量值了.


ok,上面的 a.js 测试自行完成后导出了 game_user  我们在b.js 文件里就可以使用这个导出变量了.如下代码:

var assert = require("assert");
require('../utils/FakeHTTP');

describe("Topic", function() {
    var main_content='发布测试内容';

    before(function() {
        game_user = global_share_data.game_user;
        //这里导入了上一个文件 a.js 导出的变量
    });

    describe("Game User Create topic", function() {
        it("response topic_id when created", function(done) {
            FakeHTTP.request('/topic/create', game.makeSdkSign({
                game_id: game_user.game_id,
                content: main_content,
                user_token: game_user.token
            }), function(status, res) {
                assert.equal(status, 200);
                assert.equal(!res.error_code, true, res.error);
                assert.equal(!res.data.topic_id, false, res.error);
                done();
            });
        });
   });

上面的b.js 测试文件是想验证用户发帖的功能,前提就是此用户必须存在,所以在 before(){  }函数里导入了 a.js 文件导出的 game_user

发帖以后断言输出值的http状态,error_code,并且时不时有 topic_id


注意事项:

1.上面例子中都引入了 

utils/FakeHTTP

这个文件里定义了些方法,其中的 request 就是一个,表示一个常规的http模拟请求,类似于npm上面的第三方包 request .

2.因为我上面测试的都是api借口,http调用之后返回值全部是json格式.类似下面

{  
    "error_code": 0,  
    "data": {    
        "topic_id": 357
  }
}

所以我在断言的时候直接使用 res.error_code  或者  res.data.topic_id  .
如果你的方法返回的不是这个json格式,请注意修改. 一介布衣



回到顶部