2010-04-30 57 views
5

我正在使用TestNG在Java中运行基于Selenium的测试。我有一堆重复的测试。通常,除了测试名称和一个参数以外,它们都是相同的。如何在TestNG中使用不同名称生成测试?

我想自动生成它。我正在考虑使用工厂。有没有办法用不同的名字生成测试?最好的办法是什么?

至于现在我有类似下面,我想创建10次测试,如LinkOfInterestIsActiveAfterClick

@Test(dependsOnGroups="loggedin") 
public class SmokeTest extends BrowserStartingStoping{ 

public void LinkOfInterestIsActiveAfterClick(){ 
     String link = "link_of_interest"; 
     browser.click("*",link); 
     Assert.assertTrue(browser.isLinkActive(link)); 
    } 

} 
  • 我的XML套件是自动生成的Java代码。
  • 测试名称对于记录哪个链接处于活动状态至关重要,哪些不是。
+0

[名称为动态生成的TestNG进行在Eclipse插件(可能重复http://stackoverflow.com/questions/12257387/names-for-dynamically- generated-testng-tests-in-eclipse-plugin) – Nathan 2015-09-02 00:59:24

回答

2

所以我连接Factory与DataProvider并使用上下文的属性。

@DataProvider(name = "DP1") 
public Object[][] createData() { 
    Object[][] retObjArr={ 
    {"Link1","link_to_page"}, 
    {"Link2","link_to_page"}, 
    return retObjArr; 
} 

@Test (dataProvider = "DP1") 
public void isActive(String name, String link){ 
    this.context.setAttribute("name", name); 
    browser.click(link); 
    Assert.assertTrue(browser.isLinkActive(link)); 
} 

并且在监听

public class MyListener extends TestListenerAdapter{ 
    @Override 
    public void onTestSuccess(ITestResult tr){ 
    log("+",tr); 
    } 
    //and similar 

    private void log(String string, ITestResult tr){ 
    List<ITestContext> k = this.getTestContexts(); 
    String testName = tr.getTestClass().getName();  
    for (ITestContext i: k) 
    { 
     if (i.getAttribute("name") != null) 
     logger.info(testName+"."+i.getAttribute("name")); 
    } 
    } 

} 
+0

你可以在这里展示你如何使用Factory类吗? – djangofan 2014-07-30 15:09:02

+0

@djangofan对不起,但我没有代码了。 (4年前回答) – 2014-07-30 15:42:24

+0

好吧,我可以告诉你,你在这里发布的答案并不实际。现在,如果你真的显示了一个工厂生成单独的类,那么我相信它会工作。在从DataProvider生成的测试中设置测试名称不起作用,因为类实例在类的多个参数化调用之间共享测试名称。 – djangofan 2014-07-30 18:26:57

8

让您的测试课程实施org.testng.ITest并覆盖getTestName()以返回您想要的名称。

相关问题