我们想在 Jenkins 上运行量角器测试,所以如果有一个 junit 报告器(就像 karma 一样)会非常有用,这样测试的状态可以由 Jenkins 报告
我的 2 美分:如果您使用 Grunt 作为构建工具,您可以使用grunt-jasmine-node运行 Protractor 测试并将其配置为获得类似 JUnit 的报告!
如何在您的配置文件中以一种稍微笨拙的方式执行此操作 - 我已经使用 Protractor 自己的测试套件对此进行了测试:
npm install jasmine-reporters
你的配置文件:
require('jasmine-reporters');
jasmine.getEnv().addReporter(new jasmine.JUnitXmlReporter(
'outputdir/', true, true));
// The main suite of Protractor tests.
exports.config = {
seleniumServerJar: './selenium/selenium-server-standalone-2.35.0.jar',
chromeDriver: './selenium/chromedriver',
seleniumAddress: 'http://localhost:4444/wd/hub',
// Spec patterns are relative to this directory.
specs: [
'*_spec.js'
],
capabilities: {
'browserName': 'chrome'
},
baseUrl: 'http://localhost:8000',
};
它是否接受目录的相对路径或绝对路径。绝对路径有效,而相对路径无效。 我已经尝试过 ../Reports 之类的选项,但它没有用
jasmine.getEnv().addReporter(
new jasmine.JUnitXmlReporter('xmloutput', true, true));
},
探索和工作,忽略我的最后评论
我不够聪明,所以我希望创建文件夹,但实际上,必须事先创建文件夹。
@juliemr如何将它与并行运行的两个量角器实例一起使用,例如通过grunt-concurrent
? 它是必需的,以便我们可以同时在 Firefox 和 Chrome 中运行测试,但它会使一个 XML 替换另一个,这会使 Jenkins 感到困惑。
也许 Protractor 应该知道如何并行运行,就像 Karma 所做的那样?
@mzgol您是否尝试过使每个目标作为并发任务运行输出基于平台的不同junit xml报告? 您可以根据目标名称创建一个新的输出文件夹。
您可能还想查看 Jenkins 上的多配置目标,它可以让您在每个干净的环境中并行运行构建步骤。 它还具有诸如试金石构建之类的漂亮功能,并允许您比 grunt 更好地限制并发。
mocha 是否存在类似的配置? (因为我没有使用 Jasmine)
@mzgol我尝试了 jvandyke 的建议(谢谢),对我来说效果很好:
onPrepare: function(){
require('jasmine-reporters');
var capsPromise = browser.getCapabilities();
capsPromise.then(function(caps){
var browserName = caps.caps_.browserName.toUpperCase();
var browserVersion = caps.caps_.version;
var prePendStr = browserName + "-" + browserVersion + "-";
jasmine.getEnv().addReporter(new
jasmine.JUnitXmlReporter("protractor_output", true, true,prePendStr));
});
},
谢谢。 它也为我工作:
onPrepare:函数(){
要求('茉莉花记者');
var capsPromise = browser.getCapabilities();
capsPromise.then(函数(大写){
var browserName = caps.caps_.browserName.toUpperCase();
var browserVersion = caps.caps_.version;
var prePendStr = browserName + "-" + browserVersion + "-";
jasmine.getEnv().addReporter(新
jasmine.JUnitXmlReporter("protractor_output", true, true,prePendStr));
});
},
我在此基础上创建了一个 html 记者。 请让我知道你的意见
https://github.com/jintoppy/protractor-html-screenshot-reporter
将文件夹创建添加到文档中可能是一个想法,因为我也遇到了@tracycummins !
@juliemr厌倦了示例中列出的所有选项。 我得到这个错误。 任何指针表示赞赏
/home/jack/prototype/conf.js:19
jasmine.getEnv().addReporter(new jasmine.JUnitXmlReporter('xmloutput', true, true));
^
类型错误:未定义不是函数
在exports.config.onPrepare (/home/jack/prototype/conf.js:19:33)
在 Runner.runFilenamesOrFns_ (/home/usr/lib/node_modules/protractor/lib/runner.js:64:9)
在 Runner.runTestPreparers (/home/usr/lib/node_modules/protractor/lib/runner.js:91:8)
在 runner.controlFlow.execute.then.jasmineNodeOpts (/home/usr/lib/node_modules/protractor/lib/frameworks/jasmine.js:39:12)
在 webdriver.promise.ControlFlow.runInNewFrame_ (/home/usr/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/webdriver/promise.js:1539:20)
在 webdriver.promise.ControlFlow.runEventLoop_ (/home/usr/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/webdriver/promise.js:1404:8)
在包装器为 _onTimeout
在 Timer.listOnTimeout作为 ontimeout
==== 异步任务 ====
运行测试准备者
在 Object.exports.run (/home/usr/lib/node_modules/protractor/lib/frameworks/jasmine.js:38:24)
在 driverprovider_.setupEnv.then.then.then.testResult (/home/usr/lib/node_modules/protractor/lib/runner.js:233:28)
在 _fulfilled (/home/usr/lib/node_modules/protractor/node_modules/q/q.js:797:54)
在 self.promiseDispatch.done (/home/usr/lib/node_modules/protractor/node_modules/q/q.js:826:30)
在 Promise.promise.promiseDispatch (/home/usr/lib/node_modules/protractor/node_modules/q/q.js:759:13)
在 /home/usr/lib/node_modules/protractor/node_modules/q/q.js:525:49
在刷新(/home/usr/lib/node_modules/protractor/node_modules/q/q.js:108:17)
在 process._tickCallback (node.js:423:13)
在 Function.Module.runMain (module.js:499:11)
// 一个示例配置文件。
出口.config = {
// 正在运行的 selenium 服务器的地址。
seleniumAddress: ' http://localhost :4444/wd/hub',
allScriptsTimeout: 30000,
// 要传递给 webdriver 实例的功能。
能力:{
“浏览器名称”:“火狐”
},
// Spec 模式是相对于当前工作的,当
// 量角器被调用。
规格:['example_spec.js'],
// 传递给 Jasmine-node 的选项。
onPrepare:函数(){
要求('茉莉花记者');
jasmine.getEnv().addReporter(new jasmine.JUnitXmlReporter('xmloutput', true, true));
},
// 传递给 Jasmine-node 的选项。
茉莉花节点选择:{
显示颜色:真,
默认超时间隔:30000
}
};
嘿@jkmurthy
我遇到了同样的问题。 在最新版本的[email protected]中,他们更改了模块名称。 没有这方面的文档,但它在这个文件中。
https://github.com/larrymyers/jasmine-reporters/blob/master/src/junit_reporter.js
我仍然无法让它工作,因为它说模块'jasmineReporters'未定义。
所以我切换到旧版本的[email protected] ,它工作得很好。 确保在报告器选项中创建您所引用的目录作为输出。
将 jasmine-reporters 降级到 0.4.1 不起作用
试过了
onPrepare:函数(){
var folderName = (new Date()).toString().split(' ').splice(1, 4).join(' ');
var mkdirp = 需要('mkdirp');
var newFolder = "./reports/" + 文件夹名称;
要求('茉莉花记者');
mkdirp(newFolder, function(err) {
if (err) {
console.error(err);
} else {
jasmine.getEnv().addReporter(new jasmine.JUnitXmlReporter(newFolder, true, true));
}
});
},
还没有运气
这对我来说绝对是一个问题。 使用 jasmine-reporters 2.0 我得到
D:\HgBuild\TPSOneSearch\Unstable\Tyler.TPS.OneSearch\Tyler.TPS.Web.OneSearch\app
\test\e2e\oneSearchChromeConf.js:29
jasmine.getEnv().addReporter(新 jasmine.JUnitXmlReporter(uri, t
rue,真实,''));
^
类型错误:未定义不是函数。
将“new jasmine.JUnitXmlReporter”更改为“jasmineReporters.JUnitXmlReporter”会导致 jasmineReporters 未定义。
如果我将 jasmine-reporters 恢复到 0.4.1,它的效果非常好。
jasmine-reporters 2.0 的 API 与 1.x 不同; 不能盲目更新; 调整你的调用。
查看 junit_reporter.js 文件中 JUnitXmlReporter 的注释,我已将我的 conf 文件设置如下:
onPrepare: 函数 () {
要求('茉莉花记者');
变量选项 = {
savePath: '一些文件路径',
巩固:真,
使用DotNotation:真
};
jasmine.getEnv().addReporter(new jasmineReporters.JUnitXmlReporter(options));
},
这应该有效吗?
我收到以下错误“ReferenceError:jasmineReporters 未定义”
/**
* 为给定的规范运行生成 JUnit XML。 有多种选择
* 控制结果写入的位置,默认值为
* 设置为创建尽可能少的 .xml 文件。 可以保存一个
* 单个 XML 文件,或每个顶级describe
的 XML 文件,或
* 无论嵌套如何,每个describe
的 XML 文件。
*
* 用法:
*
* jasmine.getEnv().addReporter(new jasmineReporters.JUnitXmlReporter(options);
*
* @param {object} [选项]
* @param {string} [savePath] 保存文件的目录(默认:'')
* @param {boolean} [consolidateAll] 是否将所有测试结果保存在一个
* 单个文件(默认:true)
* 注意:如果为真,{filePrefix} 被视为完整的文件名(不包括
* 延期)
* @param {boolean} [consolidate] 是否保存嵌套的描述
* 与其父文件相同的文件(默认值:true)
* 注意:如果 consolidateAll 也为 true,则 true 不执行任何操作。
* 注意:false 还将 consolidateAll 设置为 false。
* @param {boolean} [useDotNotation] 是否用
* 点而不是空格,即“Class.init”而不是“Class init”(默认值:true)
* @param {string} [filePrefix] 是前面的字符串值
* xml 输出文件(默认:junitresults-)
* 注意:如果 consolidateAll 为 true,则默认为“junitresults”并且
* 这成为实际的文件名,即“junitresults.xml”
*/
@john-bridges 你能用反引号包装你的代码吗? 没有它很难阅读。
@john-bridges 好吧,难怪jasmineReporters
变量是未定义的,因为您确实没有定义它。 您需要分配模块:
var jasmineReporters = require('jasmine-reporters');
@mzgol我是个白痴,工作就像一个魅力。 感谢您的帮助,我很感激。
以前版本的jasmine-reporters
将记者直接附加到jasmine
对象; 现在它附加到自己的出口上,这要好得多。
我知道混乱是从哪里来的。 ;)
@mzgol我同意,更好的方法,再次感谢。
[email protected]
支持 Jasmine 2.x,并且如上面观察/讨论的那样,具有不同的语法和入口点(在它自己的对象上与全局jasmine
对象上)。 也就是说,它_仅_支持 Jasmine 2.x,而不是Protractor 使用的 Jasmine 1.x。 因此,虽然您可以通过执行var jasmineReporters = require('jasmine-reporters'); new jasmineReporters.JUnitXmlReporter(/*...*/);
来解决量角器配置中的错误,但您将很难获得任何有意义的输出,因为它正在等待 Jasmine 2.x 事件和报告器界面。
让 JUnitXmlReporter 与 Jasmine 1.x 一起使用的正确方法是稍微修改@juliemr的原始说明:
npm install jasmine-reporters@~1.0.0
然后照常按照她的其余指示进行操作。
我已经彻底检查了 jasmine-reporters README 以解决[email protected]
与[email protected]
$ 的不同之处。 我还添加了一个关于在 Protractor 中使用 jasmine-reporters 的特定部分,因为这个问题出现了很多。
感谢@ksraja指出严重缺乏文档。
为什么这个问题一直关闭,显然这仍然是一个问题。
onPrepare: function() {
require('jasmine-reporters');
jasmine.getEnv().addReporter(new jasmine.JUnitXmlReporter('test-target/', true, true));
browser.driver.get('http://localhost:9000');
require('./test/e2e/models/login-page').login();
},
抛出错误:
Running "protractor:e2e" (protractor) task
/Users/212400520/PredixExperience/predix-dashboard/node_modules/jasmine-reporters/src/jasmine.console
_reporter.js:2
if (! jasmine) {
^
ReferenceError: jasmine is not defined
at /Users/212400520/PredixExperience/predix-dashboard/node_modules/jasmine-reporters/src/jasmine.
console_reporter.js:2:11
at Object.<anonymous> (/Users/212400520/PredixExperience/predix-dashboard/node_modules/jasmine-re
porters/src/jasmine.console_reporter.js:144:3)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Module.require (module.js:364:17)
at require (module.js:380:17)
at Object.<anonymous> (/Users/212400520/PredixExperience/predix-dashboard/node_modules/jasmine-re
porters/src/load_reporters.js:1:63)
at Module._compile (module.js:456:26)
>>
Fatal error: protractor exited with code: 8
@jonniespratley我发现npm install jasmine-reporters
默认安装1.0.1
版本。
因此,请确保您已安装最新版本的jasmine-reporters
。 例如
npm install jasmine-reporters@~2.0.3 --save-dev
之后,我更新了量角器配置如下:
var jasmineReporters = require('jasmine-reporters');
exports.config = {
framework: 'jasmine2',
//...
//Other configurations...
//...
onPrepare: function () {
jasmine.getEnv().addReporter(new jasmineReporters.JUnitXmlReporter({
savePath: '..',
consolidateAll: false
}));
},
jasmineNodeOpts: {
showColors: true,
defaultTimeoutInterval: 60000,
print: function() {}
}
};
现在 jasmine-reporters 对我来说工作得很好。
在量角器升级到 jasmine2 框架的文档中,如果在记者部分记录了@luixaviles的答案,那就太好了。 我无法想象我是唯一一个很难弄清楚如何获取 jasmine2 的 junit 报告的人。 当然,一旦我找到了这个并重新阅读了当前的文档,它就更清楚了,但最初我错误地阅读它意味着 jasmine-reporters (根本不)与 jasmine2 一起工作。 有了上面的答案,或者 jasmine-reporters 自述文件的链接会让事情变得更容易一些。
尝试了茉莉花报告
var jasmineReporters = require('jasmine-reporters');
jasmine.getEnv().addReporter(new jasmineReporters.JUnitXmlReporter('../TestReports/test', true, true));
它运行良好,但没有创建 xml 文件
我试图去https://github.com/angular/protractor/blob/master/spec/junitOutputConf.js ,但给出了 404
@spatchamatla您的示例使用了[email protected]语法(有序参数)与[email protected]报告器(jasmineReporters.JUnitXmlReporter vs jasmine.JUnitXmlReporter)的奇怪组合。
尝试使用正确的语法来创建报告器,看看你是否能走得更远。
从 jasmine-reporters README 中的示例修改:
var junitReporter = new jasmineReporters.JUnitXmlReporter({
savePath: '../TestReports/test'
});
jasmine.getEnv().addReporter(junitReporter);
确保文件夹 '../TestReports/test' 存在,因为我认为它失败了
也默默地。
2015 年 4 月 15 日星期三下午 4:33,Ben Loveridge通知@github.com
写道:
@spatchamatla https://github.com/spatchamatla您的示例使用的是
[email protected]语法的奇怪组合(有序参数)
看起来像[email protected]记者
(jasmineReporters.JUnitXmlReporter 与 jasmine.JUnitXmlReporter)。尝试使用正确的语法来创建记者,看看你是否得到
进一步。从 jasmine-reporters README 中的示例修改:
var junitReporter = 新的 jasmineReporters.JUnitXmlReporter({
保存路径:'../TestReports/test'
});
jasmine.getEnv().addReporter(junitReporter);—
直接回复此邮件或在 GitHub 上查看
https://github.com/angular/protractor/issues/60#issuecomment -93451490。
绝对不是一个坏主意,尽管 jasmine-reporters 将使用https://github.com/substack/node-mkdirp来尝试创建目录。
@bloveridge @spenoir ,我降级为[email protected]并使用以下
//For junit output reports
var reporters = require('jasmine-reporters');
var capsPromise = browser.getCapabilities();
capsPromise.then(function (caps) {
var browserName = caps.caps_.browserName.toUpperCase();
var browserVersion = caps.caps_.version;
var prePendStr = browserName + "-" + browserVersion + "-";
jasmine.getEnv().addReporter(new jasmine.JUnitXmlReporter('Protractor/TestReports', true, true, prePendStr));
});
它开始工作,唯一的缺点是它在主目录而不是项目文件夹中创建文件夹。 当我尝试使用项目文件夹路径时,它仍然说
警告:为“../TestReports”、“CHROME-41.0.2272.118-TestImpersonationPage.xml”编写 junit 报告失败。 原因:
Rhino 尝试:未定义 java
PhantomJs 尝试:未定义窗口
NodeJS 尝试:EACCES,权限被拒绝'/Users/TestReports'
我手动创建了文件夹,但仍然在控制台中显示上述内容
'Protractor/TestReports' 是正确的路径,该文件夹是否存在?
2015 年 4 月 15 日星期三下午 5:01,spatchamatla [email protected]
写道:
@bloveridge https://github.com/bloveridge @spenoir
https://github.com/spenoir ,我降级为[email protected]和
使用了以下//对于junit输出报告
var 记者 = 要求('茉莉记者');
var capsPromise = browser.getCapabilities();
capsPromise.then(函数(大写){
var browserName = caps.caps_.browserName.toUpperCase();
var browserVersion = caps.caps_.version;
var prePendStr = browserName + "-" + browserVersion + "-";
jasmine.getEnv().addReporter(new jasmine.JUnitXmlReporter('Protractor/TestReports', true, true, prePendStr));
});它开始工作,唯一的缺点是它在家里创建文件夹
目录而不是项目文件夹中。 当我尝试使用该项目时
文件夹路径,它仍然说Rhino 尝试:未定义 java
PhantomJs 尝试:未定义窗口
NodeJS 尝试:path.resolve 的参数必须是字符串我手动创建了文件夹,但仍然在控制台中显示上述内容
—
直接回复此邮件或在 GitHub 上查看
https://github.com/angular/protractor/issues/60#issuecomment -93460326。
'Protractor/TestReports' 是在主文件夹中创建的路径,然后我使用
jasmine.getEnv().addReporter(new jasmine.JUnitXmlReporter('../TestReports', true, true, prePendStr));
我手动创建
当我运行测试时,它仍然给出
警告:为“../TestReports”、“CHROME-41.0.2272.118-TestImpersonationPage.xml”编写 junit 报告失败。 原因:
Rhino 尝试:未定义 java
PhantomJs 尝试:未定义窗口
NodeJS 尝试:EACCES,权限被拒绝'/Users/TestReports'
您可以尝试放松对 TestReports 文件夹的权限,不确定
在那之后。
2015 年 4 月 15 日星期三下午 5:10,spatchamatla [email protected]
写道:
'Protractor/TestReports' 是在主文件夹中创建的路径,
然后我用jasmine.getEnv().addReporter(new jasmine.JUnitXmlReporter('../TestReports', true, true, prePendStr));
我手动创建
[图片:屏幕截图 2015-04-15 12 07 09 pm]
https://cloud.githubusercontent.com/assets/4671240/7163457/278cffa6-e368-11e4-9994-2c0b5d33f07c.png当我运行测试时,它仍然给出
警告:为 '../TestReports' 编写 junit 报告失败,
'CHROME-41.0.2272.118-TestImpersonationPage.xml'。 原因:
Rhino 尝试:未定义 java
PhantomJs 尝试:未定义窗口
NodeJS 尝试:EACCES,权限被拒绝'/Users/TestReports'—
直接回复此邮件或在 GitHub 上查看
https://github.com/angular/protractor/issues/60#issuecomment -93466365。
当然,感谢@spenoir的建议和意见
伟大的线程。 帮助很大。
以为我有问题-但没有。 找不到删除的方法:)
保持良好的工作。
@jkmurthy @ksraja看来列出的 jasmineReports 实际上是 require 函数的导出。
例如,
var jasmineReporters = require('jasmine-reporters');
jasmine-reporters 自述文件中的示例适用于我: https ://github.com/larrymyers/jasmine-reporters#protractor
如果您只需要控制台输出,我对https://github.com/bcaudan/jasmine-spec-reporter/blob/master/docs/protractor-configuration.md很满意
@josephdpurcell您提供的链接也对我有用。 这是我的配置,希望对你有帮助!
确保您已安装 mkdirp 包以及其他 jasmine 2.x 和 jasmine-reporters 2.X 包。
如果文件夹不存在,此配置会创建文件夹以避免静默失败。
var folderName = ('output_folder');
var mkdirp = require('mkdirp');
mkdirp(folderName, function(err) {
if (err) {
console.error(err);
} else {
var jasmineReporters = require('jasmine-reporters');
jasmine.getEnv().addReporter(new jasmineReporters.JUnitXmlReporter({
consolidateAll: true,
savePath: folderName,
filePrefix: 'xmloutput-'
}));
}
});
最有用的评论
如何在您的配置文件中以一种稍微笨拙的方式执行此操作 - 我已经使用 Protractor 自己的测试套件对此进行了测试:
npm install jasmine-reporters
你的配置文件: