开机自检请求失败(放心测试)

2022-09-04 02:48:54

我在放心的情况下提出POST请求时遇到问题。

此代码的工作原理:

given().contentType(ContentType.JSON).body("{\"key\": \"val\"}").    
        when().post(url + resource).then().assertThat().statusCode(200).body("otherVal", equalTo(otherVal)); 

但是我试图使用或这样的方法:param()parameter()

这个给出:

given().parameter("key", "val").                                      
        when().post(url + resource).then().assertThat().statusCode(200);  

Expected status code <200> doesn't match actual status code <415>.

这:

    given().parameter("key", "val").                                                         
            when().post(url + resource).then().assertThat().body("otherVal", equalTo(otherVal));  

java.lang.IllegalStateException: Expected response body to be verified as JSON, HTML or XML but no content-type was defined in the response. Try registering a default parser using: RestAssured.defaultParser(<parser type>);

还有这个:

RestAssured.defaultParser = Parser.JSON;                                                   
given().parameter("key", "val").                                                       
        when().post(url + resource).then().assertThat().body("otherVal", equalTo(otherVal));

java.lang.IllegalArgumentException: The JSON input text should neither be null nor empty

我已经没有想法出了什么问题。

我试图做的是避免为所有测试编写完整的jsons,如果我可以跳过所有“”和{},它会更快。我的方法正确吗?


答案 1

让我们看一下您的第一个示例:

given().contentType(ContentType.JSON).body("{\"key\": \"val\"}").    
        when().post(url + resource).then().assertThat().statusCode(200).body("otherVal", equalTo(otherVal));

这里发生的事情是,您将(作为文本)放入请求的正文中。此文本恰好是 JSON。从REST Assured的角度来看,你也可以把哪个不是有效的JSON。您的服务器响应正确,因为服务器需要并理解 JSON。它理解正文应为 JSON,因为您将 JSON 作为内容类型传递。{ "key" : "val" }{ "key" : "val"

让我们看一下你的第二个例子:

given().parameter("key", "val").                                      
        when().post(url + resource).then().assertThat().statusCode(200);

此处,你的服务返回 415,因为你缺少 JSON 内容类型。当您使用或与 时,会发生什么情况是创建表单参数。表单参数也发送到请求正文中,但表单参数不是 JSON!像这样指定“key”和“val”作为表单参数将如下所示:paramparameterPOST

given().contentType("x-www-form-urlencoded").body("key=val").when().url + resource).then().assertThat().statusCode(200);

因此,在第二个示例中,实际上存在两个问题:

  1. 您没有发送 JSON
  2. 您有错误的内容类型

由于(2)你从服务器得到415

转到第三个示例:

given().parameter("key", "val").                                                         
            when().post(url + resource).then().assertThat().body("otherVal", equalTo(otherVal));

这里(可能)发生的事情是,您的服务器不包含响应正文,因为它期望请求包含“application/json”作为内容类型。因此,没有要断言的主体(请求是错误的)!响应仅包含 415 状态(行)作为标头。

这就引出了您的最后一个例子:

RestAssured.defaultParser = Parser.JSON;                                                   
given().parameter("key", "val").                                                       
        when().post(url + resource).then().assertThat().body("otherVal", equalTo(otherVal));

在这里,您指示REST Assured将缺少的内容类型视为JSON,但问题(再次)是您的服务器根本不返回任何响应正文,因此这无济于事。

溶液:

您应该在类路径中放置一个受支持的 JSON 对象映射框架(Jackson、Faster Jackson、Simple JSON 或 Gson),然后按照文档中的说明创建一个映射:jackson-databind

Map<String, Object>  jsonAsMap = new HashMap<>();
map.put("key", "val");

given().
        contentType(ContentType.JSON).
        body(jsonAsMap).
when().
        post(url + resource).
then().
        statusCode(200).
        body("otherVal", equalTo(otherVal)); 

由于在Java中创建映射非常冗长,如果我有嵌套的映射,我通常会做这样的事情:

given().
        contentType(ContentType.JSON).
        body(new HashMap<String,Object>() {{
             put("key1, "val1");
             put("key2, "val2");
             put("key3", asList("val3", "val4"));
             put("nested", new HashMap<String,String>() {{
                 put("key4", "val4");
                 put("key5", "val5");
             }});
        }}).
when().
        post(url + resource).
then().
        statusCode(200).
        body("otherVal", equalTo(otherVal)); 

或者,您创建数据的 DTO 表示形式,然后只将对象传递给 REST Assured:

MyDTO myDTO = new MyDTO(...);
given().
        contentType(ContentType.JSON).
        body(myDTO).
when().
        post(url + resource).
then().
        statusCode(200).
        body("otherVal", equalTo(otherVal)); 

您可以在对象映射文档中阅读更多内容


答案 2

我正在寻找答案,我也想通了..

将文件添加到 src/test/resouces 文件夹中,并将此代码添加到测试中。应该都很好

URL file = Resources.getResource("ModyNewFieldsReq.json");
String myRequest = Resources.toString(file,Charsets.UTF_8);

Response fieldResponse =  given ()
       .header("Authorization", AuthrztionValue)
       .header("X-App-Client-Id", XappClintIDvalue)
       .contentType("application/vnd.api+json")
       .body(myRequest).with()

     .when()
       .post(dataPostUrl)    

    .then()
       .assertThat()
       .log().ifError()
       .statusCode(200)
       .extract().response();

Assert.assertFalse(fieldResponse.asString().contains("isError"));