QAF cucumber TestNG с пружинной загрузкой

#spring-boot #cucumber #testng #gherkin #qaf

#пружинная загрузка #огурец #testng #корнишон #qaf

Вопрос:

У меня есть проект cucumber, который использует весеннюю загрузку и testng.

Здесь основные классы

 @SpringBootTest
public class CucumberTestDefinitions extends FunctionalTesting {

    @Given("Something")
    public void smthg(){

    }
}
  
 @ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = FunctionalTestingApp.class, initializers =
        ConfigFileApplicationContextInitializer.class)
public class FunctionalTesting {

    @Autowired
    protected FunctionalTestingConfiguration configuration;
}
  
 @EnableConfigurationProperties(value = {FunctionalTestingConfiguration.class})
public class FunctionalTestingApp  {
}
  
 @EnableAutoConfiguration
@ConfigurationProperties(prefix = "testing")
@Data
public class FunctionalTestingConfiguration {
// the config from yml file
}
  

У меня нет testng.xml файл, поскольку тесты запускаются с весенней загрузкой.
По некоторым причинам я хотел бы расставить приоритеты тестов, и я увидел, что могу использовать QAF (https://qmetry.github.io/qaf/latest/scenario-meta-data.html#pre-defined-meta-data-for-bdd).
Я пытался использовать его, но это не сработало.

Вот что я сделал:

Я добавил зависимость к pom.xml (Я использую cucumber 5)

Я добавил эту аннотацию @QAFTestStepProvider в класс CucumberTestDefinitions

Я добавил этот плагин "com.qmetry.qaf.automation.cucumber.QAFCucumberPlugin" в класс RunnerTest

Здесь ошибка

java.lang.NoSuchMethodError: 'java.lang.reflect.Method com.qmetry.qaf.automation.step.client.TestNGScenario.getMethod()'

Я попытался добавить testng.xml файл в папке конфигурации, но это не помогло

Совместим ли QAF с весенней загрузкой?

Большое спасибо за помощь

Редактировать

pom.xml :

         <dependency>
            <groupId>io.cucumber</groupId>
            <artifactId>cucumber-java</artifactId>
            <version>5.4.0</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>io.cucumber</groupId>
            <artifactId>cucumber-testng</artifactId>
            <version>5.6.0</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>io.cucumber</groupId>
            <artifactId>cucumber-spring</artifactId>
            <version>5.4.0</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.qmetry</groupId>
            <artifactId>qaf-cucumber</artifactId>
            <version>3.0.0</version>
        </dependency>
        
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.5.RELEASE</version>
  

Класс Runner

         features = {"src/test/resources/toto"})
public class RunnerTest extends AbstractTestNGCucumberTests {

    @Autowired
    private ObjectMapper objectMapper;

    @Override
    @DataProvider(parallel = true)
    public Object[][] scenarios() {
        return super.scenarios();
    }

    @PostConstruct
    public void setUp() {
        objectMapper.registerModule(new JavaTimeModule());
    }

}
  

сообщение об ошибке

 java.lang.NoSuchMethodError: 'java.lang.reflect.Method com.qmetry.qaf.automation.step.client.TestNGScenario.getMethod()'
    at com.qmetry.qaf.automation.step.client.TestNGScenario.init(TestNGScenario.java:92)
    at com.qmetry.qaf.automation.step.client.TestNGScenario.<init>(TestNGScenario.java:70)
    at com.qmetry.qaf.automation.step.client.TestNGScenario.<init>(TestNGScenario.java:64)
    at com.qmetry.qaf.automation.testng.TestRunnerFactory.convert(TestRunnerFactory.java:76)
    at com.qmetry.qaf.automation.testng.TestRunnerFactory.init(TestRunnerFactory.java:67)
    at com.qmetry.qaf.automation.testng.TestRunnerFactory.newTestRunner(TestRunnerFactory.java:63)
    at org.testng.ITestRunnerFactory.newTestRunner(ITestRunnerFactory.java:55)
    at org.testng.SuiteRunner$ProxyTestRunnerFactory.newTestRunner(SuiteRunner.java:676)
    at org.testng.SuiteRunner.init(SuiteRunner.java:178)
    at org.testng.SuiteRunner.<init>(SuiteRunner.java:112)
    at org.testng.TestNG.createSuiteRunner(TestNG.java:1275)
    at org.testng.TestNG.createSuiteRunners(TestNG.java:1251)
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1100)
    at org.testng.TestNG.runSuites(TestNG.java:1039)
    at org.testng.TestNG.run(TestNG.java:1007)
    at com.intellij.rt.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:66)
    at com.intellij.rt.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:110)
  

Комментарии:

1. какую версию qaf, qaf-cucumber, TestNG и cucumber вы используете? можете ли вы также предоставить подробную трассировку стека ошибок? Можете ли вы также поделиться своим классом бегуна?

Ответ №1:

К сожалению, я не смог воспроизвести ту же ошибку и получить другие ошибки, касающиеся зависимостей. Однако, чтобы ответить на ваш первоначальный вопрос «QAF cucumber TestNG with spring boot» и аспект «нравится определять приоритеты тестов», короткий ответ — да. Но, вероятно, не оба TESTNG и Cucumber runner вместе взятые, особенно расставляйте приоритеты в тестах. Что это значит?

