我正在使用 TestNG 的数据提供程序功能。我需要介于BeforeMethod
和之间的东西BeforeClass
。
DataProvider
调用的每个项目,BeforeMethod
但我想知道何时DataProvider
开始将项目发送到方法以及何时完成。
看起来这BeforeClass
在链条中太高了。中间有什么东西吗?
我正在使用 TestNG 的数据提供程序功能。我需要介于BeforeMethod
和之间的东西BeforeClass
。
DataProvider
调用的每个项目,BeforeMethod
但我想知道何时DataProvider
开始将项目发送到方法以及何时完成。
看起来这BeforeClass
在链条中太高了。中间有什么东西吗?
没有这样的钩子,但您可以通过创建“假”数据提供者来轻松插入自己的钩子,这些提供者会在调用真正的数据提供者之前调用您的钩子。
@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 注释来找出它应该调用哪个方法。
AFAIK,没有这样的钩子。我能想到的解决方法是,如果数据中传递了一些东西,告诉我我是第一个,我是最后一个,基于它你可以开始和结束你的过程..或者保存数据数组的大小,递增计数每个方法运行(在 beforemethod 中),检查 beforemethods 中的第一个和最后一个计数(与之前保存的大小相比)并执行所需的任务。
请使用 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
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();
}