单元测试
单元测试一周学习总结
1. 开篇废话
肺话 以前,我可能会各种借口不乐意花时间进行这种“佛性”活动–技术沉淀。“写博客是对工作有很大帮助的”这个道理似乎如影随形,但是上网一顿搜索发现大神级文章那么多,自己就懒得动手了,直接收藏,然后再也没有翻出来看过。。。佛主叹息。。。
激励 感谢群里的大家这么激烈讨论,瞬间压力直线上升。
2. 单元测试
因为前端开发的大多数问题都出在浏览器兼容上,或者界面的交互上,所以很少注意单元测试。接触nodejs后,会发现初始化很多框架项目都会提示是否安装单元测试(Mocha、Jasmine等),使用单元测试作为程序可用性的保障。
主要是测试一段代码(一个函数或者一个对象),代码要足够分离。
2.1 TDD or BDD
* TDD:测试驱动开发
* BDD:行为驱动开发
简而言之,TDD是在执行之前编写测试来驱动代码设计的做法。BDD建议测试行为,不考虑代码具体实现,而是考虑这个场景期待什么结果。
这一周主要是学习BDD测试(Mocha)。Mocha不仅支持BDD(describe),也支持TDD(suite)。
2.2 Mocha
Mocha是express作者的另一个作品。
Mocha本身是不带断言库的,可以根据自己的喜好选择,比如should.js、node内置的assert模块、chai等。
每一个test case都是以describe()开始,用以描述每个test case要测试的内容,可以包含多层describe,最里面是it()函数用来验证结果,it的第一个参数是字符串(用来描述期待的结果),比如“it should …”,如下例子:
首先安装全局mocha,sudo npm install mocha -g
npm install mocha should --save-dev
然后编写测试用例:
describe('Array', function() {
describe('#indexOf()', function() {
it('should return -1 when the value is not present', function() {
assert.equal(-1, [1, 2, 3].indexOf(123))
})
})
})
以上代码是同步执行的,如果想要测试异步的,就使用done().
最后执行mocha(或npm test)即可看到结果。
2.3 整合Travis CI
Travis CI是一个提供持续整合服务的平台,将github于Travis CI整合后,github有任何更新,Travis CI会自动执行测试。
1.使用github登录Travis CI
2.Travis CI会列出github上所有的repository,选择我们要进行测试的项目,激活。
3.我们需要在项目里添加.travis.yml文件,用于写入travis配置。如下:
language: node_js
node_js:
- "9.2.1"
before_script:
- npm install -g mocha
4.进入Travis查看测试结果,测试通过会显示绿色的passing
2.4 Karma
Karma的作者是AngularJS团队。Karma是一个工具,可以通过cli针对浏览器运行JavaScript。Karma运行在浏览器上,而不是虚拟DOM。
全局安装:sudo npm install karma-cli -g
npm install karma karma-chrome-launcher karma-mocha --save-dev
执行karma init进行初始化配置,将会生成一个karma.conf.js文件。具体配置项可以参阅官方配置文档。
在package.json中,配置运行命令:
"scripts": {
"test": "karma start karma.conf.js"
},
通过npm test运行,如果结果正确,则会在控制台显示如下:
Karma v1.7.1 server started at http://0.0.0.0:9887/
Launching browser Chrome with unlimited concurrency
Starting browser Chrome
2.5 再次整合Travis CI
使用chrome浏览器测试
language: node_js
node_js:
- "9.2.1"
scripts:
- node_modules/karma/bin/karma start karma.conf.js --single-run
before_install:
- export CHROME_BIN=chromium-browser
- export DISPLAY=:99.0
- sh -e /etc/init.d/xvfb start
遇到的问题:
- 配置文件singleRun项,默认为false,这将会在执行完之后持续监控,直到10分钟后超时报错。所以需要设置singleRun:true,执行完后自动退出。
- chrome出现报错:
Cannot start Chrome
The SUID sandbox helper binary was found, but is not configured correctly. Rather than run without sandboxing I'm aborting now. You need to make sure that /opt/google/chrome/chrome-sandbox is owned by root and has mode 4755.
查找Travis官方文档找到解决方案Chrome:–no-sandbox
设置config:
cfg对象:
// travis ci 使用chrome测试
customLaunchers: {
Chrome_travis_ci: {
base: 'Chrome',
flags: ['--no-sandbox']
}
}
<!--判断环境为Travis,使用自定义配置浏览器-->
if (process.env.TRAVIS) {
cfg.browsers = ['Chrome_travis_ci'];
}
config.set(cfg);
3. 总结
这次总结只是大概梳理一下学习的单元测试流程,还有很多需要深入学习的地方,在未来还要继续努力。感谢大家。