首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TestNG @AfterMethod与DataProvider

TestNG @AfterMethod与DataProvider
EN

Stack Overflow用户
提问于 2014-04-01 22:41:17
回答 3查看 2.7K关注 0票数 4

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

代码语言:javascript
复制
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));    
    }    
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-04-04 09:40:21

一种方法是使用“BeforeGroups”和“AfterGroups”。让您的测试落在一个组中,然后使用“前/后组”注释为测试做一次安装/解压。

票数 1
EN

Stack Overflow用户

发布于 2014-04-02 09:47:12

我想提出一个懒惰的想法:您可以使用TestListener扩展类,并将tearDown方法放入该类的特定方法(即tearDownListener)中。

在onTestFailure和onTestSuccess中,您可以增加计数器。

当TestListener拦截最后一次测试时,您可以执行tearDownListener。

问候

票数 1
EN

Stack Overflow用户

发布于 2020-08-25 15:30:39

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

代码语言:javascript
复制
    @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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22798309

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档