2016-02-26 64 views
0

我在我的项目中有一对测试,我想在不同的方法中按顺序运行。通常我会用一个DataProvider中生成输入测试:TestNG测试可以作为DataProviders吗?

@DataProvider 
public Object[][] getUsers() { 
    // generate input for test2(); 
} 

@Test(dataProvider = "getUsers") 
public void test2(User user) { 
    assertSomething(user); 
} 

但在这里,我需要这两种方法要像测试,因为我有测试逻辑,这不属于数据提供者。

所以我想是这样的:

@Test 
public Object test1() { 
    User user = createUser(); 
    assertSomething(user); 

    return user.getProperty(); 
} 

@Test // depends on test1 - I do not want to execute this test if test1 fails. 
public void test2(Object userProperty) { 
    assertSomethingElse(userProperty); 
} 

我其实可以把逻辑从TEST1到TEST2达到我想要什么,但我想知道是否有更聪明的方式来做到这一点。

+0

我认为有一个返回值的测试方法不是一个很好的设计。也许你想看看嘲笑(例如http://mockito.org/)? – LiMuBei

+0

我认为这可能不是最理想的。这些是黑盒测试,与代码非常隔离。我在test1()中发生了复杂的事件,但我只需要在test2()中声明其中一个事件的状态。在被测系统中发生一切都很困难,但这里的耦合看起来很自然,因为除了test1()和test2()之外没有别的东西来改变对象的状态(如果存在的话,它是一个缺陷),如果test1()通过,我只需要执行test2()。 –

+1

似乎有一个名为'dependsOnMethods'的测试注释中有一个选项可以做你想做的事情,参见http://www.tutorialspoint.com/testng/testng_dependency_test.htm – LiMuBei

回答

1

是的,有一种方法。像这样的东西就是我想要的。与JUnit,TestNG的可以让你的测试方法运行和访问参数的测试方法之前钩,几分像你可以用AOP做:

@DataProvider 
public Object[][] getUsers() { 
    int[][] multi = new int[][]{ 
     { 0, new User("Tom") }, 
     { 0, new User("Sally") } 
    }; 
    return multi; 
} 

@BeforeMethod 
public void setupBeforeEachTest(Object[] args) { 
    User x = (User)args[1]; 
    x.modify(); 
} 

@Test(dataProvider = "getUsers") 
public void test1(User user) { 
    assertSomething(user); 
} 

@Test(dataProvider = "getUsers") 
public void test2(User user) { 
    assertSomethingElse(user); 
} 
0

你所要求的是一个有状态的测试类,它不是TestNG具有任何特定支持(例如将数据从一个测试传递到另一个测试)的事情。因此,您需要自己追踪事物的状态。

如果你不担心并行那么类成员场正常工作:

private User user; 

@Test 
public void test1() { 
    user = createUser(); 
    assertSomething(user); 
} 

@Test(dependsOnMethods = "test1") 
public void test2() { 
    assertSomethingElse(user.getProperty()); 
} 

如果你希望能够并行运行测试类的多个实例,那么你就需要使用像ThreadLocal<T>

private static final ThreadLocal<User> USERS = new InheritableThreadLocal<>(); 

@Test 
public void test1() { 
    USERS.set(createUser()); 
    assertSomething(user); 
} 

@Test(dependsOnMethods = "test1") 
public void test2() { 
    assertSomethingElse(USERS.get().getProperty()); 
} 
0

这里,将工作无论无论您运行其他的解决方案并行.The dependsOnMethods参数套房将确保test2的运行试验后1 passes.The想法是实现工厂:

您的测试方法会是这个样子:

@Test 
public void test1(ITestContext context) { 
    User objUser = Factory.getUser(context.getName()); 
    assertSomething(objUser); 
} 

@Test(dependsOnMethods = "test1") 
public void test2(ITestContext context) { assertSomethingElse(Factory.getUser(context.getName()).getProperty()); 
} 

工厂类将是什么如:

public class Factory 
{ 
static Map<testName,User> mainMap; 

//This method returns User object to a test based on the test name. 
public static User getUser(String testName) 
{ 
if (mainMap == null) 
{ 
    mainMap = new HashTable<testName,User>(); 
    mainMap.put(testName,new User()); 
} 
if(!mainMap.contains(testName)) 
{ 
    mainMap.put(testName,new User()); 
} 

return mainMap.get(testName); 
} 
} 

有关使用出厂参考以下方法/线程之间共享对象背后的理论更多的信息: http://singinginthesunlight.blogspot.in/2016/02/testng-parallelism-kiss-of-death-or.html