问题
When sharding tests (aka running tests in parallel; ie: shardTestFiles: true
), instead of reporting results when all tests are finished, Protractor reports results for each file when finished.
Does anyone have a workaround for this?
I've tried using an inline plugin with hooks teardown
and postTest
, but neither alter this behavior (still per test file reporting). I've also tried setting up the reporter outside of onPrepare
, as suggested here, but also, no joy.
I'm hoping for an easy solution... but it wouldn't surprise me to find that folks throw their results in a db... also an acceptable answer.
回答1:
I am afraid there is not a easy answer to this,as Protractor overwrites the report files when using any custom plugins. But the below two worked for me. Choose what suits you best
1) Tinker with 'index.js' of Jasmine2HtmlReporter to append file instead of PhantomJs overwrite its using
2) Generate unique HTML reports by configuring Jasmine2HTML reporter from onPrepare() function and consolidate all the reports later
SOLUTION 1: The current code base of Jasmine2HtmlReporter - index.js
uses two functions - phantomWrite()
& nodeWrite()
to write data. Refer here
I have created a new function - appendwrite()
to append instead of overwriting and have modified code to pickup this function
Check out my github code forked out of protractor-jasmine2-html-reporter
function appendwrite(path, filename, text){
var fs = require("fs");
var nodejs_path = require("path");
require("mkdirp").sync(path); // make sure the path exists
var filepath = nodejs_path.join(path, filename);
fs.appendFileSync(filepath,text)
return;
}
And modify the self.writeFile
function in 'node_modules/protractor-jasmine2-html-reporter/index.js' to pickup the new function
try {
appendwrite(path, filename, text);
//phantomWrite(path, filename, text);
return;
} catch (e) { errors.push(' PhantomJs attempt: ' + e.message); }
try {
nodeWrite(path, filename, text);
return;
} catch (f) { errors.push(' NodeJS attempt: ' + f.message); }
And Comment the below code which cleans reports on new run so that you dont see any error cleanup error - CleanUpCode
rmdir(self.savePath);
SOLUTION 2: Generate separate reports based on sessionID for parallel instances by configuring the Jasmine reporter in OnPrepare function
onPrepare: function() {
return new Promise(function (fulfill, reject) {
browser.getCapabilities().then(function (value) {
reportName = value.get('webdriver.remote.sessionid') + '_' + value.get('browserName') + '_' + Math.floor(Math.random()*1E16);
jasmine.getEnv().addReporter(
new Jasmine2HtmlReporter({
savePath: 'target/',
screenshotsFolder: 'images',
consolidate: true,
consolidateAll: true,
filePrefix: reportName + ".html"
})
);
fulfill();
})
});
},
Step 2: Consolidate the reports generated across parallel instances in afterLaunch() method after complete tests are done and all webdriver sessions are closed
afterLaunch: function afterLaunch() {
var fs = require('fs');
var output = '';
fs.readdirSync('target/').forEach(function(file){
if(!(fs.lstatSync('target/' + file).isDirectory()))
output = output + fs.readFileSync('target/' + file);
});
fs.writeFileSync('target/ConsolidatedReport.html', output, 'utf8');
},
You will see reports generated something like below with one ConsolidatedReport also PS: Please ignore any typo and syntax errors. this is just to serve as an example and can be customized
I have answers this earlier at protractor-jasmine2-html-reporter doesn't consolidate results for all test when tests are shared using 'shardTestFiles': true in conf file
回答2:
Solution2-> Step 1. From the latest version of html-reporter, filePrefix should be fileNamePrefix, so function should be:
onPrepare: function() {
return new Promise(function (fulfill, reject) {
browser.getCapabilities().then(function (value) {
reportName = value.get('webdriver.remote.sessionid') + '_' + value.get('browserName') + '_' + Math.floor(Math.random()*1E16);
jasmine.getEnv().addReporter(
new Jasmine2HtmlReporter({
savePath: 'target/',
screenshotsFolder: 'images',
consolidate: true,
consolidateAll: true,
fileNamePrefix: reportName + ".html"
})
);
fulfill();
})
});
},
来源:https://stackoverflow.com/questions/39499847/how-to-make-sharded-protractor-tests-report-after-all-tests-finish-instead-of-p