Удалить дубликаты файлов TestNG Cucumber Runner - PullRequest
0 голосов
/ 20 сентября 2019

Я внедрил Testng и Cucumber для моего проекта по селену.Я запускаю свои тестовые случаи, выполняя Testng.xml, где я перенаправил их в Testng Runner File.Единственное различие в каждом файле Runner - это @tag, который связан со сценарием функции Cucumber, поэтому я создал отдельные файлы Runner с @sanity @regression и т. Д. Я хочу избежать создания такого количества файлов Runner, поскольку только @tag является переменной,Я хочу параметризовать аннотацию, чтобы у меня был только один файл бегуна.


package com.ibm.wce.scbn.cc.runner;

import org.apache.log4j.Logger;
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.CucumberFeatureWrapper;
import cucumber.api.testng.TestNGCucumberRunner;

@CucumberOptions(features = "./Features", glue = { "com.ibm.wce.scbn.cc.stepdefinitions" }, tags = { "@Sanity" }

)

public class Sanity {

    private TestNGCucumberRunner testNGCucumberRunner;
    private static final Logger logger = Logger.getLogger(Sanity.class.getName());

    @BeforeClass(alwaysRun = true)
    public void setUpClass() throws Exception {

        logger.info("initialize TestNG cucumber runner");
        testNGCucumberRunner = new TestNGCucumberRunner(this.getClass());
    }

    @Test(dataProvider = "features")
    public void feature(CucumberFeatureWrapper cucumberFeature) {
        logger.info("Running Cucumber features in loop");

        testNGCucumberRunner.runCucumber(cucumberFeature.getCucumberFeature());
    }

    @DataProvider
    public Object[][] features() {
        logger.info("inside data provider");

        return testNGCucumberRunner.provideFeatures();
    }

    @AfterClass(alwaysRun = true)
    public void tearDownClass() throws Exception {
        logger.info("close cucumber runner");

        testNGCucumberRunner.finish();
    }

}
Feature: Validating Mailbox response using Json data provider

  @Sanity
  Scenario: Validate Mailbox Bad Request response
    Given We have an ENDPOINT_baseURI "api.baseUrl"
    Given I set test report name "Mailbox API-Without required fields(Bad Request)"
    And We declare a new Request
    And We have Json request "bad_request" in file "api.mailboxJsonPayLoads"
    And We have below Header parameters
      | Content-Type | application/json |
    When We send post request to service "api.mailboxService"
    Then The response status code should be Bad Request
<suite name="Suite1">
    <test name="Sanity">
        <classes>
            <class name="com.ibm.wce.scbn.cc.runner.Sanity" />
        </classes>
    </test> <!-- Test -->
    <test name="Regression">
        <classes>
            <class name="com.ibm.wce.scbn.cc.runner.Regression" />
        </classes>
    </test> <!-- Test -->
</suite> <!-- Sanity1 -->

1 Ответ

0 голосов
/ 20 сентября 2019

Аннотации не могут быть параметризованы.

Если вы хотите, чтобы это было сделано, то есть раунд о том, как это сделать.

Вот шаги, которые вы должны выполнить

  1. Выначните с того, что класс реализует интерфейс аннотаций cucumber.api.CucumberOptions
  2. Создайте в этом классе условия, позволяющие ему читать теги, которые должны быть выполнены из аргумента JVM, и возвращать его при вызове cucumber.api.CucumberOptions#tags.
  3. Создайте прослушиватель TestNG, который реализует org.testng.IInvokedMethodListener
  4. В этом методе beforeInvocation() этого слушателя вы получите доступ к методу test и через него, к классу, в котором он находится.Получить объект класса.
  5. В найденном объекте класса прочитайте и проверьте, есть ли у него аннотация cucumber.api.CucumberOptions.Если у него установлен набор аннотаций, вам нужно будет использовать отражение для класса, в котором вы замените исходный объект аннотации на пользовательский объект, который вы создали в (1)
  6. Подключите этого слушателя к вашему наборуфайл с использованием тега <listeners> или через механизм поставщика услуг.

Это должно помочь вам выполнить ваше требование.

Вот несколько примеров кода из одного из моих открытыхисходные библиотеки, которые я создал, в которых используется эта концепция.

  1. Реализация аннотации приведена в здесь .
  2. Подключение вашей реализации через прослушиватель TestNG, см. здесь .
  3. Утилита отражения, которая позволяет изменять значения аннотаций во время выполнения, см. здесь .
  4. Сервис-провайдер интерфейса механизма подключения в слушателе, см. здесь .
...