0

我正在使用 TestNG 的数据提供程序功能。我需要介于BeforeMethod和之间的东西BeforeClass

DataProvider调用的每个项目,BeforeMethod但我想知道何时DataProvider开始将项目发送到方法以及何时完成。

看起来这BeforeClass在链条中太高了。中间有什么东西吗?

4

4 回答 4

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 注释来找出它应该调用哪个方法。

于 2013-01-15T17:19:40.480 回答
1

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

于 2013-01-15T12:26:45.440 回答
0

请使用 IDataProviderListener 跟踪 DataProvider 方法的开始/结束。看起来 IDataProviderListener 完全符合主题启动器的需求。IDataProviderListener 有两个方法 beforeDataProviderExecution 和 afterDataProviderExecution。当 TestNg 准备执行方法时调用 beforeDataProviderExecution,并且在所有准备执行的测试之后(在任何测试开始之前)调用 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
于 2021-02-22T11:22:11.623 回答
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();
 } 
于 2016-09-13T20:33:42.660 回答