提问者:小点点

是否有办法根据Pass/Fail设置TestNG依赖关系


给定以下testNG测试设置:

package testCases;

import org.testng.annotations.Test;

import framework.utilities.TestBase;

public class Scratch extends TestBase {

    @Test()
    public void test1() {
        // creating a web page
    }
    
    @Test(dependsOnMethods = {"test1"})
    public void test2() {
        // populating the web page with information
    }
    
    
    @Test(dependsOnMethods = {"test2"})
    public void test3() {
        // updating the web pages information with new information
    }
    
    
    @Test(dependsOnMethods = {"test3"})
    public void test4() {
        // deleting the web page
    }
}

上面的设置是一个简单的CRUD测试流程,通过selenium和testNG在我们的网页中自动化功能,每个测试都有一个特定的目的,在每个测试方法的注释中确定。

我想解决以下情况,假设test1通过但test2失败。我想重新尝试运行test2,但是如果test1已经通过,则只需运行test2。如果test1失败,则在test2之前重新运行test1

我的想法是,如果test2失败了,我们确实有一个成功创建的网页,而不是浪费时间重新运行test1,让我们重新运行test2。然而,使用其当前的实现,testNG将重新运行test1,而不管重试。

我想过的两个解决办法是做一个如下:

>

  • 在重新尝试之前清理从任何测试生成的所有数据。因此有意义它将重新运行test1

    使每次创建时生成的数据唯一,从而在test1重新运行时不会遇到问题。

    然而,需要一些时间来添加逻辑来理解这两种解决方案,想知道我是否有作弊的方法不必这样做?


  • 共1个答案

    匿名用户

    您可以创建一个RetryAnalyzer类,如下所示:

    public class RetryAnalyzer implements IRetryAnalyzer {
        private String name = ""; // last failed executed test.
        private int count = 0; // number of failures
        private static final int MAX_LIMIT = 5;
    
        @Override
        public boolean retry(ITestResult result) {
            String testName = result.getName();
            if(!testName.equals(name)) {
                // new test
                count = 0;
                name = testName;    
            }
            if(count < MAX_LIMIT) {
                count++;
                return true;
            }
            // max limit reached
            return false;
        }
    }
    

    目前testNG不支持在类级别指定retryAnalyzer。(可能在最新/未来版本中可用)。所以目前我正在为每个类添加retryAnalyzer属性。

    public class MyTest {
        @Test(retryAnalyzer = RetryAnalyzer.class)
        public void test1() {
            // creating a web page
        }
        
        @Test(dependsOnMethods = {"test1"}, retryAnalyzer = RetryAnalyzer.class)
        public void test2() {
            // populating the web page with information
        }
            
        @Test(dependsOnMethods = {"test2"}, retryAnalyzer = RetryAnalyzer.class)
        public void test3() {
            // updating the web pages information with new information
        }   
        
        @Test(dependsOnMethods = {"test3"}, retryAnalyzer = RetryAnalyzer.class)
        public void test4() {
            // deleting the web page
        }
    }
    

    在这里,如果test1通过并且test2失败,则不会重新运行。只有test2会被重试。如果test2在达到指定的最大限制之前通过,test3将被执行,依此类推。

    通过的测试将只运行一次。如果任何测试在达到限制之前没有通过,则依赖的测试将被标记为已跳过。