当前位置: 首页 > 知识库问答 >
问题:

POST请求失败(放心测试)

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

这一条给出:

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

预期状态代码<200>与实际状态代码<415>不匹配。

这个:

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

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

共有1个答案

燕飞文
2023-03-14

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

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

这里发生的情况是将{“key”:“val”}(作为文本)放入请求的正文中。这个文本恰好是JSON。从REST Assured的角度来看,您可以将{“key”:“val”放置为无效的JSON。您的服务器响应正确,因为服务器需要并理解JSON。它理解主体应该是JSON,因为您将JSON作为Content-Type传递。

让我们来看看第二个例子:

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

在这里,您的服务返回415,因为您缺少了JSON内容类型。当您将paramparameterpost一起使用时,您会创建表单参数。表单参数也在请求体中发送,但表单参数不是JSON!将“key”和“val”指定为表单参数将与以下操作相同:

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

在第二个例子中,实际上存在两个问题:

    null
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,但问题是(再次)服务器根本不会返回任何响应体,因此这将于事无补。

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表示,并只传递一个对象就可以放心了:

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

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

 类似资料:
  • 对于包含JSON主体的post请求,我使用rest assured 我的post请求代码是:- 好心的帮助....

  • 我正在开发一个脚本,以访问图形API阅读我们的广告中的所有用户。我正在通过以下方式使用AXIOS执行一个请求: 然而,这失败了,因为: client_id=535FB089-9FF3-47B6-9BFB-4F1264799865&scope=https%3a%2f%2fgraph.microsoft.com%2f.default&client_secret=qwgdyamab0yskul1qkv5

  • 附注:我没有张贴整个控制器。这里只包括http请求部分。

  • 我的本地dev-Kafka模式注册表正在运行,我能够从我的生产者发布模式并获得一个ID。我使用自动注册=false,与我的生产服务器相同。但我对模式进行了更新,添加了一个字符串。 POST以404失败 org.apache.kafka.common.errors。SerializationException:检索Avro架构时出错:由io.confluent.kafka.schemaregistr

  • 我必须发送一个带有xml数据的post请求,然后验证响应,例如检查状态代码和响应体。

  • 问题内容: 在我的JMeter测试中,如果有任何错误,我想触发HTTP请求以在系统上发布消息,以进一步关注。我在这里可以做什么?邮件可视化工具可以很好地通过电子邮件报告错误。我想做同样的事情,但是要通过HTTP请求。我正在使用jmeter 3.2。 问题答案: 您可以执行以下操作: 在HTTP Request采样器之后添加If Controller,并将以下代码放入“条件”区域: 将SMTP Sa