TestNG:如何知道DataProvider何时开始和结束以调用方法

时间:2013-01-15 09:27:11

标签: testng

我正在使用TestNG的数据提供程序功能。 我需要BeforeMethodBeforeClass之间的内容。

DataProvider的每个项目调用BeforeMethod,但我想知道DataProvider何时开始向项目发送项目以及何时完成此操作。

看起来链中的BeforeClass太高了。 介于两者之间吗?

4 个答案:

答案 0 :(得分:2)

没有这样的钩子,但你可以通过在调用真实数据提供者之前创建调用钩子的“假”数据提供者来轻松插入自己的钩子。

@DataProvider
public Object[][] fakeDp() {
    // invoke before data provider method
    result = invokeRealDataProvider();
    // invoke after data provider method
    return result
}

@Test(dataProvider = "fakeDp") { ... }

至于实现,你可以创建自己的@BeforeDataProvider注释,并在你的fakeDp()中自己查看,并在你的测试方法中指定:

@RealDataProvider(dataProvider = "realDp")
@Test(dataProvider = "fakeDp") { ... }

然后你的fakeDp()只需要查找@RealDataProvider注释,找出它应该调用哪个方法。

答案 1 :(得分:1)

AFAIK,没有这样的钩子。我能想到的解决方法是,如果在数据中传递了一些东西,告诉我是第一个,我是最后一个基于你可以开始和结束你的过程。或者保存数据数组的大小,增量依靠每个方法运行(在beforemethod中),检查before方法中的第一个和最后一个计数(与先前保存的大小比较)并执行所需的任务。

答案 2 :(得分:0)

BeforeClass似乎是你最好的选择。如果要在组中调用测试,可以缩小BeforeClass的范围。

 @BeforeClass(groups = "dataProvider")
 public void dataProviderBeforeMethod() {
   //do something
 }
 @Test(groups = "dataProvider", dataProvider = "dataProviderClass", threadPoolSize = 10)
 public void testWithdataProvider(){
   //test something
 }
 @DataProvider(name = "dataProviderClass", parallel = true)
 private Iterator<Object[]> dataProviderClass() {
   List<Object[]> myData = new ArrayList<>();
     //setup data
   return myData.iterator();
 } 

答案 3 :(得分:0)

请使用 IDataProviderListener 来跟踪 DataProvider 方法的开始/结束。 看起来 IDataProviderListener 正是主题启动器所需要的。 IDataProviderListener 有两个方法 beforeDataProviderExecution 和 afterDataProviderExecution。 beforeDataProviderExecution 在 TestNg 准备执行方法时调用, afterDataProviderExecution 在所有测试准备执行后(在任何测试开始之前)调用。 示例:

import org.testng.annotations.DataProvider;
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;

@Listeners(CustomDataProviderListener.class)
public class demo {

    @DataProvider
    public Object[] integerDataProvider() {
        return new Integer[]{1, 2};
    }

    @Test(dataProvider = "integerDataProvider")
    public void test1(Integer value) {
        System.out.println(value);
    }
}

import org.testng.IDataProviderListener;
import org.testng.IDataProviderMethod;
import org.testng.ITestContext;
import org.testng.ITestNGMethod;

public class CustomDataProviderListener implements IDataProviderListener {
    @Override
    public void beforeDataProviderExecution(IDataProviderMethod iDataProviderMethod, ITestNGMethod iTestNGMethod, ITestContext iTestContext) {
        System.out.println("CustomDataProviderListener -> beforeDataProviderExecution");
    }

    @Override
    public void afterDataProviderExecution(IDataProviderMethod iDataProviderMethod, ITestNGMethod iTestNGMethod, ITestContext iTestContext) {
        System.out.println("CustomDataProviderListener -> afterDataProviderExecution");
    }
}


output:
CustomDataProviderListener -> beforeDataProviderExecution 
CustomDataProviderListener -> afterDataProviderExecution 

1
2