2012-06-21 53 views
0

我正在用美妙的TestNG框架進行測試。我的問題是,是否可以在testng.xml配置文件中爲@ Test-annotation設置註釋? 我不想硬編碼@測試的註釋像是否可以通過testng.xml在TestNG中設置註釋?

@Test(dataProvider = "dataFileProvider", dataProviderClass = TestDataProvider.class) 

我想配置它在testng.xml文件

回答

0

我已經在這種情況下,有兩個思路:

Workaraound 1::StaticProvider

如果需要

Workaraound 2,您可以輕鬆地改變靜態提供商210

從未嘗試過這一點,但即使必須抓住XML的數據手動

期待博伊斯特先生的回答應該工作...;)

0

簡短的回答是:不,你可以不要從testng.xml向您的代碼添加註釋。

如Frank所解釋的,您可以使用Annotation Transformer修改現有的註釋。

0

有時,你只是真的想做點什麼,而不能像訪問私有變量來修復內存泄漏一樣。搞清楚如何做這樣的事情,儘管事實上你不能很有趣。如果你真的想要的話,我可能會建議在運行加載testng.xml文件之前使用TestNG對象來運行你的套件。個人而言,我喜歡使用'mvn test',不幸的是,添加pom.xml代碼以從testng xml文件運行將需要您提供testng.xml文件,因此'mvn test'將不起作用。始終確保95%的程序員使用工作,然後允許重寫。

因此,我可能會建議您自己擴展testng.xml文件,並編寫一些代碼來讀取testng.xml文件並使用註釋轉換器類配置註釋。

下面是一些代碼,讓你開始:

public class TestNGSuite { 
public static void main(String[] args) { 
    System.out.println("main start"); 
    try { 
     new TestNGSuite(new Class[]{ Demo.class }); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    System.out.println("main finish"); 
} 

public TestNGSuite(Class[] classes) throws Exception { 
    // Create Suite List 
    List<XmlSuite> suites = new ArrayList<XmlSuite>(); 

    // Add Suite to Suite List 
    XmlSuite suite = new XmlSuite(); 
    suites.add(suite); 
    suite.setName("MyTestSuite"); 

    // Add Test to Suite 
    XmlTest test = new XmlTest(suite); 
    test.setName("MyTest"); 

    // Add Class List to Test 
    List<XmlClass> xmlClasses = new ArrayList<XmlClass>(); 
    test.setXmlClasses(xmlClasses); 

    // Add Class to Class List 
    for(Class clazz: classes) { 
     XmlClass xmlClass = new XmlClass(clazz); 
     xmlClasses.add(xmlClass); 
    } 

    // Run TestNG 
    TestNG testNG = new TestNG(); 
    testNG.setXmlSuites(suites); 
    testNG.addListener(new TestNGAnnotationTransformer(methodName)); 
    testNG.addListener(new TestNGSuiteConsoleLogger()); 
    testNG.run(); 

    if(testNG.hasFailure()) { // Throw an exception to make mvn goal fail 
     throw new Exception("Failed Tests"); 
    } 
} 

public static class TestNGSuiteConsoleLogger extends TestListenerAdapter{ 
     @Override 
     public void onTestFailure(ITestResult tr) { 
     Console.log(TestNGSuiteConsoleLogger.class, "FAILURE:"+tr.getMethod()); 
     tr.getThrowable().printStackTrace(); 
     } 
} 

public static class TestNGAnnotationTransformer implements IAnnotationTransformer{ 
     String methodToRun; 
     public TestNGAnnotationTransformer(String methodName) { 
       methodToRun = methodName; 
     } 
    public void transform(ITestAnnotation annotation, Class arg1, 
      Constructor arg2, Method testMethod) { 
      if (methodToRun.equals(testMethod.getName())) { 
      annotation.setEnabled(true); 
      } 
     } 
} 
} 

如果你想運行Demo.class,確保有一個與TestNG的註解「@Test」有一個方法。

相關問題