Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java TestNG@Factory Priority_Java_Automated Tests_Testng - Fatal编程技术网

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
    方法进行验证。工厂在这种情况下不工作。谢谢你的回答,我想我可以在阵列长度附近工作。