diff --git a/src/common/util.js b/src/common/util.js
index a823288..3e5c9b3 100644
--- a/src/common/util.js
+++ b/src/common/util.js
@@ -1418,10 +1418,13 @@ YSLOW.util = {
* Format test results as TAP for CI
* @see: http://testanything.org/wiki/index.php/TAP_specification
* @param {Array} tests the arrays containing the test results from testResults.
- * @return {String} the results as TAP plain text
+ * @return {Object}:
+ * failures: {Number} total test failed,
+ * content: {String} the results as TAP plain text
*/
formatAsTAP: function (results) {
var i, res, line, offenders, j, lenJ,
+ failures = 0,
len = results.length,
tap = [],
util = YSLOW.util,
@@ -1436,6 +1439,7 @@ YSLOW.util = {
for (i = 0; i < len; i += 1) {
res = results[i];
line = res.ok || res.score < 0 ? 'ok' : 'not ok';
+ failures += (res.ok || res.score < 0) ? 0 : 1;
line += ' ' + (i + 1) + ' ' + res.grade +
' (' + res.score + ') ' + res.name;
if (res.description) {
@@ -1473,14 +1477,19 @@ YSLOW.util = {
}
}
- return tap.join('\n');
+ return {
+ failures: failures,
+ content: tap.join('\n')
+ };
},
/**
* Format test results as JUnit XML for CI
* @see: http://www.junit.org/
* @param {Array} tests the arrays containing the test results from testResults.
- * @return {String} the results as JUnit XML text
+ * @return {Object}:
+ * failures: {Number} total test failed,
+ * content: {String} the results as JUnit XML text
*/
formatAsJUnit: function (results) {
var i, res, line, offenders, j, lenJ,
@@ -1510,13 +1519,14 @@ YSLOW.util = {
if (res.ok) {
cases.push(line + '"/>');
} else {
- failures += 1;
cases.push(line + '">');
// skipped
if (res.score < 0) {
skipped += 1;
cases.push(' score N/A');
+ } else {
+ failures += 1;
}
line = ' ');
- return junit.join('\n');
+ return {
+ failures: failures,
+ content: junit.join('\n')
+ };
},
/**
diff --git a/src/phantomjs/controller.js b/src/phantomjs/controller.js
index 215bdda..874ffba 100644
--- a/src/phantomjs/controller.js
+++ b/src/phantomjs/controller.js
@@ -226,7 +226,9 @@ urls.forEach(function (url) {
// open page
page.startTime = new Date();
page.open(url, function (status) {
- var yslow, ysphantomjs, controller, evalFunc, loadTime, url, resp,
+ var yslow, ysphantomjs, controller, evalFunc,
+ loadTime, url, resp, output,
+ exitStatus = 0,
startTime = page.startTime,
resources = page.resources;
@@ -278,7 +280,8 @@ urls.forEach(function (url) {
// format out with appropriate content type
formatOutput = function (content) {
- var format = (args.format || '').toLowerCase(),
+ var testResults,
+ format = (args.format || '').toLowerCase(),
harness = {
'tap': {
func: ysutil.formatAsTAP,
@@ -311,14 +314,16 @@ urls.forEach(function (url) {
} catch (err) {
threshold = args.threshold;
}
+ testResults = harness[format].func(
+ ysutil.testResults(
+ content,
+ threshold
+ )
+ );
return {
- content: harness[format].func(
- ysutil.testResults(
- content,
- threshold
- )
- ),
- contentType: harness[format].contentType
+ content: testResults.content,
+ contentType: harness[format].contentType,
+ failures: testResults.failures
};
default:
return {
@@ -475,7 +480,7 @@ urls.forEach(function (url) {
}
}
- return output.content;
+ return output;
} catch (err) {
return err;
}
@@ -520,13 +525,15 @@ urls.forEach(function (url) {
evalFunc = new Function(yslow + ysphantomjs + controller);
// evaluate script and log results
- console.log(page.evaluate(evalFunc));
+ output = page.evaluate(evalFunc);
+ exitStatus += output.failures || 0;
+ console.log(output.content);
}
// finish phantomjs
urlCount -= 1;
if (urlCount === 0) {
- phantom.exit();
+ phantom.exit(exitStatus);
}
});
});