首页 > 解决方案 > 使用注解转换器禁用 @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而不是整个班级?

标签: javaseleniumannotationstestng

解决方案


使用注释转换器无法实现注释中的要求。这是因为变压器在任何测试运行之前运行。这样做是为了在测试执行开始之前完成注释。

该字段m_enabled用于确定测试方法是否可以运行。即使您可以在测试执行期间将 更改m_enabledfalse中途,它也无济于事,因为测试执行已经达到了要运行的测试已经完成并且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.xmlas中指定。<listeners><suite>

<suite>
    ................
    ................
    <listeners>
        <listener class-name = "com.code.MyTransformer"></listener>
    </listeners>    
    ................
    ................
</suite>


推荐阅读