Protractor: Юнит Репортер

Созданный на 28 авг. 2013  ·  42Комментарии  ·  Источник: angular/protractor

Мы хотим запустить тесты транспортира на Jenkins, поэтому было бы очень полезно, если бы был репортер junit (например, у karma), чтобы Дженкинс мог сообщать о состоянии тестов.

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 в качестве инструмента сборки, вы можете запускать тесты Protractor с помощью grunt-jasmine-node и настраивать его для получения отчетов, подобных 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',
};

Дополнительные примеры теперь показаны в https://github.com/angular/protractor/blob/master/spec/junitOutputConf.js.

Принимает ли он относительный или абсолютный путь каталога. Абсолютный путь работает, а относительный путь - нет. Я пробовал такие варианты, как ../Reports, но это бесполезно
жасмин.getEnv().addReporter(
новый jasmine.JUnitXmlReporter('xmloutput', правда, правда));
},

исследовано и работает, игнорируйте мой последний комментарий

Я не был достаточно умен, поэтому я ожидал, что папка будет создана, но на самом деле папку нужно создать заранее.

@juliemr Как использовать его с двумя экземплярами Protractor, работающими параллельно, например, через grunt-concurrent ? Это необходимо, чтобы мы могли одновременно запускать тесты в Firefox и Chrome, но это заставит один XML заменить другой, что смутит Дженкинса.

Может быть, Protractor должен знать, как работать в Parallel по таким причинам, подобно тому, что делает Karma?

@mzgol Вы пытались заставить каждую цель, работающую как параллельная задача, выводить другой отчет junit xml в зависимости от платформы? Вы можете просто создать новую выходную папку на основе целевого имени.

Вы также можете изучить цели с несколькими конфигурациями в Jenkins, которые позволяют вам выполнять шаги сборки параллельно, каждый из которых имеет чистую среду. Он также имеет отличные функции, такие как сборки пробного камня, и позволяет вам регулировать параллелизм лучше, чем ворчание.

Существует ли подобный конфиг для мокко? (поскольку я не использую Жасмин)

@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));
        });
 },

Спасибо. У меня тоже работает:

при подготовке: функция () {
требуют('жасмин-репортеры');
var capsPromise = browser.getCapabilities();
capsPromise.then (функция (шапки) {
var имя_браузера = caps.caps_.имя_браузера.toUpperCase();
var browserVersion = caps.caps_.version;
var prePendStr = имя_браузера + "-" + версия_браузера + "-";
jasmine.getEnv().addReporter(новый
jasmine.JUnitXmlReporter("protractor_output", true, true, prePendStr));
});
},

Я создал html-репортер поверх этого. Пожалуйста, дайте мне знать ваши комментарии
https://github.com/jintoppy/protractor-html-screenshot-reporter

Может быть идея добавить создание папки в документы, так как я тоже споткнулся об этом @tracycummins !

@juliemr Устали от всех вариантов, перечисленных в примерах. Я получаю эту ошибку. Любые указатели приветствуются

/дома/гнездо/прототип/conf.js:19
jasmine.getEnv().addReporter(новый jasmine.JUnitXmlReporter('xmloutput', true, true));
^
TypeError: undefined не является функцией
в 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/транспортир/node_modules/q/q.js:525:49
при сбросе (/home/usr/lib/node_modules/protractor/node_modules/q/q.js:108:17)
в процессе._tickCallback (node.js:423:13)
в Function.Module.runMain (module.js:499:11)


// Пример файла конфигурации.
экспорт.config = {
// Адрес работающего Selenium-сервера.
seleniumAddress: ' http://localhost :4444/wd/hub',
allScriptsTimeout: 30000,
// Возможности, которые необходимо передать экземпляру веб-драйвера.
возможности: {
'имя_браузера': 'firefox'
},

// Шаблоны спецификаций относятся к текущей работе напрямую, когда
// транспортир вызывается.
спецификации: ['example_spec.js'],

// Опции для передачи Jasmine-node.
onPrepare: функция () {
требуют('жасмин-репортеры');
jasmine.getEnv().addReporter(новый jasmine.JUnitXmlReporter('xmloutput', true, true));
},

// Опции для передачи Jasmine-node.
жасминнодеоптс: {
showColors: правда,
по умолчаниюТимеаутИнтервал: 30000
}
};

