【问题标题】:TestNG @AfterMethod with DataProviderTestNG @AfterMethod 与 DataProvider
【发布时间】:2014-04-01 22:41:17
【问题描述】:

我在玩TestNG,发现@AfterMethod 和@BeforeMethod 在我使用dataProvider 时被多次调用。是否可以在使用从 dataProvider 传递的所有参数执行 @Test 后仅调用一次方法。就像我们可以在 dataProvider 调用 5 次 'testPrimeNumberChecker' 之后只调用一次 '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));    
    }    
}

【问题讨论】:

    标签: java unit-testing testing testng


    【解决方案1】:

    一种方法是使用@BeforeGroups 和@AfterGroups。将您的测试归为一组,然后使用 Before/After 组注释为测试进行一次设置/拆卸。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        其中一种变通方法是使用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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-11-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-14
          • 2011-05-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多