Когда вы используете предложенный способ cucumber для TestNG, он просто создает один фиктивный тест в TestNG и передает сценарии в качестве тестовых данных. Который не будет способен рассматривать каждый сценарий как независимый тестовый тест! таким образом, вы не сможете воспользоваться всеми преимуществами TestNG (например, приоритетом).

Однако это не означает, что вы не можете достичь или не можете использовать QAF Cucmber TestNG вместе. Когда вы используете QAF, он имеет чистую реализацию TestNG для BDD. QAF рассматривает каждый сценарий как тест TestNG, а сценарий с примерами (схема сценария) — как тест, управляемый данными. qaf-cucuber позволит использовать шаги cucumber, включая внедрение зависимостей по вашему выбору, Spring в вашем случае. Вы получите преимущества всех функций TestNG, включая параллельное выполнение, прослушиватели и расширенные функции QAF, такие как фильтр метаданных, фильтр тестовых данных,

Поэтому, когда вы хотите использовать TestNG, лучше предоставить конфигурацию TestNG для запуска ваших функциональных файлов, написанных на BDD2 или Gherkin (подмножество BDD2). Все, что вам нужно сделать, это создать следующий XML-файл для запуска файла функций, написанного с использованием BDD2 или Gherkin.

 <suite name="QAF Demo" verbose="0">
<parameter name="step.provider.pkg" value="pkg.from.where.steps.needs.tobe.loaded" />
<parameter name="scenario.file.loc" value="src/test/resources/toto" />
<test name="BDD Test" enabled="true">
    <classes>
        <class name="com.qmetry.qaf.automation.step.client.text.BDDTestFactory2"></class>
    </classes>
</test>
</suite>
  

Примечание:

  • устанавливается step.provider.sharedinstance в true значение при использовании пошаговой реализации cucumber с переменными класса, используемыми в step.

  • вышеописанным способом, поскольку вы не используете cucumber runner, поэтому любые cucumber-хукеры не будут выполнены. Когда вы используете TestNG, он имеет лучшую поддержку прослушивателя, которую вы можете использовать, и пошаговый прослушиватель, который вы можете использовать с QAF. Итак, если у вас есть какие-либо реализованные перехваты, вы можете переместить их в соответствующие методы прослушивания до / после и зарегистрировать прослушиватель в файле конфигурации.


РЕДАКТИРОВАТЬ: я попробовал тестовый проект, которым вы поделились, с ним я также столкнулся с различными проблемами. Наконец-то я смог разобраться в этом, как показано ниже.

Обновления POM:

         <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>com.vaadin.external.google</groupId>
                    <artifactId>android-json</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>6.10</version>
            <scope>test</scope>
        </dependency>

  

У вас есть два варианта. Использование фабрики BDD2, которая создает TestNGScenario для каждого сценария или способа запуска cucumber. В любом случае это должно сработать. Вы можете добавить панель отчетов для просмотра отчетов после выполнения.

Вариант-1: чистый тестовый процесс

Создайте конфигурационный файл для запуска в качестве чистого теста Testng с помощью BDDTestFactory2 :

 <suite name="QAF Demo" verbose="0">
    <parameter name="step.provider.pkg" value="my.custom.packagename.testing"/>
    <parameter name="scenario.file.loc" value="src/test/resources/my/custom/packagename/testing"/>
    <parameter name="step.provider.sharedinstance" value="true" />
    <test name="BDD Test" enabled="true">
        <classes>
            <class name="com.qmetry.qaf.automation.step.client.text.BDDTestFactory2"></class>
        </classes>
    </test>
</suite>
  

Используйте этот файл конфигурации вместо вашего класса runner. В этом случае вам не требуется зависимость cucumber-testng.

Вариант-2: бегун для огурцов для тестирования

  • у вас будет необходимая зависимость cucumber-testng
  • Для запуска с использованием вашего cucumber runner используйте ту же версию для cucumber и cucumber testng. В вашем случае версия cucumber-* должна быть одинаковой либо 5.6.0 , либо 5.4.0
  • Обновите класс runner, как показано ниже:
 @CucumberOptions(plugin = {"com.qmetry.qaf.automation.cucumber.QAFCucumberPlugin", "pretty", "html:target", "timeline:target"},
        /*tags = {"@Ignore"},*/
        features = {"src/test/resources/my/custom/packagename/testing"})
public class RunnerTest extends AbstractTestNGCucumberTests {

    @Autowired
    private ObjectMapper objectMapper;
    
    @Test(groups = "cucumber", description = "Runs Cucumber Scenarios", dataProvider = "scenarios")
    public void runScenario(PickleWrapper pickleWrapper, FeatureWrapper featureWrapper) throws Throwable {
        super.runScenario(pickleWrapper,featureWrapper);
    }

    @Override
    @DataProvider(parallel = true, name = "scenarios")
    public Object[][] scenarios() {
        return super.scenarios();
    }

    @PostConstruct
    public void setUp() {
        objectMapper.registerModule(new JavaTimeModule());
    }

}
  

Запуск от имени TestNG.

Комментарии:

1. Спасибо за помощь, я создал репозиторий github, который воспроизводит ошибку github.com/marcesso/qafTesting . Проблема может заключаться в простом отсутствующем файле или неправильном пути к файлу

2. спасибо за обновление, я скоро попробую и дам вам знать

3. Все сработало, как ожидалось, большое спасибо. Я использовал вариант 2, проблемы заключались в смешанных версиях зависимостей cucumber, отсутствующей зависимости cucumber-testng в pom и отсутствующем методе @Test в RunnerTest.class