2014-04-01 80 views
4

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

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));  
    }  
} 

回答

1

一种方法可以是使用@BeforeGroups和@AfterGroups。让你的测试落在一个组中,然后使用Before/After组注释为测试做一次setup/teardown。

1

我想建议你懒惰的想法: 可以使用TestListener扩展分类,把拆卸方法到这个类(即tearDownListener)的具体方法。
在onTestFailure和onTestSuccess中,您可以增加一个计数器。
当TestListener拦截上次测试时,您可以执行tearDownListener。
Regards