繁体   English   中英

在 TestNG 中将 SoftAssert 与并行执行结合使用会产生意外结果

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM