Protractor: 君特记者

创建于 2013-08-28  ·  42评论  ·  资料来源: angular/protractor

我们想在 Jenkins 上运行量角器测试,所以如果有一个 junit 报告器(就像 karma 一样)会非常有用,这样测试的状态可以由 Jenkins 报告

feature request

最有用的评论

如何在您的配置文件中以一种稍微笨拙的方式执行此操作 - 我已经使用 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',
};

所有42条评论

我的 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

  • 用法:

    • jasmine.getEnv().addReporter(new jasmineReporters.JUnitXmlReporter(options);

我仍然无法让它工作,因为它说模块'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));

我手动创建

screen shot 2015-04-15 at 12 07 09 pm

当我运行测试时,它仍然给出
警告:为“../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-'
            }));
         }
    });
此页面是否有帮助?
0 / 5 - 0 等级