Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot 黄瓜+;TestNG+;弹簧靴_Spring Boot_Testng_Integration Testing_Cucumber Java - Fatal编程技术网

Spring boot 黄瓜+;TestNG+;弹簧靴

Spring boot 黄瓜+;TestNG+;弹簧靴,spring-boot,testng,integration-testing,cucumber-java,Spring Boot,Testng,Integration Testing,Cucumber Java,跑步者级别: @CucumberOptions(plugin = "json:target/cucumber-report.json") @Test(groups = "slow") public class RunCukesTest extends AbstractTestNGCucumberTests { } 步骤定义类: @ContextConfiguration(loader=SpringApplicationContextLoader.class, classes = {Appli

跑步者级别:

@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不是自动连接的,为什么


感谢您的帮助。

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() {
         //...
    }
}
在运行main class
RunTests
之后,它将尝试查找小黄瓜文件并将它们与步骤匹配。跨Java类的步骤结构如何并不重要


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

为了将Cucumber和Spring测试与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>
步骤定义

@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);
    }
}

我认为尝试将Cucumber与TestNG集成是没有意义的。这就像将JUnit与TestNG集成一样。->不,这是有意义的,因为您可以将TestNG断言和工具与测试描述一起使用。它是完全兼容的(例如并行性)。参考cucumber doc@marie,也许你没有注意到这个答案是在2016年写的。cucumber testng的第一个版本于2017年开始出现在maven central。如果某些答案已经过时,请随意创建单独的答案。是的,对不起,我没有注意日期。不幸的是,我没有答案来帮助我,因为我在cucumber testng和spring boot方面也有问题project@luboskrnaccucumber testng存在于2016年,它位于info.cukes组下(与所有cucumber软件包一样)。尽管如此,Cucumber仍然需要步骤定义的测试断言,因为它本身不提供这些断言。因此,如果这是您的单元测试框架,那么将Cucumber与TestNG集成是有意义的。
@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);
    }
}