【问题标题】:Problem with checking values of JSON array using Rest Assured使用 Rest Assured 检查 JSON 数组的值的问题
【发布时间】:2020-07-27 11:05:42
【问题描述】:

我正在尝试向我的应用程序添加一些带有 Rest-Assured 的测试,但我不知道如何断言一些嵌套值。错误信息是:

预期:(包含“json”的集合) 实际:[[json, spring, gulp, path etc...]]

代码如下:

 when().
       get("/api/personsByID/{id}/{count}", 262, 2).
       then().
       statusCode(200).
       body("personDependencies.name", hasItems("json"));

这是休息控制器返回的 JSON 文件:

[
    {
        "id": 346,
        "verified": true,
        "displayName": "eda656a2c3cb59ae840e40a28ba4ab50bfb9de0185abcb901c6af6dc59d6668f",
        "emails": [
            {
                "email": "16a23f2e5477df0bbcad718c3abc235b2cb8a1b6648d14f58d42a7be13df2b6e"
            }
        ],
        "personDependencies": [
            {
                "name": "json"
            },
            {
                "name": "spring"
            },
            {
                "name": "gulp"
            },
            {
                "name": "path"
            },
            {
                "name": "junit"
            },
            {
                "name": "activemq"
            },
            {
                "name": "hibernate"
            },
            {
                "name": "jstl"
            },
            {
                "name": "phantomjs"
            },
            {
                "name": "activiti"
            },
            {
                "name": "commons"
            },
            {
                "name": "h2"
            },
            {
                "name": "joda"
            },
            {
                "name": "log4j"
            },
            {
                "name": "exec"
            },
            {
                "name": "admin"
            },
            {
                "name": "coveralls"
            },
            {
                "name": "cxf"
            },
            {
                "name": "cglib"
            },
            {
                "name": "camel"
            },
            {
                "name": "sugaronrest"
            },
            {
                "name": "tslint"
            },
            {
                "name": "httpclient"
            },
            {
                "name": "guava"
            },
            {
                "name": "inventory"
            },
            {
                "name": "jackson"
            },
            {
                "name": "gson"
            },
            {
                "name": "event"
            },
            {
                "name": "OTRS"
            },
            {
                "name": "maven"
            },
            {
                "name": "karma"
            },
            {
                "name": "slf4j"
            },
            {
                "name": "postgresql"
            },
            {
                "name": "typescript"
            },
            {
                "name": "jasmine"
            },
            {
                "name": "spa"
            },
            {
                "name": "javax.servlet"
            }
        ],
        "countries": [],
        "member_of": [],
        "projects": [],
        "employee_type": [],
        "languages": [
            {
                "language": "reStructuredText",
                "sum": 575
            },
            {
                "language": "JSON",
                "sum": 21
            },
            {
                "language": "JavaScript",
                "sum": 4467
            },
            {
                "language": "Java",
                "sum": 7958
            },
            {
                "language": "Python",
                "sum": 2
            },
            {
                "language": "XML",
                "sum": 477
            },
            {
                "language": "Plain Text",
                "sum": 41
            }
        ],
        "distance": 0.6028837702084446
    }
]

我不知道如何做出正确的断言,任何帮助都会很棒。谢谢!

【问题讨论】:

  • github.com/rest-assured/rest-assured/issues/805的例子,你正在处理一个数组,需要选择一个特定的实例或为所有实例做断言。
  • 我试过:find body(" find {it.id=='346'}.personDependencies.name", hasItems("json", "jackson")) 但这会返回一个空值
  • 您的具体要求是什么?
  • 如您所见,它只是输出 JSON 文件中的一个 id,但我想要实现的是能够选择其中一个对象,例如 id=400 并断言如果该对象在 personDependencies 中有某些值。我试过:find body(" find {it.id=='346'}.personDependencies.name", hasItems("json", "jackson")) 但这会返回 null

标签: java rest rest-assured


【解决方案1】:

如果我没看错你的问题,你需要检查某个值是否存在于为特定 ID 返回的列表中

以下内容应该适合您

given().when().get().then().body("find {it.id == 346}.personDependencies.name", hasItems("json", "jackson"));

【讨论】:

    【解决方案2】:

    第一个问题你不需要用hasItems检查一个项目的存在,你应该使用hasItem

    when().
           get("/api/personsByID/{id}/{count}", 262, 2).
           then().
           statusCode(200).
           body("personDependencies.name", hasItem("json"));
    

    那么如果您需要在测试失败时向断言添加更多消息,您可以这样做:

     when().
            get("/api/personsByID/{id}/{count}", 262, 2).
            then().
            statusCode(200).
            body("personDependencies.name",  describedAs("Array not containing the provided item",hasItem("json")));
    

    在您的情况下,您可以验证这种方式:

    when().
           get("/api/personsByID/{id}/{count}", 262, 2).
           then().
           statusCode(200).
           body("personDependencies[*].name", hasItem("json"));
    

    【讨论】:

    • “hasItems”没有引起问题。
    • 问题出在哪里?
    • 我必须在我的数组中为一个特定用户选择一个特定实例,正如上面@ewramner 建议的那样,但我不知道如何。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-23
    相关资源
    最近更新 更多