基于mocha、should.js、karma、travis ci实现前端自动化持续测试
前颜(yan)
首先你觉得测试重要吗?为什么重要?
这里举个例子,假如你写了一个逻辑稍微比较复杂的函数,这个函数被很多地方调用到,那么当过了N多天之后,你可能快要忘记这里面的逻辑了,此时你可能出于某种原因需要为这个函数增加一些功能,修改这个函数的代码,那么你要怎么做才能做到修改后不影响其他的调用者呢,或者说,你要怎么做,才能快速的知道哪些地方受影响,哪些地方不受影响呢?
很明显,答案就是:跑测试用例
对于单元测试,我能想到的好处有:
改进代码设计,提高代码质量:单元测试会强制你对代码进行合理的设计,解耦,写出可测试的代码
允许重构,你可以放心的对代码进行修改,因为你有测试用例来确保你的代码能够按符合预期要求
快速定位bug
既然单元测试这么重要,那么就应该好好重视起来。
前端测试框架和库
目前前端测试框架和库主要有assert、should.js、expect、chai、mocha、jasmine、karma以及travis ci等等。
其中assert、should.js、expect、chai属于断言库,实现对js代码进行断言测试。
而mocha、jasmine属于测试框架,测试框架通过使用断言库对js代码进行测试,生成测试报告,除此之外,测试框架还提供了各种生命周期。
karma则属于测试工具,能够模拟各种环境来运行你的测试代码,比如Chrome,Firefox,mobile等等。
重点要介绍的是travis ci,是一个远程免费的持续集成(CI)服务,你可以通过配置绑定你github上的项目,并且配置运行环境,实现只要github上有代码更新,travis就会自动运行构建和测试,并反馈运行结果。
下面对不同断言库进行简单的介绍:
断言库(主要实现对代码进行测试)
assert :TDD风格断言,是nodejs的一个断言测试模块,提供的api不是很多
1
assert.equal(foo, 'foo');
should.jd:BDD风格断言库,should相对于assert有比较丰富的api,并且其语法非常的语义化
1
2
3foo.should.be();
bar.should.have();
foo.should.bot.be();expect:BDD风格断言,语法和should.js类似
1
2
3
4expect(foo).to.be();
expect(foo).to.eql();
expect(foo).to.be.a();
expect(foo).not.to.be.an();chai:支持BDD/TDD双模式,同时支持should/expect/assert三种风格的断言库,还有强大的插件机制
1
2
3
4
5
6
7
8
9
10
11should
chai.should();
foo.should.be.a('string');
expect
var expect = chai.expect;
expect(foo).to.be.a('string');
assert
var assert = chai.assert;
assert.typeOf(foo, 'string');
接下来,我将使用mocha、should.js、karma、travis ci实现几个前端js自动化持续测试的demo。大家可以克隆相应的代码下来对应着看,由于篇幅有限,下面只讲关键点。
demo1(mocha+should.js)
特点:直接使用mocha和should.js来跑测试用例。
代码地址:https://github.com/SimpleCodeCX/myCode/tree/master/test/demo1
关键点说明:
1 下载相关依赖(mocha和should.js)
1 | npm instal -g mocha (全局) |
2 添加主功能(待测试)代码
1 | #src/main.js |
3 添加测试用例
1 | #test/test.js |
4 配置mocha.opts
1 | #test/mocha.opts |
关于mocha.opts的更多配置(代替命令行参数):https://mochajs.org/#mochaopts
5 运行
1 | mocha |
输出测试结果
1 | >mocha |
demo2(mocha+should.js+karma)
特点:
- 通过karma调用mocha测试框架来进行代码测试
- 优点在于karma能模拟浏览器比如Chrome、Firefox来运行测试代码
代码地址:https://github.com/SimpleCodeCX/myCode/tree/master/test/demo2
关键点说明:
1 下载相关依赖(mocha、should.js和karma)
1 | npm install --save-dev mocha(demo1使用的是全局mocha,这里是karma调用mocha) |
2 添加主功能(待测试)代码
1 | #src/main.js(注意和demo1的区别) |
3 添加测试用例
1 | #test/test.js(注意和demo1的区别) |
4 配置karma(karma.conf.js)
运行 karma init
,按提示操作。
1 | Which testing framework do you want to use ? |
然后在karma.conf.js中的files添加相关的依赖模块:1
2
3
4
5files: [
'node_modules/should/should.js',
'test/**/*.js',
'src/**/*.js'
]
关于karma的更多配置:http://karma-runner.github.io/3.0/config/configuration-file.html
5 运行
1 | karma start |
karma会运行chrome浏览器,并且输出测试结果
1 | >karma start |
demo3(mocha+should.js+karma+travis)
代码地址:https://github.com/SimpleCodeCX/myCode/tree/master/test/demo3
1 复制demo2的工程作为demo3
2 在github上创建一个新工程demo3,并关联本地仓库
1 | git remote add origin git@github.com:SimpleCodeCX/demo3.git |
3 使用github账号登录travis官网,同步并激活监听github上的demo3项目
参考文章:
http://www.ruanyifeng.com/blog/2017/12/travis_ci_tutorial.html
4 配置travis(.travis.yml)
在demo3的根目录下新建.travis.yml文件,并做如下配置:1
2
3
4
5
6
7
8
9language: node_js
node_js:
- "8"
script: karma start --single-run
before_install:
- npm install
- export CHROME_BIN=chromium-browser
- export DISPLAY=:99.0
- sh -e /etc/init.d/xvfb start
5 提交到远程仓库上
1 | git add . |
6 此时可以在travis上查看测试反馈
有关travis的配置文档:https://docs.travis-ci.com/user/languages/javascript-with-nodejs/
参考文档:
https://nodejs.org/api/assert.html
https://github.com/shouldjs/should.js
https://github.com/Automattic/expect.js
https://www.chaijs.com
https://mochajs.org
https://jasmine.github.io
http://karma-runner.github.io
https://docs.travis-ci.com/user/languages/javascript-with-nodejs
本文作者 : Simple
原文链接 : https://simplecodecx.github.io/blog/20181108/16dc22b.html
版权声明 : 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!