【问题标题】:RestAssured with duplicate query parameters具有重复查询参数的 RestAssured
【发布时间】:2021-05-21 16:08:41
【问题描述】:

处理使用 REST-assured rest-assured-3.3.0 的自动化测试包。有一个要测试的端点,该端点具有许多用于驱动其搜索功能的重复查询参数:

/count?taskTypes=EAS&taskTypes=MBO&taskTypes=OTHER&taskAges=NEW&taskAges=EXISTING&ageSelection=ALL

REST-assured 在其请求规范中提供params(Map<String, ?> var1) 以传入参数。但是,这使用不能包含重复键的 Map。因此,为了在测试代码中构造查询,我在 Multimap 中设置参数和关联值:

import com.google.common.collect.Multimap;


Multimap<String, String> searchParams = ArrayListMultimap.create();
searchParams.put("taskTypes", "EAS");
searchParams.put("taskTypes", "MBO");
searchParams.put("taskTypes", "OTHER");
searchParams.put("taskAges", "NEW");
searchParams.put("taskAges", "EXISTING");
searchParams.put("ageSelection", "ALL");

然后将 Multimap 传递给一个函数以格式化查询并使用 REST-assured 设置 GET 请求:

    import org.apache.http.client.utils.URIBuilder;
    import io.restassured.http.Method;
    import io.restassured.response.ExtractableResponse;
    import io.restassured.specification.RequestSpecification;


    protected ExtractableResponse request(Method method, Multimap<String, ?> params, String url) 
        {
                URIBuilder builder = new URIBuilder();
        
                for (Map.Entry<String, ?> entry : params.entries()) {
                    builder.addParameter(entry.getKey(), entry.getValue().toString());
                }
        
                try {
                    url = url + builder.build().toString();
                } catch(URISyntaxException e) {}
        
                return getRequestSpec()
                        .when()
                        .headers("Content-Type", "application/json")
                        .request(method, url)
                        .then()
                        .spec(getResponseSpec(method))
                        .extract();
         }

运行此代码会产生带有以下参数的请求:

/count?taskTypes=OTHER&taskAges=EXISTING&ageSelection=ALL

问题在于 REST-assured 似乎删除了在 url 参数中传递给它的重复查询参数。有趣的是 REST-assured 提供了以下接口given().queryParam("param", 1,2,3)

【问题讨论】:

    标签: java rest rest-assured


    【解决方案1】:

    在此处检查 for 循环:

     URIBuilder builder = new URIBuilder();
    
        for (Map.Entry<String, ?> entry : params.entries()) {
            builder.addParameter(entry.getKey(), entry.getValue().toString());
        }
    

    看起来尽管为params 使用了 Multimap,但您仍然以 Map 为构建器结束。无论如何,这是您摆脱重复键的地方。

    【讨论】:

    • 谢谢。我已经打破了return getRequestSpec() 所在的url = count?ageSelection=ALL&amp;taskTypes=EAS&amp;taskTypes =MBO&amp;taskTypes=OTHER&amp;taskAges=NEW&amp;taskAges=EXISTING 行。所以到目前为止看起来还不错。
    猜你喜欢
    • 2017-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-02
    • 2020-06-26
    • 1970-01-01
    相关资源
    最近更新 更多