2015-08-14 88 views
0

我正在創建一個應用程序以編程方式執行我們的java webdriver硒腳本。我們使用TestNG。如何從測試類獲得@Test方法,當以編程方式運行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(); 

由於上述方法使用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())); 
    } 
在這一點上

所以,我能得到我的所有類名的字符串列表,我可以把任何人進入classes.add(new XmlClass("package.classname"));線,讓我運行任何我們的測試課程的編程。大!

綜上所述,這裏是我現在面臨的問題: 這些類有不同的@Test方法。通過啓動該類,將執行所有的@Test方法。我希望能夠在該類中提取可用的@Test方法,並將它們呈現給用戶,以便他們可以選擇他們想要的。

我不知道如何從我們的測試類中提取@Test方法。

+0

您需要Java反射:http://tutorials.jenkov.com/java-reflection/祝你好運! – SiKing

回答

4

您可以使用reflections library及其MethodAnnotationsScanner:

Reflections reflections = new Reflections("my.package"); 
Set<Method> resources = 
    reflections.getMethodsAnnotatedWith(org.testng.Test.class); 
+0

謝謝,有沒有辦法從一個班級獲得@test方法? (而不是整個包) – Andrio

+1

是的,以'Class'作爲參數。請參閱[javadoc](http://static.javadoc.io/org.reflections/reflections/0.9.10/org/reflections/Reflections.html#Reflections-java.lang.Object...-)。 – juherr

+0

我嘗試了一個「package.name」和一個'class',但它似乎沒有返回任何東西。無論我嘗試getMethods getMethodsAnnotatedWith(org.testng.annotations.Test.class)還是隻使用getMethodsReturn(String.class)(就像測試一樣,我仍然只想註釋方法),結果總是一個空集。 (這可能不相關,但是我添加了'javaassist'庫之前得到了'NoClassDefFoundError'錯誤)。 – Andrio

相關問題