Selenium 如何避免在使用量角器并行测试时重写生成的XML报告
我试图使用jasmine Reporter(JunitXmlReporter)生成xml报告,但当我在Selenium网格上运行4个实例的量角器测试时,并行运行多个spec文件时,结果会被覆盖。 Xml报告始终显示上次运行的spec文件结果 这是我使用jasmine reporter的功能。有人能帮我做些什么改变吗。这样我就可以得到所有运行的规范文件的合并报告Selenium 如何避免在使用量角器并行测试时重写生成的XML报告,selenium,junit,jasmine,protractor,jasmine-reporters,Selenium,Junit,Jasmine,Protractor,Jasmine Reporters,我试图使用jasmine Reporter(JunitXmlReporter)生成xml报告,但当我在Selenium网格上运行4个实例的量角器测试时,并行运行多个spec文件时,结果会被覆盖。 Xml报告始终显示上次运行的spec文件结果 这是我使用jasmine reporter的功能。有人能帮我做些什么改变吗。这样我就可以得到所有运行的规范文件的合并报告 onPrepare: function() { let jasmineReporters = require('jasmine
onPrepare: function() {
let jasmineReporters = require('jasmine-reporters');
jasmine.getEnv().addReporter(new jasmineReporters.JUnitXmlReporter({
consolidateAll: false,
savePath: 'xmlCloudlets_Reports',
filePrefix: + '-xmloutput'
}));
}
仅供参考,我正在使用config.js文件中的shardTestFiles:true和maxInstance:4进行并行测试。
Protractor@5.2.0
茉莉花-reporters@2.2.1设置报告器时,您可以使用以下代码。这对我很有效,
You can use below code while setting up the reporter. This worked for me,
var DEFAULT_SUITE_DIR = 'target/chrome-reports';
setupDefaultReporters: function(suiteDirectory) {
return browser.getSession().then(function(session) {
var HtmlScreenshotReporter = require('protractor-angular-screenshot-reporter');
var SpecReporter = require('jasmine-spec-reporter/src/jasmine-spec-reporter.js');
var jasmineReporters = require('jasmine-reporters');
var suiteDir = suiteDirectory || DEFAULT_SUITE_DIR;
if (!junitReporter) {
var junitReportFile = 'xml-results-' + session.getId() + '-' + Date.now() + '-';
console.log('JUnit reporter using file: ', junitReportFile);
junitReporter = new jasmineReporters.JUnitXmlReporter({
savePath: suiteDir,
filePrefix: junitReportFile,
consolidateAll: false,
consolidate: true,
// Use space instead of dot to separate suite names
useDotNotation: false,
// Include a timestamp in suite names to make them unique in case of duplicate names
modifySuiteName: function(suiteName, suite) {
return suiteName + ' ' + Date.now();
}
});
}
if (!screenshotReporter) {
screenshotReporter = new HtmlScreenshotReporter({
baseDirectory: suiteDir + '/screenshots',
docName: 'chrome-summary-results.html',
takeScreenShotsOnlyForFailedSpecs: true,
docTitle: 'Protractor Tests Report - Chrome',
preserveDirectory: false
}).getJasmine2Reporter();
}
if (!specReporter) {
specReporter = new SpecReporter({displayStacktrace: 'all'});
}
jasmine.getEnv().addReporter(junitReporter);
jasmine.getEnv().addReporter(screenshotReporter);
jasmine.getEnv().addReporter(specReporter);
});
},
After completing execution you need to merge the reports by using below function
mergeJUnitReports: function(suiteDirectory, exitCode) {
console.log('Merging JUnit reports...');
var deferred = Promise.defer();
var suiteDir = suiteDirectory || DEFAULT_SUITE_DIR;
var destinationFile = suiteDir + '/xml-results.xml';
var fs = require('fs');
var sourceFiles = fs.readdirSync(suiteDir)
.filter(function(filename) {
return filename.match(/^xml-results-.*.xml$/);
})
.map(function(filename) {
return suiteDir + '/' + filename;
});
console.log('Source JUnit report files: ', sourceFiles);
console.log('Destination JUnit report file: ', destinationFile);
var fs = require('fs');
var startTag = '<testsuites>';
var endTag = '</testsuites>';
var result = '<?xml version="1.0" encoding="UTF-8" ?>' + startTag;
sourceFiles.forEach(function(sourcePath) {
var contents = fs.readFileSync(sourcePath, 'utf8');
var startIndex = contents.indexOf(startTag) + startTag.length;
var endIndex = contents.indexOf(endTag);
var suites = contents.substring(startIndex, endIndex);
result += suites;
});
result += endTag;
fs.writeFileSync(destinationFile, result, 'utf8');
console.log('JUnit reports merged into file: ', destinationFile);
return exitCode;
},
Your conf will contains the calls for merge report like below
afterLaunch: function(exitCode) {
return helpers.mergeJUnitReports(suiteDir, exitCode);
},
and Call for setting reporter will go to conf - onPrepare function.
var DEFAULT_SUITE_DIR='target/chrome reports';
setupDefaultReporters:函数(suiteDirectory){
返回browser.getSession().then(函数(会话){
var htmlscreenshorteporter=require(“量角器-角度-屏幕截图-报告器”);
var SpecReporter=require('jasmine-spec-reporter/src/jasmine spec reporter.js');
var jasmineReporters=require('jasmine-reporters');
var suiteDir=suiteDirectory | | DEFAULT_SUITE_DIR;
如果(!junitReporter){
var junitReportFile='xml results-'+session.getId()+'-'+Date.now()+'-';
log('junitreporter使用文件:',junitReportFile);
junitReporter=newjasminereporters.JUnitXmlReporter({
保存路径:suiteDir,
filePrefix:junitReportFile,
全部:错,
对,,
//使用空格而不是点分隔套件名称
useDotNotation:false,
//在套件名称中包含时间戳,以便在名称重复时使其唯一
modifySuiteName:函数(suiteName,套件){
返回suiteName+“”+日期.now();
}
});
}
如果(!screenshotReporter){
screenshotReporter=新的HtmlScreenshotReporter({
baseDirectory:suiteDir+“/屏幕截图”,
docName:'chrome summary results.html',
对于不合格的规格,只拍摄屏幕快照:正确,
docTitle:“量角器测试报告-Chrome”,
保存目录:false
}).getJasmine2Reporter();
}
如果(!specReporter){
specReporter=newspecreporter({displayStacktrace:'all'});
}
jasmine.getEnv().addReporter(junitReporter);
jasmine.getEnv().addReporter(screenshotReporter);
jasmine.getEnv().addReporter(specReporter);
});
},
完成执行后,您需要使用下面的函数合并报告
mergeJUnitReports:函数(suiteDirectory,exitCode){
log('Merging JUnit reports…');
var deferred=Promise.deferred();
var suiteDir=suiteDirectory | | DEFAULT_SUITE_DIR;
var destinationFile=suiteDir+'/xml results.xml';
var fs=需要('fs');
var sourceFiles=fs.readdirSync(suiteDir)
.filter(函数(文件名){
返回文件名.match(/^xml结果-.*.xml$/);
})
.map(函数(文件名){
返回suiteDir+'/'+文件名;
});
log('源JUnit报告文件:',源文件);
log('Destination JUnit报告文件:',destinationFile');
var fs=需要('fs');
var startTag='';
var endTag='';
var结果=“”+startTag;
forEach(函数(sourcePath){
var contents=fs.readFileSync(sourcePath,'utf8');
var startIndex=contents.indexOf(startTag)+startTag.length;
var endIndex=contents.indexOf(endTag);
var suites=contents.substring(startIndex,endIndex);
结果+=套房;
});
结果+=结束标记;
fs.writeFileSync(destinationFile,result'utf8');
log('JUnit报告合并到文件:',destinationFile);
返回exitCode;
},
您的conf将包含对合并报告的调用,如下所示
启动后:功能(exitCode){
返回帮助程序。合并JUnitReports(suiteDir、exitCode);
},
调用settingreporter将进入conf-onPrepare函数。
并行测试是否在不同的浏览器上运行?1用于chrome,1用于firefox等?不,所有的测试都在chrome上运行。啊,好的,我想建议通过在文件名前面加上功能前缀来创建唯一的文件名,使用部分功能,但由于所有的chrome都是一样的。。。嗯,我试过了,但由于浏览器是一样的,我得到了一个文件,其中包含上次运行的结果,而不是全部。