testng - TestNG DataProvider 返回对象和 RetryAnalyzer 无法识别重试
问题描述
我到处寻找我所知道的,我似乎无法找到这个答案。
如果我将 DataProvider 中的“复杂”对象传递给测试方法,Invoker 似乎会在每次迭代时获得一个新的 RetryAnalyzer 实例。
IRL,我的数据提供者进行数据库查询并将对象传递给测试方法。我最初认为数据库访问会导致问题,但后来将其范围缩小到我认为最简单的例子。
请看下文。如果我在 RetryAnalyzer 中设置断点,我可以看到 retryCount 始终为 0。每次调用它都是一个新实例。Test01 基本上是一个无限循环。
测试NG 7.0.0
有什么帮助吗?
测试类:
package test;
import org.testng.Assert;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
public class RetryTester {
public class DataObject extends Object {
String name;
String url;
DataObject(String name, String url) {
this.name = name;
this.url = url;
}
}
@Test(retryAnalyzer = RetryAnalyzer.class, dataProvider = "getData1")
public void test01(DataObject d) throws Exception {
System.out.println("[" + d.name + "]" + "/[" + d.url + "]");
Assert.fail("Retry test fail");
}
@Test(retryAnalyzer = RetryAnalyzer.class, enabled = true, groups = { "load" }, dataProvider = "getData2")
public void test02(String name, String url) throws Exception {
System.out.println("[" + name + "]" + "/[" + url + "]");
Assert.fail("Retry test fail");
}
@DataProvider
public Object[][] getData1() {
DataObject one = new DataObject("name1", "a");
DataObject two = new DataObject("name2", "b");
Object[][] data = new Object[][] { { one }, { two }, };
return data;
}
@DataProvider
public Object[][] getData2() {
return new Object[][] { new Object[] { "name1", "a" }, new Object[] { "name2", "b" }, };
}
}
重试分析器类:
package test;
import org.testng.IRetryAnalyzer;
import org.testng.ITestResult;
public class RetryAnalyzer implements IRetryAnalyzer {
private int retryCount = 0;
private int retryMaxCount = 1; // set your count to re-run test
@Override
public synchronized boolean retry(ITestResult result) {
if (retryCount < retryMaxCount) {
System.out.println("Retry logic for '" + result.getName() + "' on class " + this.getClass().getName());
retryCount++;
return true;
}
return false;
}
}
测试01输出:
[name1]/[a]
Retry logic for 'test01' on class test.RetryAnalyzer
[name1]/[a]
Retry logic for 'test01' on class test.RetryAnalyzer
[name1]/[a]
Retry logic for 'test01' on class test.RetryAnalyzer
[name1]/[a]
Retry logic for 'test01' on class test.RetryAnalyzer
[name1]/[a]
Retry logic for 'test01' on class test.RetryAnalyzer
[name1]/[a]
Retry logic for 'test01' on class test.RetryAnalyzer
...
测试02输出:
[name1]/[a]
Retry logic for 'test02' on class test.RetryAnalyzer
[name1]/[a]
[name2]/[b]
Retry logic for 'test02' on class test.RetryAnalyzer
[name2]/[b]
FAILED: test02("name1", "a")
FAILED: test02("name2", "b")
RETRIED: test02("name1", "a")
RETRIED: test02("name2", "b")
解决方案
推荐阅读
- dart - Dart 2:构建符合 CSP 的 JS
- git - 向 GitHub 添加 SSH 密钥的目的是什么?
- arrays - array_upper 和 array_length 之间有什么功能区别吗?
- svg - 如果文本字体大小小于 1,如何呈现文本(在 svg 中)
- android - Android Q Api 29 - 如何从“存储访问框架”获取存储(SD 卡)的大小(总或可用)
- spring-boot - Oauth2:Spring Boot 2:设计:不同的身份验证服务器和资源服务器 - 在哪里存储所有用户信息?
- postman - 在 Postman 中将字符串值与 .json 数据进行 API 测试比较
- python - 在线性规划中添加到约束的变量的条件语句
- php - 如何从 UserInfo 端点获取职位和电话号码
- go - 读取函数完成后未更新 Go rot13Reader 缓冲区之旅