首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Cucumber & TestNG在不同@Test或xml <test>中运行黄瓜场景

如何使用Cucumber & TestNG在不同@Test或xml <test>中运行黄瓜场景
EN

Stack Overflow用户
提问于 2017-02-01 23:13:05
回答 3查看 7.2K关注 0票数 1

我正在考虑用TestNG运行黄瓜测试。然而,我遇到了一个问题,我的所有方案都作为一个TestNG @Test会话运行。有没有办法将每个场景作为单独的@Test会话运行?

下面是我的TestNG xml:

代码语言:javascript
复制
 <suite name="cucumber Suites">
     <test name="cucumber-testing">
         <classes>
            <class name="runners.Run2" />
         </classes>
     </test>
 </suite>

这将调用run以下Test类:

代码语言:javascript
复制
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

import cucumber.api.CucumberOptions;
import cucumber.api.testng.AbstractTestNGCucumberTests;
import cucumber.api.testng.CucumberFeatureWrapper;
import cucumber.api.testng.TestNGCucumberRunner;

@CucumberOptions(   features="cucumber/features/example.feature",
                    glue="steps",
                    format={"pretty"}
                )
public class Run2 extends AbstractTestNGCucumberTests{
    private TestNGCucumberRunner tcr;

    @BeforeClass(alwaysRun=true)
    public void beforeClass() throws Exception{
        tcr = new TestNGCucumberRunner(this.getClass());
    }

    @Test(groups="cucumber", description="Runs CucumberFeature", dataProvider="features")
    public void feature(CucumberFeatureWrapper cucumberFeature){
        tcr.runCucumber(cucumberFeature.getCucumberFeature());
    }

    @DataProvider
    public Object[][] features(){
        return tcr.provideFeatures();
    }

    @AfterClass (alwaysRun=true)
    public void afterClass(){
        tcr.finish();
    }
}

我想知道是否有一种方法可以让@DataProviderto提供场景和@Test来运行场景而不是特性?

这样做的原因是我对侦听器进行了其他TestNG测试,并且我希望使用相同的侦听器来报告黄瓜测试。

谢谢

EN

回答 3

Stack Overflow用户

发布于 2017-02-02 16:46:17

您可以尝试为每个功能提供一个特定的测试名称:

代码语言:javascript
复制
@CucumberOptions(   features="cucumber/features/example.feature",
                    glue="steps",
                    format={"pretty"}
                )
public class Run2 extends AbstractTestNGCucumberTests implements ITest {
    private TestNGCucumberRunner tcr;
    private String featureName;

    @BeforeClass(alwaysRun = true)
    public void beforeClass() throws Exception {
        tcr = new TestNGCucumberRunner(this.getClass());
    }

    @BeforeMethod
    public void beforeMethod(Object[] params) {
        CucumberFeatureWrapper cucumberFeature = (CucumberFeatureWrapper) params[0];
        featureName = cucumberFeature.getCucumberFeature().getGherkinFeature().getName();
    }

    @Test(groups = "cucumber", description = "Runs CucumberFeature", dataProvider = "features")
    public void feature(CucumberFeatureWrapper cucumberFeature) {
        tcr.runCucumber(cucumberFeature.getCucumberFeature());
    }

    @Override
    public String getTestName() {
        return featureName;
    }

    @DataProvider
    public Object[][] features() {
        return tcr.provideFeatures();
    }

    @AfterClass(alwaysRun = true)
    public void afterClass() {
        tcr.finish();
    }
}

如果这是你想要的方式,请告诉我。

票数 1
EN

Stack Overflow用户

发布于 2017-02-01 23:41:20

你有没有试过:

代码语言:javascript
复制
@CucumberOptions(   features="cucumber/features/example.feature",
                    glue="steps",
                    format={"pretty"}
                )
public class Run2 extends AbstractTestNGCucumberTests{
    private TestNGCucumberRunner tcr;

    @BeforeClass(alwaysRun=true)
    public void beforeClass() throws Exception{
        tcr = new TestNGCucumberRunner(this.getClass());
    }

    @Test(groups="cucumber", description="Runs CucumberFeature")
    public void scenario(){
        for (CucumberFeatureWrapper cucumberFeature : tcr.provideFeatures()) {
            tcr.runCucumber(cucumberFeature.getCucumberFeature());
        }
    }

    @AfterClass (alwaysRun=true)
    public void afterClass(){
        tcr.finish();
    }
}
票数 0
EN

Stack Overflow用户

发布于 2018-04-10 17:03:20

答案是“是的”,您可以使用TestNG将cucumber中的每个场景作为测试运行。

多么?具体解释如下:

首先,将您的dependencies

  • Then依赖项从info.cukes更新到io.cucumber

  • ,而不是在下面的代码中使用"TestNGCucumberRunner“的"provideFeatures()”方法:

@DataProvider公共对象功能(){ return tcr.provideFeatures();}

在@DataProvider中使用"provideScenarios()“方法。

以下Cucumber Runner Class中的Java代码非常适合我在功能文件中将每个场景作为TestNG测试运行:

代码语言:javascript
复制
public class TestRunner {
    private TestNGCucumberRunner testNGCucumberRunner;

    @BeforeClass(alwaysRun = true)
    public void setUpClass() throws Exception {
        testNGCucumberRunner = new TestNGCucumberRunner(this.getClass());
    }

    @Test(groups = "cucumber scenarios", description = "Runs Cucumber 
    Scenarios", dataProvider = "scenarios")
    public void scenario(PickleEventWrapper pickleEvent, CucumberFeatureWrapper 
    cucumberFeature) throws Throwable{
        testNGCucumberRunner.runScenario(pickleEvent.getPickleEvent());
    }
    @DataProvider
    public Object[][] scenarios() {
        return testNGCucumberRunner.provideScenarios();
    }

    @AfterClass(alwaysRun = true)
    public void tearDownClass() throws Exception {
        testNGCucumberRunner.finish();
    }
}

我很高兴看到你的问题得到解决。

参考:https://github.com/cucumber/cucumber-jvm/blob/master/testng/README.md

我遵循了这个方法:https://github.com/cucumber/cucumber-jvm/blob/master/examples/java-calculator-testng/src/test/java/cucumber/examples/java/calculator/RunCukesByCompositionTest.java

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41983175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档