Java TestNG@Factory Priority
有没有办法给Java TestNG@Factory Priority,java,automated-tests,testng,Java,Automated Tests,Testng,有没有办法给@Factory方法设置优先级?我尝试了@AfterMethod、@AfterTest和@AfterClass,所有这些都会导致我的工厂方法在安装调用后立即运行,并带有@BeforeClass标记 我的代码与此类似: @BeforeClass public void setup() { } @Test() public void method1() throws Exception { } @Test(dependsOn
@Factory
方法设置优先级?我尝试了@AfterMethod
、@AfterTest
和@AfterClass
,所有这些都会导致我的工厂方法在安装调用后立即运行,并带有@BeforeClass
标记
我的代码与此类似:
@BeforeClass
public void setup() {
}
@Test()
public void method1() throws Exception {
}
@Test(dependsOnMethods = "method1")
public void method2() {
}
@Test(dependsOnMethods = "method2")
public void method3() throws Exception {
}
@Test(dependsOnMethods = "method3")
public void method4() throws Exception {
}
@Test(dependsOnMethods = "method4")
public void method5() throws Exception {
}
@AfterClass
@Factory
public Object[] factory() {
Object[] values = new Object[10];
for (int i = 0; i < values.length; i++) {
values[i] = new validationFactory(map.get(i).x, map.get(i).y);
}
return values;
}
@BeforeClass
公共作废设置(){
}
@测试()
public void method1()引发异常{
}
@测试(dependsOnMethods=“method1”)
公开作废方法2(){
}
@测试(dependsOnMethods=“method2”)
public void method3()引发异常{
}
@测试(dependsOnMethods=“method3”)
public void method4()引发异常{
}
@测试(dependsOnMethods=“method4”)
public void method5()引发异常{
}
@下课
@工厂
公共对象[]工厂(){
对象[]值=新对象[10];
对于(int i=0;i
代码所做的是接触API,检索任何请求的数据,将该数据切片成一个
映射
,然后将该数据映射传递到工厂方法以验证它。问题是,在我的安装方法运行后,工厂立即启动并验证空映射。有没有办法让工厂方法等待数据准备就绪?TestNG运行有两个不同的阶段:
然后,您可以期望在测试运行期间创建一些新的测试 工厂
@的目的是:。在@AfterClass
方法之后运行这些测试是没有意义的,因此即使您可以通过检查映射是否为空来解决问题(这样factory()
运行两次,但循环只运行一次),框架也不会执行工厂创建的任何测试
如果您需要在所有测试完成后验证某些数据,请将该验证放在带有@AfterClass
注释的方法中(不带@Factory
)。您可以像在常规测试中一样使用断言
如果出于某种原因,您希望将验证作为单独的测试运行,并且必须使用工厂,那么可以将它们的执行推迟到其他测试之后,但它们仍然必须在开始时实例化。因此,看起来您需要传递一些对象,以便在需要时加载数据,而不是立即使用映射条目初始化验证测试。数据提供程序可以工作,但这里有一个更简单的示例
将所有主要测试添加到组中
测试(dependsOnMethods=“method1”,groups=“Main”)
public void method2(){}
创建一个类或方法,在需要时加载数据,这取决于如何填充映射。它必须是线程安全的,因为TestNG并行运行测试。一个非常简单的实现:
公共类数据加载器{
//位置具有数据成员X和Y
私人地图位置;
公共同步位置getLocation(int索引){
如果(位置==null){
位置=新的HashMap();
//加载地图
}
返回位置。获取(索引);
}
}
创建一个类来表示验证测试。请注意,它的唯一测试取决于主组
公共类验证测试{
私有整数索引;
私有数据加载器;
公共验证测试(int索引、数据加载器){
这个数字=数字;
this.loader=loader;
}
@测试(dependsOnGroups=“Main”)
public void validate(){
Location Location=this.loader.getLocation(this.index);
//对location.x和location.y执行任何操作
}
}
实例化验证测试。他们将在主组完成后运行。注意,我已经删除了@AfterClass
注释
@工厂
公共对象[]工厂(){
DataLoader=新的DataLoader();
Object[]validators=新对象[10];
for(int i=0;i
顺便说一句,测试方法之间的依赖关系表明编写的测试很糟糕,至少对于单元测试,应该避免。除了TestNG之外,还有其他框架可用于测试复杂场景。您的解决方案在我设置的小规模测试中运行良好,但是您如何扩展
对象[]
?因为它需要动态调整大小,因为我返回的数据可能是1个或10000个条目。至于依赖关系,如果你有关于如何改进它们的提示,那将不胜感激。现在,我不希望在有任何数据要验证之前运行validate方法,也不希望在API向我发送文件/数据之前运行文件处理测试。我的解决方案基于您的示例,其中值的大小是已知的。正如我告诉过你的,动态测试可以在其他测试完成后运行,但它们必须在开始时初始化。使用最后运行的测试方法或@AfterClass
方法进行验证。工厂在这种情况下不工作。谢谢你的回答,我想我可以在阵列长度附近工作。