Skip to content
This repository was archived by the owner on Apr 22, 2024. It is now read-only.

Commit d7f0127

Browse files
Merge pull request #4 from DevExpress/multiple-streams
Support multiple reporters (closes #3)
2 parents 42c8e82 + 549c207 commit d7f0127

File tree

4 files changed

+80
-19
lines changed

4 files changed

+80
-19
lines changed

README.md

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,16 +39,32 @@ testcafe(options)
3939

4040
Configures the test runner to run tests in the specified browsers.
4141

42-
#### reporter
42+
#### reporters
4343

44-
*Type*: `String`
44+
*Type*: `String` || `Array`
4545

4646
*Default*: `spec`
4747

4848
*Details*: [Reporters](https://devexpress.github.io/testcafe/documentation/using-testcafe/common-concepts/reporters.html)
4949

50-
Specifies the reporter.
50+
Specifies the reporter or an array of reporters.
51+
52+
Reporter can be specified by reporter name, or an object with following properties:
5153

54+
* `name` - name of the reporter,
55+
* `file` - the path to a file where reporter's output will be redirected,
56+
* `outStream` - an Writable Stream instance where reporter's output will be piped. The `file` property will be ignored if `outStream` is specified.
57+
58+
Examples:
59+
```js
60+
"reporters": "minimal"
61+
```
62+
```js
63+
"reporters": { "name": "json", "file": "report.json" }
64+
```
65+
```js
66+
"reporters": { "name": "xunit", "outStream": fs.createWriteStream("report.xml") }
67+
```
5268
#### filter
5369

5470
*Type*: `function(testName, fixtureName, fixturePath)`

index.js

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,30 @@
1+
var fs = require('fs');
12
var defaults = require('lodash.defaults');
3+
var flatten = require('lodash.flatten');
24
var createTestCafe = require('testcafe');
35
var PluginError = require('gulp-util').PluginError;
46
var through = require('through2');
57

8+
var DEFAULT_REPORTER = 'spec';
9+
610
var DEFAULT_OPTS = {
711
browsers: [],
812
filter: null,
913
screenshotsPath: null,
1014
takeScreenshotsOnFail: false,
11-
reporter: 'spec',
15+
reporter: [],
1216
skipJsErrors: false,
1317
quarantineMode: false,
14-
selectorTimeout: 10000,
15-
16-
// NOTE: exposed for testing purposes
17-
reportOutStream: null
18+
selectorTimeout: 10000
1819
};
1920

2021
module.exports = function gulpTestCafe (opts) {
2122
var files = [];
2223

2324
opts = defaults({}, opts, DEFAULT_OPTS);
2425

26+
opts.reporter = flatten([opts.reporter]);
27+
2528
function onFile (file, enc, cb) {
2629
if (file.isNull())
2730
cb(null, file);
@@ -45,13 +48,25 @@ module.exports = function gulpTestCafe (opts) {
4548

4649
var runner = testcafe.createRunner();
4750

48-
return runner
51+
runner
4952
.src(files)
5053
.browsers(opts.browsers)
5154
.filter(opts.filter)
52-
.screenshots(opts.screenshotsPath, opts.takeScreenshotsOnFail)
53-
.reporter(opts.reporter, opts.reportOutStream)
54-
.run(opts);
55+
.screenshots(opts.screenshotsPath, opts.takeScreenshotsOnFail);
56+
57+
opts.reporter.forEach(function (reporter) {
58+
if (typeof reporter === 'string')
59+
runner.reporter(reporter);
60+
else {
61+
runner.reporter(
62+
reporter.name || DEFAULT_REPORTER,
63+
reporter.file ? fs.createWriteStream(reporter.file) : reporter.outStream
64+
);
65+
}
66+
});
67+
68+
return runner.run(opts);
69+
5570
})
5671
.then(function (failed) {
5772
if (failed > 0)

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
"dependencies": {
5454
"gulp-util": "^3.0.7",
5555
"lodash.defaults": "^4.2.0",
56+
"lodash.flatten": "^4.4.0",
5657
"testcafe": "latest",
5758
"through2": "^2.0.1"
5859
},

test/test.js

Lines changed: 36 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ it('Should run tests', function () {
1818
var reportStream = createReportOutStream();
1919

2020
var ps = gulpTestCafe({
21-
browsers: ['chrome', 'firefox'],
22-
reportOutStream: reportStream
21+
browsers: ['chrome', 'firefox'],
22+
reporter: { outStream: reportStream }
2323
});
2424

2525

@@ -44,8 +44,8 @@ it('Should fail if tests fail', function () {
4444
var reportStream = createReportOutStream();
4545

4646
var ps = gulpTestCafe({
47-
browsers: ['chrome'],
48-
reportOutStream: reportStream
47+
browsers: ['chrome'],
48+
reporter: { outStream: reportStream }
4949
});
5050

5151
var resultsPromise = Promise.race([
@@ -71,9 +71,8 @@ it('Should fail if configuration is incorrect', function () {
7171
var reportStream = createReportOutStream();
7272

7373
var ps = gulpTestCafe({
74-
browsers: ['chrome'],
75-
reporter: 'unknown',
76-
reportOutStream: reportStream
74+
browsers: ['chrome'],
75+
reporter: { name: 'unknown', outStream: reportStream },
7776
});
7877

7978
var resultsPromise = Promise.race([
@@ -92,3 +91,33 @@ it('Should fail if configuration is incorrect', function () {
9291

9392
return resultsPromise;
9493
});
94+
95+
it('Should use multiple reporters', function () {
96+
var reportStream1 = createReportOutStream();
97+
var reportStream2 = createReportOutStream();
98+
99+
var ps = gulpTestCafe({
100+
browsers: ['chrome', 'firefox'],
101+
reporter: [{ outStream: reportStream1 }, { name: 'json', outStream: reportStream2 }]
102+
});
103+
104+
var resultsPromise = Promise.race([
105+
promisifyEvent(ps, 'error'),
106+
107+
promisifyEvent(ps, 'done').then(function () {
108+
expect(reportStream1.data).contains('Chrome');
109+
expect(reportStream1.data).contains('Firefox');
110+
expect(reportStream1.data).contains('3 passed');
111+
112+
expect(reportStream2.data).contains('Chrome');
113+
expect(reportStream2.data).contains('Firefox');
114+
expect(reportStream2.data).contains('"passed": 3');
115+
})
116+
]);
117+
118+
ps.write(vinylFile.readSync('test/fixtures/passing1.js'));
119+
ps.write(vinylFile.readSync('test/fixtures/passing2.js'));
120+
ps.end();
121+
122+
return resultsPromise;
123+
});

0 commit comments

Comments
 (0)