[英]Using SoftAssert with Parallel Execution in TestNG produces unexpected results
我正在使用放心库来测试我们处理体育数据的 REST api。 简而言之,我有 2 种不同的 @Test 方法可以调用每项运动,一种 @Test 方法发出多个 GET 请求以收集所有运动员图像 url 并存储在 static ArrayList 中,另一种方法实例化SoftAssert object 并实际调用所有url 在 for 循环中并软断言 200 响应代码。 然后我在第二个测试方法的末尾执行 assertAll() 。
例如 - 我有一个 @Test getSoccerAthletes() 从响应中收集所有 url,该方法将重复,直到收集到所有运动员 url,因为一次响应限制为 250 名运动员。 在这个方法完成后,将执行 Soccer 的第二个 @Test 方法,它被命名为 testSoccerAthletes() 并且你可以看到它使用了 dependsOnMethods。 下面是设置。
@Test(priority = 1)
public static void getSoccerAthletes() {
baseURI = "https://XXXXX";
basePath = "XXXXX";
Response res = given().queryParam("apikey", "XXXXXXXX")
.queryParam("top", "250")
.queryParam("skip", soccerSkip)
.when().get();
Assert.assertEquals(res.statusCode(), 200);
JsonPath jPath = res.jsonPath();
System.out.println("Soccer: currentPageStart/totalCount " + jPath.getInt("currentPageStart")
+ "/" + jPath.getInt("totalCount"));
if (soccerSkip == 0) {
allSoccerAthletes = jPath.get("page.links.headshots.full");
} else {
ArrayList<String> athletes = jPath.get("page.links.headshots.full");
allSoccerAthletes.addAll(athletes);
}
if (jPath.getInt("currentPageStart") + 250 < jPath.getInt("totalCount")) {
soccerSkip += 250;
getSoccerAthletes();
}
}
@Test(priority = 2, dependsOnMethods = {"getSoccerAthletes"})
public static void testSoccerAthletes() {
SoftAssert softAssert = new SoftAssert();
for (int i = 0; i < allSoccerAthletes.size(); i++) {
String url = allSoccerAthletes.get(i);
System.out.println("Soccer Athlete: " + i + "/" + allSoccerAthletes.size());
Response res = when().head(url);
softAssert.assertEquals(res.statusCode(), 200, "Failed url: " + url);
if (i == allSoccerAthletes.size() - 1)
allSoccerAthletes.clear();
}
softAssert.assertAll();
}
我看到了不同的结果,其中一些因 @Test testXXXXAthletes 方法的失败而混在一起。 在线的第一个建议是在每个 @Test 方法(我目前为每个 testXXXXAthletes 方法)中实例化一个 SoftAssert object,所以不可能。
我开始倾向于存在线程安全问题,但我不确定如何推进解决方案。 我认为存在线程安全问题的原因来自我研究过的一些文章,但并不完全理解。 文章 --> https://learn2automate.wordpress.com/2017/07/13/parallel-testng-soft-assertions-the-right-way/ , 在 TestNG 上检索测试名称, https://github.com/rest -放心/放心/问题/1420
对解决我的问题的任何帮助将不胜感激。 顺便说一句,我还研究了使用 @DataProvider 注释,这让我想到了有关这些测试结构的其他问题,getXXXAthletes 方法充当 testXXXAthletes 方法的数据提供者。 但是它们有 dependsOnMethods 属性,我应该同时使用 DataProvider 和 dependsOnMethods 吗? 还是一个在另一个之上?
进一步的研究证实了我关于线程安全问题的理论。 我能够得出结论,这个问题与 SoftAssert 无关,而与 rest-assured 不是线程安全有关。 该信息可以在这里找到 --> https://github.com/rest-assured/rest-assured/pull/851
我能够找到一个线程本地分支,其中有人好心地做了工作以确保线程安全。 我下载了 2 个文件 RestAssuredThreadLocal 和 RestAssuredThreadLocalImpl 可以在这里看到 --> https://github.com/rest-assured/rest-assured/commit/3307ba6c79c5547e88cea286d38e5c8a6d679229
下载这 2 个文件后,有一些错误需要解决,一些已弃用的方法需要更换。 之后,我能够成功地与 TestNG 并行运行我的放心测试,并获得正确的结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.