Node.js, Travis CI and Coveralls
在 GitHub 或 npm 社区混多了,你肯定见过这些图示:
这些图示是 [shield.io] 提供的服务,当然,像 npm、build、coverage 这些是别的服务提供的:
- npm - [david-dm.org]
- build - [travis-ci.org]
- coverage - [coveralls.io]
其中 build 的作用是在你有 push 或 pull request 的时候,会执行设置好的 build 脚本,并记录 build 的详细日志:
通过 [Travis CI] 可以很方便地执行自动化 build 测试,并且跟踪是否有 commit 会导致 build 错误。
而 [Coveralls] 则是跟踪测试用例的覆盖程度。我之前在 [node-extensions] 里添加了 [Mocha] 测试,但是有部分没写测试用例,结果 push 到 npm 之后,在项目里更新之后引发别的包出错,排查后发现是没写测试用例的那部分代码造成的。像这种情况,就可以要求 coverage 达到 100% 才能用在项目里,这样就能大大提高健壮性。
启用 Travis CI #
首先去到 Travis CI 官网使用 GitHub 账号登录,然后进行如下操作:
完成后在项目根目录添加一个 .travis.yml
文件,内容可以参考我的:
language: node_js
node_js:
- "0.11"
- "0.10"
matrix:
allow_failures:
- node_js: "0.11"
fast_finish: true
script: "npm run-script test-travis"
after_script: "npm install coveralls && cat ./coverage/lcov.info | coveralls"
language
和 node_js
:告诉 Travis CI 这个项目是一个 Node.js 项目,并指定需要测试 v0.10 和 v0.11。
matrix
:是额外配置,这里是告诉 Travis CI 把 v0.11 的 build 结果作为参考,不作为整体 build 成功或失败的依据。
script
:告诉 Travis CI 使用哪个脚本进行 build。
ater_script
:script
执行完毕之后执行的脚本。在这里是把结果发送到 Coveralls。
随后 push 到 GitHub 即可,相当简单!
启用 Coveralls #
依旧是先在 Coveralls 官网使用 GitHub 账号登录,然后进行如下操作:
完成后在项目里执行:
npm install --save-dev mocha istanbul
在 package.json
中的 scripts
添加一个 test-travis
字段:
"scripts": {
"test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/"
}
Coveralls 依赖 LCOV 进行 coverage 的分析,因此需要使用 [istanbul] 来生成报告。然后通过在 .travis.yml
中的 after_script
将结果传送给 Coveralls:
after_script: "npm install coveralls && cat ./coverage/lcov.info | coveralls"
注意的是,我将测试代码放在 test/
下,需要根据实际需要修改。
把改动推送到 GItHub 即可。
注:以上例子均使用主分支 (默认分支) ,如果需要指定分支,请查阅文档。
Conclusion #
Travis CI 和 Coveralls 的设置都非常简单,但却可以让开发变得更简单——只要提交代码即可。
对于前端来说,测试用例可能不太好写,但可以从一些简单的入手,如 JSHint / ESLint 代码检查、RequireJS / Browserify 代码打包等等。在这方面,[jQuery] 是一个非常好的学习例子。
[shield.io]: http://shields.io/
[david-dm.org]: https://david-dm.org/
[travis-ci.org]: https://travis-ci.org/
[Travis CI]: https://travis-ci.org/
[coveralls.io]: https://coveralls.io/
[Coveralls]: https://coveralls.io/
[node-extensions]: https://github.com/chrisyip/node-extensions
[Mocha]: http://visionmedia.github.io/mocha/Travis
[istanbul]: https://www.npmjs.org/package/istanbul
[jQuery]: https://github.com/jquery/jquery