привет @jkmurthy

Я столкнулся с той же самой проблемой. В последней версии [email protected] они изменили имя модуля. Документации по этому поводу нет, но она есть в этом файле.

https://github.com/larrymyers/jasmine-reporters/blob/master/src/junit_reporter.js

  • Применение:

    • jasmine.getEnv().addReporter(новый jasmineReporters.JUnitXmlReporter(options);

Тем не менее, я не мог заставить его работать, так как он говорит, что модуль «jasmineReporters» не определен.

Поэтому я переключился на более старую версию [email protected] , она отлично работала. Убедитесь, что вы создали каталог, который вы называете выходными данными в параметрах репортера.

Понизить версию jasmine-reporters до 0.4.1 не получилось
Пробовал с
onPrepare: функция () {
var имя_папки = (новая дата()).toString().split(' ').splice(1, 4).join(' ');
вар 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
правда, правда, ''));
^
TypeError: undefined не является функцией.

изменение «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: 'путь к какому-то файлу',
закрепить: правда,
useDotNotation: правда
};
jasmine.getEnv().addReporter(новый jasmineReporters.JUnitXmlReporter(options));
},

это должно работать, не так ли?
Я получаю следующую ошибку «ReferenceError: jasmineReporters не определен»

/**
* Генерирует JUnit XML для данного запуска спецификации. Есть разные варианты
* чтобы контролировать, где записываются результаты, и значения по умолчанию
* установить как можно меньше файлов .xml. Можно сохранить
* один файл XML или файл XML для каждого describe верхнего уровня или
* XML-файл для каждого describe независимо от вложенности.
*
* Применение:
*
* jasmine.getEnv().addReporter(новый jasmineReporters.JUnitXmlReporter(options);
*
* @param {объект} [параметры]
* @param {string} Каталог [savePath] для сохранения файлов (по умолчанию: '')
* @param {boolean} [consolidateAll] следует ли сохранять все результаты теста в
* один файл (по умолчанию: true)
* ПРИМЕЧАНИЕ: если true, {filePrefix} рассматривается как полное имя файла (исключая
* расширение)
* @param {boolean} [consolidate] следует ли сохранять вложенные описания внутри
* тот же файл, что и их родитель (по умолчанию: true)
* ПРИМЕЧАНИЕ: значение true ничего не делает, если для consoleAll также установлено значение true.
* ПРИМЕЧАНИЕ. Значение false также устанавливает для консолидации All значение false.
* @param {boolean} [useDotNotation] следует ли разделять имена наборов с помощью
* точки вместо пробелов, т.е. "Class.init", а не "Class init" (по умолчанию: true)
* @param {string} [filePrefix] — это строковое значение, которое добавляется к
* Выходной файл xml (по умолчанию: junitresults-)
* ПРИМЕЧАНИЕ. Если для консолидации все установлено значение 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, а не Jasmine 1.x, который использует Protractor. Таким образом, хотя вы можете получить прошлые ошибки в конфигурации транспортира, выполнив var jasmineReporters = require('jasmine-reporters'); new jasmineReporters.JUnitXmlReporter(/*...*/); , вам будет трудно получить какой-либо значимый вывод, поскольку он ожидает событий Jasmine 2.x и интерфейса репортера.

Правильный способ заставить JUnitXmlReporter работать с Jasmine 1.x — немного изменить исходные инструкции @juliemr :

npm install jasmine-reporters@~1.0.0

Затем следуйте остальным ее инструкциям, как обычно.

Я переработал файл README jasmine-reporters, чтобы указать, чем [email protected] отличается от [email protected] . Я также добавил специальный раздел об использовании jasmine-reporters с Protractor, поскольку этот вопрос возникает часто.

