Cucumber-js: добавить хуки BeforeStep/AfterStep

Созданный на 4 янв. 2018  ·  33Комментарии  ·  Источник: cucumber/cucumber-js

Полезно для проверки после завершения каждого шага. this должен быть экземпляром мира

Самый полезный комментарий

Всем привет,

Есть новости о хуках Step? Или какой-либо обходной путь для запуска некоторого кода до и/или после выполнения каждого шага?

Все 33 Комментарий

@charlierudolph Я хотел бы помочь здесь, но мне нужен указатель на соответствующий способ его реализации. Я считаю, что был синтаксический сахар AfterStep для registerHandler, который был недавно удален. Я посмотрел support_code_library_builder/define_helpers.js. Но нужны некоторые указатели на то, как реализовать эти хуки.
Благодарность
Али
PS Спасибо за возврат результата в формат json.

Однако возникает вопрос, как это влияет на рабочий процесс? Может ли это изменить статус результата шага или он действует как еще один шаг, который может быть пройден/не пройден?

Вариант использования, который я видел в одном из комментариев и который я также хочу использовать, заключается в создании снимка экрана после шага. В ruby ​​с огурцом я использовал AfterStep, который обеспечивает доступ к объекту Scenario.
ИМХО, хук afterstep следует использовать только в тех случаях, когда пользователь хочет проанализировать результат шага, но не может изменить результат. Я также думаю, что это не должно быть еще одним шагом, который может пройти/не пройти.

@charlierudolph Я тоже ищу похожее решение.
До того, как registerHandler устарел, я использовал этот код, чтобы сделать снимок экрана после неудачных шагов:

