java - 如何将动态值传递给自定义注释以从 Java data.properties 进行映射
问题描述
我使用 Selenium/TestNG 实现自动化测试,并且我使用提供自定义注释的工具,该工具采用字符串。我试图从 data.properties 传递动态值,我尝试了不同的方式,但我不断收到这个错误:注释值必须是常量表达式
public class MapData {
// fetch value from data.properties and store it as string
public static final String TESTNAME = LoadProps.INSTANCE.loadProps().getProperty("TestName1");
public static final String ABC = "ABC";
}
这是我的测试样本:
@Custom(name = "login")
@Test(priority = 1)
public void login() throws InterruptedException, IOException {...}
注解
@Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
@Target(value={METHOD})
public abstract @interface Custom extends java.lang.annotation.Annotation
{
public abstract java.lang.String name();
}
我试图传递从 data.properties 读取的动态值,如下所示:
@Custom(name = MapData.TESTNAME)
但是如果您查看我的 MapData 类,我会遇到运行时错误,我有另一个字符串作为 ABC,我直接存储了一个字符串。当我使用这种传递方式时:
@Custom(name = MapData.ABC)
它很好,我没有任何错误!有什么区别?两种方式都在传递字符串。有没有办法从 data.properties 中获取数据并将其传递给注释?
解决方案
当您使用注释时,您不能为注释参数分配动态值。但是,由于它是您的自定义注释,因此在处理注释时您可以处理值。例如:
String tValue = custom.name();
String value = data.getProperty(tValue,tValue);
另一种方法是,您可以尝试使用具有元数据支持的QAF-TestNG 扩展,您可以在其中使用如下参数:
@Test(description="This is example scenario in BDD",groups={"grp1","grp2"})
@MetaData("{'env':'${target.env}','TestID':'12345'}"
public void example(){
}
在上面的例子${target.env}
中是属性,将在运行时得到解决。您可以访问元数据,如下所示:
ITestNGMethod testMethod = testResult.getMethod()
TestNGScenario scenario = (TestNGScenario) testMethod;
Map<String, Object> metadata = scenario.getMetaData();
推荐阅读
- python - 有没有办法在数据框中打印以前的日期时间值以获取条件?
- c++ - 递归搜索n叉树中的元素
- python - 如何将熊猫数据框字符串更改为整数?
- tensorboard - 日志名称的张量板侧边栏大小问题
- r - 收到此错误:没有适用于“mutate_”的方法应用于类“c('integer','numeric')”的对象
- kotlin - 在 Kotlin 中单击时如何从 recyclerview 获取行 ID 或项目位置
- c - 如何使用 Rcpp 创建依赖于共享库的 R 包?
- android - Kotlin ViewPager 空指针异常
- php - 函数 PHP 文件和 WP Enqueue 代码错误
- mapbox - 错误:无法解决:com.mapbox.navigator:mapbox-navigation-native:6.2.1?