Спасибо @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 . Я не могу представить, что я единственный, кому было трудно понять, как получить отчеты junit для jasmine2. Конечно, как только я нашел это и перечитал текущую документацию, она стала яснее, но изначально я ошибочно прочитал ее, чтобы иметь в виду, что jasmine-reporters (совсем) не работают с jasmine2. Имея приведенный выше ответ или ссылку на файл readme 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).

Попробуйте использовать правильный синтаксис для создания репортера и посмотрите, получится ли у вас дальше.

Изменено из примера в файле README jasmine-reporters:

var junitReporter = new jasmineReporters.JUnitXmlReporter({
    savePath: '../TestReports/test'
});
jasmine.getEnv().addReporter(junitReporter);

Убедитесь, что папка «../TestReports/test» существует, так как я думаю, что это не удается
тоже молча.

В среду, 15 апреля 2015 г., в 16:33, Бен Лавридж, [email protected]
написал:

@spatchamatla https://github.com/spatchamatla В вашем примере используется
странная комбинация синтаксиса [email protected] (упорядоченные аргументы)
с тем, что выглядит как репортер [email protected]
(jasmineReporters.JUnitXmlReporter и jasmine.JUnitXmlReporter).

Попробуйте использовать правильный синтаксис для создания генератора отчетов и посмотрите, получится ли
дальше.

Изменено из примера в файле README jasmine-reporters:

var junitReporter = новый jasmineReporters.JUnitXmlReporter({
savePath: '../TestReports/тест'
});
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));
        });

он начал работать, единственным недостатком является создание папки в домашнем каталоге, а не в папке проекта. Когда я попытался использовать путь к папке проекта, он все еще говорит

Предупреждение: не удалось написать отчет junit для «../TestReports», «CHROME-41.0.2272.118-TestImpersonationPage.xml». Причины:
Попытка Rhino: java не определен
Попытка PhantomJs: окно не определено
Попытка NodeJS: EACCES, разрешение отклонено «/Users/TestReports»

я создал папку вручную и все еще показывает выше в консоли

Является ли «Protractor/TestReports» правильным путем и существует ли эта папка?

В среду, 15 апреля 2015 г., в 17:01, spatchamatla уведомления@github.com
написал:

@bloveridge https://github.com/bloveridge @spenoir
https://github.com/spenoir , я перешел на [email protected] и
использовал ниже

//Для выходных отчетов junit
var reporters = require('jasmine-reporters');
var capsPromise = browser.getCapabilities();
capsPromise.then (функция (заглавные буквы) {
var имя_браузера = caps.caps_.имя_браузера.toUpperCase();
var browserVersion = caps.caps_.version;
var prePendStr = имя_браузера + "-" + версия_браузера + "-";
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

когда я запустил тест, он все еще дает
Предупреждение: не удалось написать отчет junit для «../TestReports», «CHROME-41.0.2272.118-TestImpersonationPage.xml». Причины:
Попытка Rhino: java не определен
Попытка PhantomJs: окно не определено
Попытка NodeJS: EACCES, разрешение отклонено «/Users/TestReports»

вы можете попробовать ослабить права доступа к папке TestReports, не уверен
после этого.

В среду, 15 апреля 2015 г., в 17:10, spatchamatla уведомления@github.com
написал:

«Protractor/TestReports» — это путь, созданный в домашней папке,
тогда я использовал

jasmine.getEnv().addReporter(новый jasmine.JUnitXmlReporter('../TestReports', true, true, prePendStr));

а я вручную создал

[изображение: скриншот 15 апреля 2015 г., 12:07:09]
https://cloud.githubusercontent.com/assets/4671240/7163457/278cffa6-e368-11e4-9994-2c0b5d33f07c.png

когда я запустил тест, он все еще дает
Предупреждение: не удалось написать отчет junit для «../TestReports»,
«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 на самом деле являются экспортом требуемой функции.

например,
var jasmineReporters = require('jasmine-reporters');

У меня работает пример в файле readme 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 рейтинги