【问题标题】:Cucumber + TestNG + SpringBoot黄瓜 + TestNG + Spring Boot
【发布时间】:2016-03-12 11:51:40
【问题描述】:

跑步者类:

@CucumberOptions(plugin = "json:target/cucumber-report.json")
@Test(groups = "slow")
public class RunCukesTest extends AbstractTestNGCucumberTests {
}

步骤定义类:

@ContextConfiguration(loader=SpringApplicationContextLoader.class,  classes = {Application.class,MarketDataServiceMockConfig.class})
@WebIntegrationTest({"server.port=0", "management.port=0"})
@TestExecutionListeners(inheritListeners = false, listeners = {
    DependencyInjectionTestExecutionListener.class,
    DirtiesContextTestExecutionListener.class })
public class MyStepdefs extends AbstractTestNGCucumberTests {

private MockMvc mockMvc;
@Autowired
private FilterChainProxy filterChainProxy;


@Autowired
private WebApplicationContext wac;

@Before
public void setUp() {

    wac = (EmbeddedWebApplicationContext) SpringApplication.run(Application.class);


}

}

filterChainProxy 和 wac 没有自动装配,为什么?

感谢您的帮助。

【问题讨论】:

    标签: spring-boot testng integration-testing cucumber-java


    【解决方案1】:

    为了使用 Cucumber 和 Spring Test 和 TestNG 而不是 JUnit,您只需在步骤定义中扩展 AbstractTestNGSpringContextTests,其余代码保持不变。


    完整代码:

    pom.xml

    <!-- TestNG -->
    <dependency>
        <groupId>org.testng</groupId>
        <artifactId>testng</artifactId>
        <version>${testng.version}</version>
        <scope>test</scope>
    </dependency>
    
    <!-- Cucumber with TestNG -->
    <dependency>
        <groupId>info.cukes</groupId>
        <artifactId>cucumber-testng</artifactId>
        <version>${cucumber.version}</version>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    
    <!-- Spring Test -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>${spring.version}</version>
        <scope>test</scope>
    </dependency>
    
    <!-- Cucumber with Spring -->
    <dependency>
        <groupId>info.cukes</groupId>
        <artifactId>cucumber-spring</artifactId>
        <version>${cucumber.version}</version>
        <scope>test</scope>
    </dependency>
    

    测试执行器

    @CucumberOptions(plugin = "json:target/cucumber-report.json")
    @Test(groups = "slow")
    public class RunCukesTest extends AbstractTestNGCucumberTests {
    }
    

    步骤定义

    @ContextConfiguration(loader=SpringApplicationContextLoader.class,  classes = {Application.class,MarketDataServiceMockConfig.class})
    @WebIntegrationTest({"server.port=0", "management.port=0"})
    @TestExecutionListeners(inheritListeners = false, listeners = {
        DependencyInjectionTestExecutionListener.class,
        DirtiesContextTestExecutionListener.class })
    // Notice that the class extends AbstractTestNGSpringContextTests now
    public class MyStepdefs extends AbstractTestNGSpringContextTests {
    
        private MockMvc mockMvc;
    
        @Autowired
        private FilterChainProxy filterChainProxy;
    
        @Autowired
        private WebApplicationContext wac;
    
        @Before
        public void setUp() {
            wac = (EmbeddedWebApplicationContext) SpringApplication.run(Application.class);
        }
    }
    

    【讨论】:

      【解决方案2】:

      Cucumber 和 TestNG 都是测试框架。 Cucumber 是用于 BDD 测试的工具,TestNG 用于单元/集成测试。我认为尝试将 Cucumber 与 TestNG 集成是没有意义的。这就像将 JUnit 与 TestNG 集成一样。

      所以如果你想用 Spring 执行 Cucumber 测试,有模块 cucumber-spring

      您将拥有类似于主要测试执行器的东西:

      import org.junit.runner.RunWith;
      import cucumber.junit.Cucumber;
      
      @RunWith(Cucumber.class)
      @CucumberOptions(format={"pretty", "html:target/cucumber"})
      public class RunTests {
      }
      

      您将在定义 Spring 上下文的类中定义步骤:

      @ContextConfiguration(YourContext.class)
      public class StepDefinitions {
          @Autowired
          private YourBean yourBean;
      
          @Given("^your given line$")
          public void givenLine() {
               //...
          }
      
          @When("^your when line$")
          public void whenLine() {
               //...
          }
      
          @Then("^your then assertions$")
          public void thenAssertions() {
               //...
          }
      }
      

      运行主类RunTests后,它会尝试查找Gherkin文件并与步骤匹配。与 Java 类中步骤的结构无关。

      但我必须警告你,Cucumber 最初是用 Ruby 设计的,所以一些概念对于 Java 程序员来说可能看起来很奇怪。步骤之间的共享状态需要通过一些类级别的变量来完成。不允许重复步骤。如果您需要在两个不同类中定义的步骤之间共享状态,则需要使用一些全局对象。

      【讨论】:

      • 我认为尝试将 Cucumber 与 TestNG 集成是没有意义的。这就像将 JUnit 与 TestNG 集成。 -> 不,这是有道理的,因为您可以使用带有 Cucumber 测试描述的 TestNG 断言和工具。它是完全兼容的(例如并行性)。参考黄瓜文档cucumber.io/docs/cucumber/checking-assertions/?sbsearch=TestNG
      • @marie,也许你没有注意到这个答案是在 2016 年写的。cucumber-testng 的第一个版本于 2017 年开始出现在 maven Central 中。如果某些答案已经过时,请随时创建单独的答案。
      • 是的,抱歉,我没注意日期。不幸的是,我没有帮助的答案,因为我也有黄瓜 testng 和 spring boot 项目的问题
      • @luboskrnac cucumber-testng 存在于 2016 年,它位于 info.cukes 组下(所有黄瓜包也是如此)。尽管如此,Cucumber 需要为步骤定义测试断言,因为它自己不提供它们。因此,如果这是您的单元测试框架,那么将 Cucumber 与 TestNG 集成是有意义的。
      猜你喜欢
      • 2017-07-18
      • 1970-01-01
      • 2020-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多