Как запустить сценарий Cucumber в разных @Test или xml ‹test› с Cucumber и TestNG

Я собираюсь запустить тесты Cucumber с TestNG. Однако у меня проблема, когда все мои сценарии работают как один сеанс TestNG @Test. Есть ли способ запустить каждый сценарий как отдельный @Test сеанс?

Вот мой TestNG xml:

 <suite name="cucumber Suites">
     <test name="cucumber-testing">
         <classes>
            <class name="runners.Run2" />
         </classes>
     </test>
 </suite>

Это вызовет запуск следующего класса Test:

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 со слушателями, и я хочу использовать те же слушатели для отчетов для тестов Cucumber.

Спасибо


person T. Daves    schedule 01.02.2017    source источник


Ответы (3)


Что вы можете попробовать, так это указать конкретное имя теста для каждой функции:

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

Дай мне знать, если тебе так нравится.

person juherr    schedule 02.02.2017
comment
Пробовал и этот способ, и он не работает так, как хотелось бы. Единственный способ обойти мою проблему - вызвать @BeforeClass и @BeforeMethod в Cucumber @Before. То же самое и с @After. Спасибо за помощь. - person T. Daves; 02.02.2017
comment
@juherr - в этом подходе, если вы создаете экземпляр веб-драйвера в - @ BeforeClass или - @ Before Method, как вы отправите его в тестовый сценарий / объекты страницы? - person Mike; 17.06.2019
comment
@Mike Я не уверен, что понимаю связь между текущим вопросом и объектами webdriver / page. Думаю, вам следует задать новый вопрос. - person juherr; 19.06.2019

Вы уже пробовали:

@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();
    }
}
person juherr    schedule 01.02.2017
comment
Предоставленный вами код по-прежнему запускает все функции и сценарии как один @Test. Я ищу что-то вроде public void scenario(Scenario toRun){ trc.runScenario(toRun); }. Таким образом, @DataProvider будет вызывать несколько @Test методов, каждый из которых имеет свой сценарий - person T. Daves; 01.02.2017
comment
Это невозможно по-вашему: даже если вы можете предоставить разные вещи для разных методов с помощью поставщика данных, согласно коду Cucumber (github.com/cucumber/cucumber-jvm/blob/master/testng/src/main /), похоже, trc.runScenario(...) не существует, а Cucumber не позволяет запустить (или получить) сценарий. - person juherr; 01.02.2017

Ответ - «Да», вы можете запустить каждый сценарий на огурце в качестве теста с помощью TestNG.

Как? Это объясняется ниже:

  1. Прежде всего обновите зависимости Cucumber Maven с info.cukes до зависимостей io.cucumber.

  2. Затем вместо использования метода provideFeatures () из TestNGCucumberRunner в «вашем» следующем коде:

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

Используйте метод provideScenarios () в @DataProvider.

Следующий Java-код в Cucumber Runner Class отлично сработал для меня, чтобы запустить каждый сценарий как тест TestNG в файлах функций:

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

person Khan Here    schedule 10.04.2018