TestNG @AfterMethod with DataProvider

时间:2014-04-01 22:41:18

标签: java unit-testing testing testng

我正在玩TestNG并发现@AfterMethod&当我使用dataProvider时,@ BeforeMethod被多次调用。在使用从dataProvider传递的所有参数执行@Test之后,是否可以仅调用一次方法。就像我们可以在dataProvider调用'testPrimeNumberChecker'5次后调用'tearDown'方法一样。

import org.testng.Assert;    
import org.testng.annotations.BeforeMethod;    
import org.testng.annotations.DataProvider;    
import org.testng.annotations.Test;    

public class ParamTestWithDataProvider1 {    
    private PrimeNumberChecker primeNumberChecker;    
    private static final Logger logger = Logger.getLogger(ParamTestWithDataProvider1.class);    

    @BeforeMethod    
    public void initialize() {    
        logger.info("Before Method Fired !! - " );    
        primeNumberChecker = new PrimeNumberChecker();    
    }    

    @@AfterMethod    
    public void tearDown() {    
        logger.info("After Method Fired !!  " );      
    }    

    @DataProvider(name = "test1")    
    public static Object[][] primeNumbers() {    
        return new Object[][] { { 2, true }, { 6, false }, { 19, true },    
            { 22, false }, { 23, true } };    
    }    

    @Test(dataProvider = "test1")    
    public void testPrimeNumberChecker(Integer inputNumber,    
        Boolean expectedResult) {    
    logger.info(inputNumber + " " + expectedResult);    
    Assert.assertEquals(expectedResult,    
            primeNumberChecker.validate(inputNumber));    
    }    
}

3 个答案:

答案 0 :(得分:1)

我想给你一个懒惰的想法: 您可以使用TestListener扩展类并将tearDown方法放入此类的特定方法(即tearDownListener)。
在onTestFailure和onTestSuccess中,您可以增加一个计数器 当TestListener拦截上一次测试时,您可以执行tearDownListener 此致

答案 1 :(得分:1)

一种方法是使用@BeforeGroups和@AfterGroups。让测试属于一个组,然后使用Before / After组注释对测试进行一次设置/拆卸。

答案 2 :(得分:0)

一种解决方法是使用ITestNGMethod#hasMoreInvocation检查它是否是最后一个方法调用。

    @AfterMethod(alwaysRun = true)
    public void afterMethod(ITestResult testResult) {
        if (!testResult.getMethod().hasMoreInvocation()) {
            // This will be executed once, after a test method has been invoked for all parameters sequences defined in the corresponding @DataProvider
        }
    }

如果您希望即使在失败的情况下也要执行该方法,请确保添加alwaysRun = true