当前位置: 首页 > 知识库问答 >
问题:

如何使用TestNG JAVA Reflection设置测试方法执行的优先级

终祯
2023-03-14

我试图在反射的帮助下执行我的测试脚本,反射注释为@test,如下所示:

Class<?> className = Class.forName(format);  //Load the class name at runtime

                Constructor<?> customConstructor = className.getConstructor(WebDriver.class);   //Create customized constructor and initalize driver from testbase


Method[] method = className.getMethods();  //Call the list of methods in current class file

                for (Method me : method) {
                    if (me.getName().startsWith("test")) {   //Check wheather the class prefix as test

                        Method getMethods = Class.forName(format).getDeclaredMethod(me.getName());   //Loading all the methods at runtime.
                        if(getMethods.isAnnotationPresent(Test.class))
                        {
//The method which is annotated @Test will execute here, using invoke() method of reflection.
}
}

但是,问题是无法按照优先级值运行@测试方法。它是随机执行的。谁能告诉我如何根据优先级值运行@测试方法吗。

此外,我也尝试了dependsOnMethods。但它仍然是随机执行的。

示例代码:

package com.test.build;

import com.test.build.ClassA;
import com.test.build.ClassB;

import java.lang.reflect.*;
import java.util.Scanner;

import org.testng.annotations.Test;

public class ParentClass {

    @Test
    public void executeTestMetods() throws Exception {
        Scanner scan = new Scanner(System.in);
        System.out.println("Type package name");
        String name = scan.next();
        Class<?> class1 = Class.forName(name);
        Method[] method = class1.getMethods();

        for (Method me : method) {
            if (me.isAnnotationPresent(Test.class)) {
                if (me.getName().startsWith("test")) {
                    System.out.println(me.getName());
                }
            }
        }
        scan.close();
    }
}

A类

package com.test.build;

import org.testng.annotations.Test; 

@Test(singleThreaded  = true)
public class ClassA {

    @Test(priority=0)
    public void test1()
    {
        System.out.println("class A");
    }

    @Test(priority=1)
    public void test2()
    {
        System.out.println("Class A second method");
    }

    @Test(priority=2)

    public void test3()
    {
        System.out.println("class A");
    }

    @Test(priority=3)
    public void test4()
    {
        System.out.println("Class A second method");
    }

    @Test(priority=4)

    public void test5()
    {
        System.out.println("class A");
    }

    @Test(priority=5)
    public void test6()
    {
        System.out.println("Class A second method");
    }

}

输出:

键入包名称com。测验建筑ClassA测试3测试4测试5测试6测试1测试2通过:executeTestMetods

=============================================默认测试

输出未按优先级正确执行,并显示随机调用。如何使其顺序执行?

共有1个答案

申屠黎昕
2023-03-14

TestNG为收件箱提供了一个专门的功能来做你想做的事情:注释转换器。

 类似资料:
  • 本文向大家介绍如何在TestNG中为测试用例设置优先级?,包括了如何在TestNG中为测试用例设置优先级?的使用技巧和注意事项,需要的朋友参考一下 通过为每种测试方法赋予优先级,我们可以按其执行顺序设置优先级。先运行优先级较低的测试方法,然后再执行优先级较高的测试方法。 示例 在Java类文件中,将首先运行,然后运行。

  • 本文向大家介绍如何在Cucumber中设置测试方法的执行顺序?,包括了如何在Cucumber中设置测试方法的执行顺序?的使用技巧和注意事项,需要的朋友参考一下 我们可以通过order关键字来设置Cucumber中测试方法的执行顺序。在步骤定义文件中按顺序分配了测试方法。 顺序较低的测试方法首先执行,然后顺序较高的测试方法。 示例 步骤定义文件。 具有较低顺序的测试方法(login()设置为1)将首

  • 我有两个SQS队列:一个用于低优先级,另一个用于高优先级消息。逻辑是不要接触低优先级队列上的消息,除非高优先级队列为空。 现在,我将这两条路由设置为同时使用队列中的消息。我想要的是,一个消息进入高优先级路由触发低优先级路由的停止。为了尝试获得此功能,我尝试使用一种路由策略,当在高优先级路由上启动新交换时,该策略将停止低优先级队列: (来自的片段) 然而,我不确定如何重新启动低优先级的消费者。骆驼提

  • 问题内容: 我按以下顺序设置了线程的优先级 先是A然后是B,然后是C。但是当我在下面的程序中运行时,有时B在A之前运行。我不理解这种执行方式,因为我将B的优先级设置为小于A的优先级。 } 问题答案: 线程优先级可能不是您认为的那样。 线程的优先级是对操作系统的建议,在涉及这两个线程的任何调度或CPU分配决策点中,一个线程优先于另一个线程。但是,如何实现这一点取决于操作系统和JVM的实现。 Java

  • 当我运行testing.xml时,testNG适合于它的运行,但当运行gradle测试任务时,它不执行测试 buildscript{ext{springBootVersion='1.4.1.release'}存储库{mavenCentral()}依赖项{classpath(“org.springframework.boot:spring-boot-gradle-plugin:${springBoo