以编程方式运行TestNG时,如何从测试类中获取@Test方法

And*_*rio 1 java testng selenium webdriver

我正在创建一个应用程序,以编程方式执行我们的java webdriver硒脚本。我们使用TestNG。

我可以使用虚拟XML文件启动类。这有效

    XmlSuite suite = new XmlSuite();
    suite.setName("TmpSuite");

    XmlTest test = new XmlTest(suite);
    test.setName("TmpTest");
    List<XmlClass> classes = new ArrayList<XmlClass>();

    Map<String, String> parameters = new HashMap<String, String>(); 
    parameters.put("browser", "Firefox"); 
    suite.setParameters(parameters);

    classes.add(new XmlClass("package.classname"));
    test.setXmlClasses(classes) ;

    List<XmlSuite> suites = new ArrayList<XmlSuite>();
    suites.add(suite);
    TestNG tng = new TestNG();
    tng.setXmlSuites(suites);
    tng.run();
Run Code Online (Sandbox Code Playgroud)

由于上述方法使用package.classname来执行该类,因此我需要一种获取所有类的方法。它们的包和类名(我们有数百个包)。

我使用此代码来抓取所有package.classnames。在简单地扫描项目的/ bin /目录中,将文件夹结构转换为程序包名称,并从类文件中删除.class扩展名。这个作品,太:

    //scans the /bin directory of project to grab all packages/classes

    String binPath = "V:\\Selenium\\Scripts\\bin\\";
    File dir = new File(binPath);

    List<File> files = (List<File>) FileUtils.listFiles(dir, TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE);

    List<String> classNames = new ArrayList<String>(300);

    for (File f : files) {
        //instead of "V:\Selenium\Scripts\bin\package\classname.class"
        //I just end up with "package.classname"
        classNames.add(extractClassNameFromPath(f.getPath()));
    }
Run Code Online (Sandbox Code Playgroud)

因此,在这一点上,我可以获得所有类名的String列表,并且可以将其中的任何一个放入classes.add(new XmlClass("package.classname"));行中,从而允许以编程方式运行任何测试类。大!

综上所述,这就是我现在面临的问题:类具有不同的@Test方法。通过仅启动类,将执行所有@Test方法。我希望能够提取该类中的可用@Test方法并将其呈现给用户,以便他们可以选择所需的方法。

我不知道如何从我们的测试类中提取@Test方法。

juh*_*err 5

您可以使用反射库及其MethodAnnotationsScanner:

Reflections reflections = new Reflections("my.package");
Set<Method> resources =
    reflections.getMethodsAnnotatedWith(org.testng.Test.class);
Run Code Online (Sandbox Code Playgroud)