Как получить текущее имя файла функции Cucumber во время выполнения, используя Java

Я хочу получить текущее имя файла функции во время выполнения, используя Java. У меня есть информация о сценарии в ловушке, но я не могу получить файл функции

@Before
    public void before(final Scenario scenario) {
               this.scenario = scenario;
      }

Есть ли у нас что-то подобное, чтобы получить текущее имя файла Feature?? я использую огурец версии 1.2.4

8 ответов

ОБНОВИТЬ:

Это моя реализация имен объектов, начинающихся с заглавной буквы, как в примере:

private String getFeatureFileNameFromScenarioId(Scenario scenario) {
    String featureName = "Feature ";
    String rawFeatureName = scenario.getId().split(";")[0].replace("-"," ");
    featureName = featureName + rawFeatureName.substring(0, 1).toUpperCase() + rawFeatureName.substring(1);

    return featureName;
}

ОРИГИНАЛ:

Я не знаю, полезно ли это для вас, но я бы предложил использовать scenario.getId()

Это даст вам имя файла компонента и имя сценария, например:

Feature: Login to the app

Scenario: Login to the app with password
Given I am on the login screen
When I enter my passcode
Then I press the ok button

с scene.getId() вы получите следующее:

Логин-к-приложение, войдите-к-приложение-с-паролем

Надеюсь, это поможет вам!

Существует более простой способ извлечь имя функции (без постфикса .feature ) из Scenario, если вы можете добавить Apache commons-io в свой путь к классам:

      String featureName = FilenameUtils.getBaseName(scenario.getUri().toString());

Если вам нужно полное имя файла с постфиксом, вы должны вместо этого использовать метод getName(...) :

      String fullFeatureName = FilenameUtils.getName(scenario.getUri().toString());

Котлин 1.5, огурец-ява 6.10.0:

      @Before
fun beforeScenario(scenario: Scenario) {
    println(scenario.uri)
}

В моем случае печатает:

      file:///C:/Users/K.H/git/JvmClient/src/jvmTest/resources/features/C197544.feature

Создайте слушателя, как показано ниже

import io.cucumber.plugin.ConcurrentEventListener;
import io.cucumber.plugin.event.EventHandler;
import io.cucumber.plugin.event.EventPublisher;
import io.cucumber.plugin.event.TestCaseStarted;

public class Listener implements ConcurrentEventListener {

  @Override
  public void setEventPublisher(EventPublisher eventPublisher) {
    eventPublisher.registerHandlerFor(TestCaseStarted.class, testCaseStartedEventHandler);
  }

  private final EventHandler<TestCaseStarted> testCaseStartedEventHandler = event -> {
    System.out.println("Current file fame : " + event.getTestCase().getUri().toString());
  };
}

А затем предоставьте своему слушателю огурец, как показано ниже

"-p", "com.myProject.listener.Listener"

Это даст вам имя файла функции!

Создайте экземпляр сценария в классе Hooks с ключевым словом static. Затем вы можете использовать следующие коды внутри определений шагов.

      String currentFilePath = Hooks.scenario.getUri().toString();
String fileName = currentFilePath.substring(currentFilePath.lastIndexOf("/")+1);

Может быть так, его возвращаемое только имя файла:

private String getFeatureFileNameFromScenarioId(Scenario scenario) {
    String[] tab = scenario.getId().split("/");
    int rawFeatureNameLength = tab.length;
    String featureName = tab[rawFeatureNameLength - 1].split(":")[0];
    System.out.println("featureName: " + featureName);

    return featureName;
}

Я использовал метод ниже в классе Hooks

    @Before
    public void beforeScenario(Scenario scenario){

// scenarioId = "file:///**/src/test/resources/features/namefeature.feature:99"

        String scenarioId=scenario.getId(); 

        int start=scenarioId.indexOf(File.separator+"features"+File.separator);
        int end=scenarioId.indexOf(".");

        String[] featureName=scenarioId.substring(start,end).split(File.separator+"features"+File.separator);
        System.out.println("featureName ="+featureName[1]);
    }

Вы можете использовать Reporter для получения текущего запущенного экземпляра, а затем извлечь наше фактическое имя функции из файла функции следующим образом:

    Object[] paramNames = Reporter.getCurrentTestResult().getParameters();          
    String featureName = paramNames[1].toString().replaceAll("^\"+|\"+$", "");
    System.out.println("Feature file name: " + featureName);
Другие вопросы по тегам