Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ and then:

`cross-env COVERAGE=true ember test`

When running with `parallel` set to true, the final reports can be merged by using `ember coverage-merge`. The final merged output will be stored in the `coverageFolder`.

## Configuration

Configuration is optional. It should be put in a file at `config/coverage.js`.
Expand All @@ -45,6 +47,8 @@ Configuration is optional. It should be put in a file at `config/coverage.js`.

- `useBabelInstrumenter`: Defaults to `false`. Whether or not to use Babel instrumenter instead of default instrumenter. The Babel instrumenter is useful when you are using features of ESNext as it uses your Babel configuration defined in `ember-cli-build.js`.

- `parallel`: Defaults to `false`. Should be set to true if parallel testing is being used, for example when using [ember-exam](https://github.com/trentmwillis/ember-exam) with the `--parallel` flag. This will generate the coverage reports in directories suffixed with `_<random_string>` to avoid overwriting other threads reports. These reports can be joined by using the `ember coverage-merge` command.

#### Example
```js
module.exports = {
Expand Down
10 changes: 10 additions & 0 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,16 @@ module.exports = {
return new BroccoliMergeTrees([tree, instrumentedNode], { overwrite: true });
},

includedCommands: function () {
return {
'coverage-merge': require('./lib/coverage-merge')
};
},

/**
* If coverage is enabled attach coverage middleware to the express server run by ember-cli
* @param {Object} startOptions - Express server start options
*/
serverMiddleware: function(startOptions) {
this.testemMiddleware(startOptions.app);
},
Expand Down
9 changes: 9 additions & 0 deletions lib/attach-middleware.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ var Istanbul = require('istanbul');
var config = require('./config');
var path = require('path');
var fs = require('fs-extra');
var crypto = require('crypto');

function logError(err, req, res, next) {
console.error(err.stack);
Expand All @@ -17,6 +18,14 @@ module.exports = function(app, options) {
function(req, res) {
var collector = new Istanbul.Collector();
var _config = config(options.root);

if (_config.parallel) {
_config.coverageFolder = _config.coverageFolder + '_' + crypto.randomBytes(4).toString('hex');
if (_config.reporters.indexOf('json') === -1) {
_config.reporters.push('json');
}
}

var reporter = new Istanbul.Reporter(null, path.join(options.root, _config.coverageFolder));
var sync = true;

Expand Down
56 changes: 56 additions & 0 deletions lib/coverage-merge.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
'use strict';

var path = require('path');
var Istanbul = require('istanbul');
var config = require('./config');
var dir = require('node-dir');
var Promise = require('rsvp').Promise;

/**
* Merge together coverage files created when running in multiple threads,
* for example when being used with ember exam and parallel runs.
*/
module.exports = {
name: 'coverage-merge',
description: 'Merge multiple coverage files together.',
run: function () {
var collector = new Istanbul.Collector();
var _config = this._getConfig();
var projectRoot = this.project.root;
var reporter = new Istanbul.Reporter(null, path.join(projectRoot, _config.coverageFolder));
var coverageDirRegex = new RegExp(_config.coverageFolder + '_.*');

return new Promise(function (resolve, reject) {
dir.readFiles(projectRoot, {matchDir: coverageDirRegex, match: /coverage-final\.json/},
function (err, coverageSummary, next) {
if (err) {
reject(err);
}
collector.add(JSON.parse(coverageSummary));
next();
},
function (err) {
if (err) {
reject(err);
}

if (_config.reporters.indexOf('json-summary') === -1) {
_config.reporters.push('json-summary');
}

reporter.addAll(_config.reporters);
reporter.write(collector, false, function () {
resolve();
});
});
});
},

/**
* Get project configuration
* @returns {Configuration} project configuration
*/
_getConfig: function () {
return config(this.project.root);
}
};
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@
"extend": "^3.0.0",
"fs-extra": "^0.26.7",
"istanbul": "^0.4.3",
"node-dir": "^0.1.16",
"source-map": "0.5.6",
"string.prototype.startswith": "^0.2.0"
},
Expand Down