今天提交到 github 的一个项目 core-wrappers(https://github.com/akira-cn/core-wrappers)用了 mocha 做单元测试,在集成到 travis-ci + coveralls 的时候遇到问题,google 不到比较合适的 mocha+travis-ci+coveralls 集成的办法,于是只好自己摸索了一遍,摸索结果记录如下:
关于依赖:
首先需要使用 jscover 来转换文件(PS,这个插件好小众,才 20+ star)
jscover src test-cov
jscover test test-cov
可以将 src 和 test 目录下所有的文件都处理完丢到 test-cov 目录下。需要注意的是,如果文件夹下有 es6 或 es7 的文件,需要用 babel 先编译过,不然要报错的。
接着执行 mocha,同时使用插件 mocha-lcov-reporter 来生成 lcov 文件。
mocha test-cov --reporter=mocha-lcov-reporter > test-cov/coverage.lcov
有了这个 lcov 文件,travis-ci 需要它同步给 coveralls,这样才可以有测试覆盖率的结果。因此,在 .travis.yml 里面这么写:
after_script: "npm install coveralls && cd test-cov && cat coverage.lcov | ../node_modules/coveralls/bin/coveralls.js && cd .. && rm -rf ./test-cov && rm -rf ./test-app"
这样就完成了测试覆盖结果。
这里还有个小问题,因为 src 下的文件需要 jscover 转换,那么测试用例文件的 require 依赖也要依赖转换后的文件,可以通过很多办法处理,比如备份源文件然后覆盖,最后测试完成改回来,不过我采用了直接在测试用例里面用 try-catch 来加载包的一个办法:
var w;
try{
w = require("../test-cov/core-wrappers");
}catch(ex){
w = require("../src/core-wrappers");
}
最后,我们成功集成了 travis-ci 和 coveralls,就可以在项目文档里看到这样的图标啦: