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格式,请注意修改. 一介布衣