Как определить другое поведение для JUnit @Before hook с Maven и Cucumber - PullRequest
3 голосов
/ 12 марта 2019

Моя проблема заключается в том, что у меня есть два разных типа тестов, которые выполняются с использованием Cucumber BDD с Java, Maven и JUnit.

В некоторых функциях, связанных с пользовательским интерфейсом, мне нужно выполнять некоторые действия перед каждымодин сценарий, такой как раскрутка виртуальных машин, например:

public class StepDefinitions {
    @Before
    protected void setUp(Scenario scenario) throws MalformedURLException {
        //Create browser resources here for all of my UI related scenarios
} 

Однако в тестах, не связанных с пользовательским интерфейсом, таких как тесты API, мне не нужно, чтобы эти браузеры запускались.Следовательно, мне действительно нужно другое поведение для метода @Before, называемого setUp .

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

Вот что я попробовал без успеха:

  • Я создал совершенно отдельный файл функций и файл StepDefinitions для тестов API.Файл определений не имеет ссылки на метод @Before.Тем не менее, @Before из UI тестов определений шагов все еще выполняется для функций API.Вот пример того, как я разделил файлы (раньше у меня они были в одном и том же пакете, хотя изображение показывается в разных пакетах): https://screencast.com/t/ht5Jz4cLC

    • Я пытался создатьновые пакеты для типов тестов, таких как .api и .ui.Это работает, когда я бегу через IntelliJ, но не работает, когда я выполняю «mvn test».Кажется, что тесты не найдены или не выполнены.Вот как выглядит эта настройка: https://screencast.com/t/uSlB4sYTFm

    • Я попытался установить статическое свойство в одном из моих методов тестирования, чтобы определить, есть ли у меня тест API, а затем обновить реализацию в setUp() на основании этого.Это, конечно, не сработало, потому что setUp () выполняется перед фактическим тестом, который знает, является ли это тестом UI или API.

Есть ли способ изменить поведение setUp в автоматическом режиме, чтобы он выполнял / не выполнял соответствующую логику в зависимости от типа теста (API / UI)?

Ответы [ 2 ]

2 голосов
/ 13 марта 2019
Feature File :- Hainvg 2 Scenarios, one for UI and other one for API

@UI
Scenario: This is First UI Scenario running on chrome browser
 Given this is the first step
 When this is the second step
 Then this is the third step

@Non-UI 
Scenario: This is First Non-UI Scenario running on chrome browser
 Given this is the first step
 When this is the second step
 Then this is the third step

 ------------------------------------------ Hook Implementation ------------------------------------------
@Before("@UI")
    public void beforeUISetup(){
       Do here :- In several features, related to the UI, I need to perform some actions before every single scenario such as spinning up VMs
    } 

@Before("@Non-UI")
    public void beforeNon-UIScenario(){
     Do here :- in non-UI tests, such as API tests, I don't need those browsers to be spun up
    } 

В случае, если вам сначала нужно запустить метод Non-UI @Before, тогда мы также можем установить порядок этих @Before.

2 голосов
/ 12 марта 2019

Для этого можно использовать теговые хуки: «Хуки могут быть условно выбраны для выполнения на основе тегов сценария. Чтобы запустить определенный хук только для определенных сценариев, можно связать Хук с выражением тега».из документов .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...