```
this.registerHandler('StepResult', функция (событие, обратный вызов) {
var stepResult = event.getPayloadItem('stepResult');

if (stepResult.getStatus() == 'failed') {
  takeScreenshot()
    .then(function () {
      callback();
    });
} else {
  callback();
}});

````

Теперь у меня нет решения для этого.

Привет,

Я видел в большинстве тем, которые я читал о хуке BeforeStep/AfterStep, что вариант использования использует экран печати. Это не мой вариант использования, и я просто хочу озвучить другие варианты использования этих хуков:

Мой проект использовал хук this.AfterStep в огурце 1.x для:

  • сбор данных - таких как все внешние ссылки:
    element.all(by.css('a')).each(function(link) { link.getAttribute('href').then(function(href) { ... }); });

Затем все внешние ссылки проверяются в отдельном тестовом наборе.

  • Проверка дубликатов идентификаторов элементов (цель состоит в том, чтобы убедиться, что все идентификаторы уникальны для соответствия стандарту HTML, а также упрощает создание тестов)
  • Проверка на ошибки скрипта (AfterStep установит переменную для After hook, чтобы сценарий действительно не сработал).
  • Игнорирование предупреждений браузера. Несколько тестовых сценариев заставляют веб-браузер открывать окно предупреждения, которое мы можем игнорировать. Это особенно применимо, когда есть элементы формы и ввода, браузер предупредит ("У вас есть несохраненные изменения...")

В настоящее время используется Cucumber 4.0.0 и Protractor 4.0.14.

Примечание: наши варианты использования не работали должным образом с this.AfterStep() в Cucumber 1.xx, потому что он не был разработан для такого типа кода, и мы видели проблемы с условиями гонки. Поэтому мы обновились до Cucumber 4.0.0 и отключили логику AfterStep до тех пор, пока для нее не появится надлежащая поддержка.

Привет,

какие-либо обновления относительно этого до/после ступенчатых крючков?
Есть ли обходной путь для хука AfterStep? Я хотел бы сделать снимок экрана, если конкретный тест не удался.

«attach» недоступен для меня, потому что мы переопределили конструктор мира по умолчанию https://github.com/cucumber/cucumber-js/blob/master/docs/support_files/world.md

спасибо

Привет @gajo4256 ,

Я использую огурец 4.0.0 и этот фрагмент:

After(function (scenario) {
  if (scenario.result.status === Status.FAILED) {
    const World = this;

    return browser.takeScreenshot().then(function (buffer) {
      return World.attach(buffer, 'image/png');
    });
  }});

Это сделает снимок экрана после каждого неудачного сценария. (Это работает для меня, потому что с огурцом, всякий раз, когда шаг терпит неудачу, весь сценарий терпит неудачу, поэтому он почти идентичен «после неудачи шага».

Надеюсь, поможет.

Привет @mracz ,

спасибо, я действительно пробовал это (хотя после каждого шага это было бы более подходящим для меня).
Поскольку я переопределил конструктор World по умолчанию, как я могу снова сделать присоединение доступным для меня, как в обычном случае?

спасибо

Привет @gajo4256 ,

Это то, что у меня есть в моей реализации Custom world:

const { setWorldConstructor } = require('cucumber');

function CustomWorld( { attach } ) {
  this.attach = attach;
}

setWorldConstructor(CustomWorld);

@mracz , сейчас я делаю это для каждого шага:

    When('I do something', function () {
        return takeScreenshot(this, () => {
            return $(...).click();
        });
    });

Где функция снятия скриншота:

export function takeScreenshot(world, stepToExecute: () => promise.Promise<any>): promise.Promise<any> {
    return stepToExecute().then(() => {
        return doTakeScreenshot(world);
    }).catch((err) => {
        return doTakeScreenshot(world).then(() => {
            throw err;
        });
    });
}

function doTakeScreenshot(world) {
    return browser.takeScreenshot().then((screenshot) => {
        world.attach(screenshot, 'image/png');
    }).catch((err) => {
        console.warn('Could not create screenshot', err);
    });
}

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

Однако то, что хук, вероятно, не будет делать, так это пропускать скриншоты, когда я делаю утверждения , которые не меняют экран (таким образом, скриншот будет бесполезен), например, Then some element is not shown . Я предполагаю, что расширяемый мировой объект мог бы помочь.

Вот еще один пример использования хуков AfterStep : дождитесь синхронизации пиров (используя векторные часы или метки времени Lamport). /cc @tooky @jbpros

Всем привет.
Я действительно работаю над этим вопросом.

Мы ищем способ сделать снимок экрана со всех наших разных шагов.
Прямо сейчас мы думаем о переопределении функции StepDefinitions из огурца.

Не знаю, лучший ли это способ, поэтому, пожалуйста, не стесняйтесь высказать свое мнение об этом!

Для тех, кто борется, вот способ сделать это с помощью оболочки функции определения: https://github.com/PeerioTechnologies/peerio-icebear/blob/dev/test/e2e/code/hooks.js#L28 .

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

Другое использование: у нас есть несколько модальных окон, которые могут появиться на нашем веб-сайте через определенное время. Если мы запускаем сценарий, мы хотели бы иметь проверки на наличие этих модальных окон на странице после каждого шага, чтобы гарантировать, что наши тесты не будут хрупкими из-за этих модальных окон.

Другой вариант использования: если кто-то хочет создать инструмент отчетности с панелью инструментов (текущие статусы тестов, тестовые случаи, которые были запущены ранее и т. д.), огурец может публиковать в инструменте пошаговые хуки для обновления прогресса. Я знаю, это необычный пример, но мне интересно его изучить сейчас, когда я об этом подумал.

KyleFairns, мне нужен AfterStep для приборной панели, как вы упомянули.

Привет,

Мы хотим проверить, есть ли какая-либо ошибка javascript после каждого шага. Не только неудачные шаги.
(Чуть то же самое, что и @markus-lundin-86)
Теперь мы можем делать это только после каждого сценария.
Так это в дорожной карте, или у кого-нибудь есть другие решения?

Я только что обнаружил, что WebDriverIO имеет хуки beforeStep и afterStep для огурца, которые решают мою проблему.

Надеюсь, это поможет...

Всем привет,

Есть новости о хуках Step? Или какой-либо обходной путь для запуска некоторого кода до и/или после выполнения каждого шага?

Всем привет,
В той же ситуации, что и @Prasant-Sutaria.
Любое обновление по ступенчатым крючкам или обходному пути?
Заранее спасибо.

Нет обновлений. Все еще жду, пока кто-нибудь отправит запрос на это.

Есть ли какая-то дорожная карта или что-то в этом роде? Поскольку наличие этой функции является одной из основных проблем, возможно, было бы неплохо сделать официальное заявление.

@aslakhellesoy есть ли контрольный список или что-то, что нужно реализовать в запросе на включение? AFAIK # 1058 и # 1121 пытаются реализовать эту функцию или некоторые способы ее обхода.

Привет, ребята,
Я только что создал PR по этой проблеме: https://github.com/cucumber/cucumber-js/pull/1198.
Дайте мне знать, если вы найдете это полезным.

@aslakhellesoy , я создал вышеупомянутый PR (# 1198), чтобы решить эту проблему / запрос функции. Не могли бы вы взглянуть на него или указать мне, к кому мне следует обратиться?
копия: @charlierudolph

любые обновления? тоже жду с нетерпением :)

Я вижу 2 пиара @leonardonelson91
Я думаю, что они не нашли лучший способ реализовать эту функцию
https://github.com/огурец/огурец-js/pull/1198
https://github.com/огурец/огурец-js/pull/1058

@charlierudolph У вас есть мнение о том, следует ли по-прежнему запускать функции, зарегистрированные для BeforeStep и AfterStep , если время шага истекает?

Как и некоторые другие здесь, я использую setDefinitionFunctionWrapper для создания снимков экрана, что отлично работает, за исключением того, что у меня нет возможности узнать, когда истечет время тестовых шагов — лучшее, что я могу сделать, это предоставить более короткий тайм-аут для инструментарий браузера, поэтому он будет вызывать, пока шаг все еще активен. Я надеюсь поработать над исправлением для setDefinitionFunctionWrapper , но хотел бы знать, каковы были намерения и здесь.

Я ожидаю, что BeforeStep/AfterStep будет работать несмотря ни на что, независимо от того, пройден ли шаг/сбой (из-за тайм-аута или иным образом)

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

Следующие шаги подтверждают, что система находится в ожидаемом состоянии, что требует обработки всех событий. Я хотел бы иметь возможность убедиться, что очередь полностью обработана и в состоянии ожидания ничего нет, прежде чем переходить к следующему шагу.

В настоящее время я выполняю некоторый опрос потока событий на этапах проверки, но было бы неплохо просто поместить его в ловушку. Поскольку повсеместно требуется, чтобы система находилась в стабильном состоянии, прежде чем переходить к следующему шагу.

@davidjgoss @charlierudolph Пожалуйста, не могли бы вы помочь мне с примером примера кода setDefinitionFunctionWrapper для создания снимков экрана BeforeStep/AfterStep? Я пытаюсь использовать Nightwatch JS.

Привет, @RArkasali , вот фрагмент проекта, над которым я работаю:

import {setDefinitionFunctionWrapper} from "cucumber";

setDefinitionFunctionWrapper(function(fn) {
    return async function(...args) {
        try {
            return await fn.apply(this, args);
        } catch (ex) {
            await this.takeScreenshot();
            throw ex;
        }
    };
});

(Где takeScreenshot — это метод на вашем пользовательском World , который фактически делает снимки экрана. Я недостаточно знаком с Nightwatch, чтобы знать, как это выглядит, но я уверен, что вы быть.)

Так что это сделает снимок экрана, если есть ошибка (например, сбой утверждения) внутри функции шага. Тот факт, что мы возвращаем результат без ошибок, важен - я некоторое время был в замешательстве, пока не обрабатывался шаг с return "pending" , пока не понял, что проглатываю возвращаемое значение.

Надеюсь это поможет

Всем привет,
каков статус этого вопроса? Ему все еще нужна помощь?
Меня интересуют BeforeStep и AfterStep, потому что это помогло бы мне иметь файл журнала со всеми именами шагов и дополнительной информацией журнала. Это немного проще, чем создание собственного форматтера.

Это было добавлено отдельно от https://github.com/cucumber/cucumber-js/pull/1416 .

Закрытие этой проблемы, поскольку хуки были добавлены в https://github.com/cucumber/cucumber-js/pull/1416 .

Была ли эта страница полезной?
0 / 5 - 0 рейтинги