0

我正在使用出色的 TestNG-Framework 进行测试。我的问题是是否可以在 testng.xml-configuration 文件中为 @Test-annotation 设置注释?我不想像这样硬编码@Test-annotation

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

我想在 testng.xml 中配置它

4

3 回答 3

0

我对这个案子有两个想法:

解决方法 1:StaticProvider

如果需要,您可以轻松更改静态提供程序

解决方法 2:注释转换器

从未尝试过,但即使必须手动获取 XML 数据也应该可以工作

期待 Beust 先生的回答... ;)

于 2012-06-21T14:17:25.880 回答
0

简短的回答是:不,您不能从testng.xml.

正如 Frank 所解释的,您可以使用 Annotation Transformer 修改现有的注释。

于 2012-06-22T02:19:54.117 回答
0

有时,您只是真的想做某事而您做不到,例如访问私有变量以修复内存泄漏。弄清楚如何做这样的事情,尽管你不能很有趣。如果您真的想这样做,我可能会建议您尝试使用 TestNG 对象并在运行加载 testng.xml 文件之前运行您的套件。

就个人而言,我喜欢使用“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”的方法。

于 2013-10-01T18:29:04.343 回答