给定以下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重新运行时不会遇到问题。
然而,需要一些时间来添加逻辑来理解这两种解决方案,想知道我是否有作弊的方法不必这样做?
您可以创建一个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
将被执行,依此类推。
通过的测试将只运行一次。如果任何测试在达到限制之前没有通过,则依赖的测试将被标记为已跳过。