Как получить текущее имя файла функции 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);