我正在使用TestNG的数据提供程序功能。
我需要BeforeMethod
和BeforeClass
之间的内容。
DataProvider
的每个项目调用BeforeMethod
,但我想知道DataProvider
何时开始向项目发送项目以及何时完成此操作。
看起来链中的BeforeClass
太高了。
介于两者之间吗?
答案 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