Несколько @До/@После с огурцом и весной?

#spring #junit #cucumber #junit5 #cucumber-jvm

Вопрос:

Я не понимаю конфигурацию огурца и не могу найти ни одного примера по этому поводу.

Структура папок:

 src/
 |-test/
    |-resources/
    |  |-cucumber/
    |     |-auth/
    |     |  |-Login.feature
    |     |-contributions/
    |        |-ClearanceCertificates.feature
    |-java/
       |-de/
          |-vbg/
             |-other/
                |-again/
                   |-important/
                      |-cucumber/
                      |  |-auth/
                      |  |  |-LoginStepDefinitions.java
                      |  |-contributions/
                      |     |-ClearanceCertificatesStepDefinitions.java
                      |-CucumberBase.java
                      |-SeleniumApplicationTests.java
 

CucumberBase.java:

 @RunWith(Cucumber.class)
@CucumberOptions(
    features = "src/test/resources",
    plugin = {"pretty", "html:build/reports/tests/test/cucumber.html"})
public class CucumberBase {}
 

SeleniumApplicationTests.java:

 @CucumberContextConfiguration
@SpringBootTest
class SeleniumApplicationTests {}
 

Оба *StepDefinitions.java имеют @Before и @After определены. Мое предположение состояло в том, что StepDefinitions они соответствуют *feature -файлам на основе местоположения/пакета.

Однако в моих тестах Login.feature выполняется то, @After что определено в ClearanceCertificatesStepDefinitions.java .

Как это должно быть правильно настроено?

Ответ №1:

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

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

 Feature: Example

  @browser
  Scenario: Open a browser window
    ...
   
  @headless
  Scenario: Make a http call
    ...
 
 @After("@browser and not @headless")
public void doSomethingAfter(Scenario scenario){
  // only executed after "Open a browser window"
}
 

https://cucumber.io/docs/cucumber/api/#conditional-hooks


В качестве альтернативы вы можете изменить организацию своего кода.

  |- src/test/java/com/example/one/RunCucumberTest1.java
 |- src/test/resources/com/example/one/example-1.feature

 |- src/test/java/com/example/two/RunCucumberTest2.java
 |- src/test/resources/com/example/two/example-2.feature
  
 |- src/test/java/com/example/common/AbstractCucumberTest.java
 |- src/test/java/com/example/common/SeleniumApplicationTests.java
 
 @RunWith(Cucumber.class)
@CucumberOptions(extraGlue = "com.example.common")
public abstract class AbstractCucumberTest {}
 
 public class RunCucumberTest1 extends AbstractCucumberTest {}
 
 public class RunCucumberTest2 extends AbstractCucumberTest {}
 

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

Комментарии:

1. Большое спасибо! Работает очень хорошо. Теперь использую теги.