Node.js, Travis CI and Coveralls

在 GitHub 或 npm 社区混多了,你肯定见过这些图示:

Badges

这些图示是 [shield.io] 提供的服务,当然,像 npm、build、coverage 这些是别的服务提供的:

其中 build 的作用是在你有 push 或 pull request 的时候,会执行设置好的 build 脚本,并记录 build 的详细日志:

Travis CI Project Page

通过 [Travis CI] 可以很方便地执行自动化 build 测试,并且跟踪是否有 commit 会导致 build 错误。

而 [Coveralls] 则是跟踪测试用例的覆盖程度。我之前在 [node-extensions] 里添加了 [Mocha] 测试,但是有部分没写测试用例,结果 push 到 npm 之后,在项目里更新之后引发别的包出错,排查后发现是没写测试用例的那部分代码造成的。像这种情况,就可以要求 coverage 达到 100% 才能用在项目里,这样就能大大提高健壮性。

启用 Travis CI #

首先去到 Travis CI 官网使用 GitHub 账号登录,然后进行如下操作:

Travis CI Add Project

Travis CI Enable Project

完成后在项目根目录添加一个 .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"

languagenode_js:告诉 Travis CI 这个项目是一个 Node.js 项目,并指定需要测试 v0.10 和 v0.11。

matrix:是额外配置,这里是告诉 Travis CI 把 v0.11 的 build 结果作为参考,不作为整体 build 成功或失败的依据。

script:告诉 Travis CI 使用哪个脚本进行 build。

ater_scriptscript 执行完毕之后执行的脚本。在这里是把结果发送到 Coveralls。

随后 push 到 GitHub 即可,相当简单!

启用 Coveralls #

依旧是先在 Coveralls 官网使用 GitHub 账号登录,然后进行如下操作:

Coveralls Add Repo 1

Coveralls Add Repo 2

完成后在项目里执行:

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

 
21
Kudos
 
21
Kudos

Now read this

Function direct call vs func.call() vs func.bind() in JavaScript

JavaScript 有三种函数调用方式 (其他奇葩的不讨论) : func() func.call() 和 func.apply() var binded = func.bind() 第一种很好理解,就是直接调用。 第二种很常用,经常用于调整函数的 this 指向的对象。如: function say_hello () { return 'Hello, ' + this.name } say_hello.call({ name: 'John' }) //... Continue →