java - 使用注解转换器禁用 @Test
问题描述
我有两个类:page1 和 page2。从 page2 我想调用一个在 page1 中运行的变量,该变量将被随机选择为“内部”或“外部”,并从中确定是否在我的 page2 类中执行一些 @test 方法。我不想要任何skipExceptions。
我想要下面这样的东西。如果位置等于“外部”,则预计该页面不会显示某些功能。在其中,我不想运行那些缺少功能的测试用例。
if(page1.location.equals("External")){
annotation.setEnabled(false);
}
我按照此处解释的示例进行操作:How to disable TestNG test based on a condition,但我仍然不太理解。我如何将它应用于特定的@Test
而不是整个班级?
解决方案
使用注释转换器无法实现注释中的要求。这是因为变压器在任何测试运行之前运行。这样做是为了在测试执行开始之前完成注释。
该字段m_enabled
用于确定测试方法是否可以运行。即使您可以在测试执行期间将 更改m_enabled
为false
中途,它也无济于事,因为测试执行已经达到了要运行的测试已经完成并且m_enabled
之后不再检查的点。
因此,对于此要求,使用不同测试的结果禁用测试方法以使禁用的测试不会出现在测试报告中是不可能的。但是,根据您的评论“如果我生成一个介于 1 或 2 之间的随机数怎么办。如果为 1,则执行测试路径 A。如果为 2,则执行测试路径 B”,在这种情况下,您可以使用转换器来启用/禁用某些方法,因为此逻辑独立于任何测试结果。为此,您可以按如下方式定义变压器:
public class MyTransformer implements IAnnotationTransformer {
private final List<String> pathOneMethods = List.of("testA","testB");
private final List<String> pathTwoMethods = List.of("testB","testC");
private final Random r = new Random(); //java.util
private final List<String> selectedPath;
public MyTransformer() {
selectedPath = (r.nextBoolean()) ? pathOneMethods : pathTwoMethods;
}
@Override
public void transform(ITestAnnotation annotation, Class testClass, Constructor testConstructor, Method testMethod) {
if(testMethod != null && !selectedPath.contains(testMethod.getName())) {
annotation.setEnabled(false);
}
}
}
注释转换器不能包含@Listeners
在代码中。它必须在标签内的testng.xml
as中指定。<listeners>
<suite>
<suite>
................
................
<listeners>
<listener class-name = "com.code.MyTransformer"></listener>
</listeners>
................
................
</suite>
推荐阅读
- powerquery - 如何修复基于条件拆分文本列的 Power 查询代码错误
- php - 如何使用从 mysql db 生成的 fpdf 在 pdf 表中进行换行
- amazon-web-services - 如果我从具有角色的 ec2 实例调用 api gateway apis,AWS 可以自动处理 IAM 授权吗?
- javascript - 如何检查是否创建了 jcrop 小部件(裁剪区域)?
- wpf - 瓦片组头模板的一些问题 - 获取组头的值,编辑时自动更改组头
- algorithm - 如果我们提供基于规则的标签来训练神经网络,会发生什么?
- javascript - 解析云代码,访问对象关系
- c# - c#中带有body参数和文件的Http客户端Post
- javascript - 将额外变量传递给回调函数
- r - ggplot 中 stat_summary_bin 值中的人口相等