如何使用 Java 在运行时获取当前 Cucumber 功能文件名

Posted

技术标签:

【中文标题】如何使用 Java 在运行时获取当前 Cucumber 功能文件名【英文标题】:how to get current Cucumber feature file name at runtime using Java 【发布时间】:2017-05-14 16:05:18 【问题描述】:

我想在运行时使用 Java 获取当前功能文件名。我在钩子中有场景信息,但无法获取功能文件

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

我们有没有类似的东西来获取当前的功能文件名?? 我正在使用黄瓜版本 1.2.4

【问题讨论】:

此功能有一个 PR - github.com/cucumber/cucumber-jvm/pull/984,但不会与发布合并。作为一种解决方法,将功能文件名作为标记添加到具有某种标识符的功能文件中。然后您可以使用 scenario.getSourceTagNames() 来获取所有标签。使用标识符确定带有特征文件名的标签。 【参考方案1】:

更新:

这是我对以大写字母开头的功能名称的实现,如示例中所示:

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

使用scenario.getId(),您将获得以下信息:

登录到应用程序;使用密码登录到应用程序

希望对您有所帮助!

【讨论】:

当然,这是假设您没有在功能中使用首字母缩略词。 不敢相信 Feature 的原文对 Steps Definition sn-ps 不可用。【参考方案2】:

我在 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]);
    

【讨论】:

黄瓜6是不可能的。【参考方案3】:

您可以使用 Reporter 获取当前正在运行的实例,然后从功能文件中提取我们的实际功能名称,如下所示:

    Object[] paramNames = Reporter.getCurrentTestResult().getParameters();          
    String featureName = paramNames[1].toString().replaceAll("^\"+|\"+$", "");
    System.out.println("Feature file name: " + featureName);

【讨论】:

什么是Reporter?我在 Cucumber API 中找不到这个。【参考方案4】:

如下创建一个监听器

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"

这将为您提供功能文件名!

【讨论】:

【参考方案5】:

可能是这样,它只返回文件名:

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;

【讨论】:

【参考方案6】:

Kotlin 1.5,黄瓜-java 6.10.0:

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

在我的例子中打印:

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

【讨论】:

以上是关于如何使用 Java 在运行时获取当前 Cucumber 功能文件名的主要内容,如果未能解决你的问题,请参考以下文章

在Java中获取当前进程端口

如何在运行时获取泛型的类型

Java运行时获取当前运行代码类名方法名

Azure SDK:如何在运行时获取运行我的软件的当前计算机的公共 IP 地址?

Java获取当前路径

应用程序在后台运行时如何获取当前位置