Есть ли способ повторно использовать шаги cucumber из нескольких проектов в другом проекте?

#spring #kotlin #cucumber #cucumber-jvm

#spring #kotlin #cucumber #cucumber-jvm

Вопрос:

У меня есть 2 микросервиса, A и B, для которых в их собственных проектах определены тесты cucumber.

Сервис A

 @ContextConfiguration(classes = [AppConfiguration::class])
class ServiceAStepDefs @Autowired constructor(private var serviceAProfile: ServiceAProfile) : En {
    //stepdefs live here
}

  
 class AppConfiguration {

    @Bean
    fun serviceAProfileMaker(): ServiceAEnvironmentProfile {
        val oktaConfig = DefaultOAuth2Config.getToken()
        return ProfileManager.getEnvProfile(token)
    }

}
  

Сервис B

 @ContextConfiguration(classes = [AppConfiguration::class])
class ServiceBStepDefs {
    //stepdefs live here
}    
  
 @ComponentScan("com.hello.*")
class AppConfiguration {

    @Bean
    fun serviceBProfileMaker(): ServiceBEnvironmentProfile {
        val token = DefaultOAuth2Config.getToken()
        return ProfileManager.getEnvProfile(token)
    }
}

  

В другом проекте, C, я хочу протестировать эти 2 сервиса вместе. Чтобы сделать это, я создал файл jar, содержащий определения шагов для каждой из служб, и перенес их в project C в качестве зависимостей.

Когда я пытаюсь запустить тесты cucumber из проекта C, используя шаги из сервисов A и B, я вижу проблему, из-за которой контекст Spring подбирается в обоих проектах, что, я полагаю, правильно.

 10:17:59.936 [DEBUG] [TestEventLogger]     io.cucumber.core.backend.CucumberBackendException: Glue class class com.hello.serviceA.stepdefs.ServiceASteps and class com.hello.stepdefs.ServiceBSteps both attempt to configure the spring context. Please ensure only one glue class configures the spring context
  

Есть ли у меня способ подключить эти 2 службы, чтобы я мог настроить компоненты для обоих и повторно использовать шаги?

Ответ №1:

При использовании cucumber-spring Cucumber используется TestContextManager фреймворк Spring. Эта платформа запускает тестовый контекст с использованием одного класса. Этот класс проверяется на наличие любых аннотаций, которые настраивают контекст приложения, таких как @ContextConfiguration .

Поскольку оба определения шага имеют эту аннотацию, Cucumber не может решить, какой использовать, и вы получите сообщение об ошибке с жалобой на это. Чтобы решить эту проблему, вы должны убедиться, что только один класс glue имеет @ContextConfiguration аннотацию.

Cucumber v5.6.0 добавил @CucumberContextConfiguration , который немного упростил это выполнение.

Итак, вы можете захотеть структурировать свои проекты следующим образом:

 a
|- config
| | AConfiguration with `@CucumberContextConfiguration` and `@ContextConfiguration(...)`
| | RunCucumberTest with `@CucumberOptions(extraGlue="a.steps")`
|- steps
| | ASteps

b
|- config
| | BConfiguration with `@CucumberContextConfiguration` and `@ContextConfiguration(...)`
| | RunCucumberTest with `@CucumberOptions(extraGlue="b.steps")`
|- steps
| | BSteps

c
|- config
| | CConfiguration with `@CucumberContextConfiguration` and `@ContextConfiguration(...)`
| | RunCucumberTest with `@CucumberOptions(extraGlue={"a.steps", "b.steps"})`
  

Смотрите: https://github.com/cucumber/cucumber-jvm/tree/main/spring