Java 8及旧依赖下,如何通过DriverFactory或Runner获取当前Feature文件名?
在Java 8旧Cucumber依赖下动态获取Feature文件名/标签的方法
针对旧版Cucumber依赖(适配Java 8),可以通过以下几种方案实现运行时动态获取当前Feature文件名或标签的需求:
方案1:通过Cucumber Hook + Scenario对象直接获取
如果你的Cucumber版本为v4.x及以上(适配Java 8),可以在@Before钩子中注入Scenario对象,直接获取Feature相关信息:
import cucumber.api.Scenario; import cucumber.api.java.Before; import java.net.URI; public class StepHooks { @Before public void beforeScenario(Scenario scenario) { // 获取Feature文件的URI并解析文件名 URI featureUri = scenario.getUri(); if (featureUri != null) { String featureFileName = featureUri.getPath().substring(featureUri.getPath().lastIndexOf("/") + 1); System.out.println("当前运行的Feature文件名:" + featureFileName); } // 获取当前Scenario关联的所有标签 System.out.println("当前Scenario标签:" + scenario.getSourceTagNames()); } }
方案2:针对更旧版本(v2.x及以下)的反射兼容方案
如果你的Cucumber版本过旧,Scenario对象没有getUri()方法,可以通过反射读取内部属性来获取信息:
import cucumber.api.Scenario; import cucumber.api.java.Before; import java.lang.reflect.Field; import java.net.URI; public class StepHooks { @Before public void beforeScenario(Scenario scenario) { try { // 反射获取Scenario内部的feature对象 Field featureField = scenario.getClass().getDeclaredField("feature"); featureField.setAccessible(true); Object feature = featureField.get(scenario); // 读取Feature的URI并解析文件名 Field uriField = feature.getClass().getDeclaredField("uri"); uriField.setAccessible(true); URI featureUri = (URI) uriField.get(feature); String featureFileName = featureUri.getPath().substring(featureUri.getPath().lastIndexOf("/") + 1); System.out.println("当前Feature文件名:" + featureFileName); // 读取Feature的标签 Field tagsField = feature.getClass().getDeclaredField("tags"); tagsField.setAccessible(true); Iterable<String> featureTags = (Iterable<String>) tagsField.get(feature); System.out.println("当前Feature标签:" + featureTags); } catch (Exception e) { e.printStackTrace(); } } }
方案3:在DriverFactory中获取Feature信息
如果需要在DriverFactory类中使用这些信息,可以通过ThreadLocal在钩子和DriverFactory之间传递数据:
1. 定义全局上下文类存储信息
public class TestContext { private static ThreadLocal<String> currentFeatureFileName = new ThreadLocal<>(); private static ThreadLocal<Iterable<String>> currentFeatureTags = new ThreadLocal<>(); public static void setCurrentFeatureFileName(String name) { currentFeatureFileName.set(name); } public static String getCurrentFeatureFileName() { return currentFeatureFileName.get(); } public static void setCurrentFeatureTags(Iterable<String> tags) { currentFeatureTags.set(tags); } public static Iterable<String> getCurrentFeatureTags() { return currentFeatureTags.get(); } public static void clear() { currentFeatureFileName.remove(); currentFeatureTags.remove(); } }
2. 在钩子中设置信息
import cucumber.api.Scenario; import cucumber.api.java.Before; import cucumber.api.java.After; import java.net.URI; public class StepHooks { @Before public void beforeScenario(Scenario scenario) { URI featureUri = scenario.getUri(); if (featureUri != null) { String fileName = featureUri.getPath().substring(featureUri.getPath().lastIndexOf("/") + 1); TestContext.setCurrentFeatureFileName(fileName); } TestContext.setCurrentFeatureTags(scenario.getSourceTagNames()); } @After public void afterScenario() { TestContext.clear(); } }
3. 在DriverFactory中读取信息
public class DriverFactory { public void initDriver() { String currentFeature = TestContext.getCurrentFeatureFileName(); Iterable<String> featureTags = TestContext.getCurrentFeatureTags(); // 在这里根据Feature文件名或标签做自定义逻辑 System.out.println("Driver初始化时,当前运行的Feature:" + currentFeature); } }
内容的提问来源于stack exchange,提问作者Krittika Agrawal
相关产品推荐
相关产品推荐

