接口测试 使用 rest-assured 和 cucumber 进行接口测试实例

紫殇情结 · 2017年05月19日 · 最后由 donly 回复于 2019年02月01日 · 3509 次阅读
本帖已被设为精华帖!

第一次发分享帖,鸡冻。
之前想学习接口测试,在论坛里看到了 rest-assured 项目,感觉用起来很方便,但是论坛里关于 rest-assured 的介绍还比较少,只能自己鼓捣一点了,希望各位勿喷,多谢!
由于稍微了解一些 cucumber,所以在尝试将 rest-assured 和 cucumber 结合一起使用。下面拿豆瓣读书 API 举例

依赖

rest-assured 相关依赖:

<!-- https://mvnrepository.com/artifact/io.rest-assured/rest-assured -->
<dependency>
    <groupId>io.rest-assured</groupId>
    <artifactId>rest-assured</artifactId>
    <version>3.0.2</version>
</dependency>

<!-- https://mvnrepository.com/artifact/io.rest-assured/json-schema-validator -->
<dependency>
    <groupId>io.rest-assured</groupId>
    <artifactId>json-schema-validator</artifactId>
    <version>3.0.3</version>
</dependency>

cucumber 相关依赖:

<!-- https://mvnrepository.com/artifact/info.cukes/cucumber-core -->
<dependency>
    <groupId>info.cukes</groupId>
    <artifactId>cucumber-core</artifactId>
    <version>1.2.5</version>
</dependency>

<dependency>
    <groupId>info.cukes</groupId>
    <artifactId>cucumber-picocontainer</artifactId>
    <version>1.2.5</version>
</dependency>

<!-- https://mvnrepository.com/artifact/info.cukes/cucumber-junit -->
<dependency>
    <groupId>info.cukes</groupId>
    <artifactId>cucumber-junit</artifactId>
    <version>1.2.5</version>
</dependency>

<!-- https://mvnrepository.com/artifact/info.cukes/cucumber-java -->
<dependency>
    <groupId>info.cukes</groupId>
    <artifactId>cucumber-java</artifactId>
    <version>1.2.5</version>
</dependency>

cucumber feature

cucumber 使用 feature 来描述一个场景,相当于是测试用例,这样的好处是可读性比较好

book.feature

Scenario:
  Given there is basic info
  |baseURL|https://api.douban.com/|
  When I get the book with asin "9787108059444"
  Then state code will be "200"
  And response includes the following data
  |id|27029497|

request steps

实现 there is basic info 的步骤,在此步骤中,赋值一些基本信息,如 rest-assured 中的 baseUrl、auth、param 等。

@Given("^there is basic info$")
public void base_info(Map<String,String>infoMap){
    String baseURL = null;

    for (Map.Entry<String, String> field : infoMap.entrySet()) {
        if (field.getKey().equalsIgnoreCase("baseURL")){
            baseURL = field.getValue();
        }
    }
    request = given().log().all().baseUri(baseURL);
}

实现访问具体 api 的步骤,可以根据实际需要开启与否 log

@When("^I get the book with asin \"([^\"]*)\"$")
public void get_book_with_ASIN(String ASIN){
    URI uri = URI.create("/v2/book/isbn/" + ASIN);
    response = request.when().log().all().get(uri);
}

结果验证

状态码验证

@Then("^state code will be \"([^\"]*)\"$")
public void verify_state_code(int stateCode){
    response.then().assertThat().statusCode(stateCode);
}

response 验证

@And("^response includes the following data$")
public void response_equals(Map<String,String> responseFields){
    for (Map.Entry<String, String> field : responseFields.entrySet()) {
        response.then().assertThat().body(field.getKey(), equalTo(field.getValue()));
    }
}

当然,也可以使用 json schema

@And("^verify response with Json Schema \"([^\"]*)\"$")
public void responseWithJsonSchema(String JsonSchemaName){
    JsonSchemaFactory jsonSchemaFactory = JsonSchemaFactory.newBuilder().setValidationConfiguration(ValidationConfiguration.newBuilder().setDefaultVersion(DRAFTV4).freeze()).freeze();
    json.assertThat().body(matchesJsonSchemaInClasspath("jsonSchema/" + JsonSchemaName).using(jsonSchemaFactory));
}

大概的实例就是这样,欢迎交流,谢谢!

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 10 条回复 时间 点赞

cucumber 这框架倒是第一次见。。。话说黄瓜。。。

思寒_seveniruby 将本帖设为了精华贴 05月21日 00:37

加精理由: 我对 BDD 持保留意见. 不过你给了很好的 Rest-Assured 跟其他框架结合的例子.

多谢鼓励😀 用 cucumber 主要是为了用他来写用例,将 step 尽量抽离成公用类,剩下的就是组织用例了,这样入门门槛会降低很多,毕竟其他人不用关心具体实现,只要用已有的 step 就好了

感谢分享。
我能冒昧问下选择这个技术栈的优势会有哪些呢?

是 JAVA 代码为啥方法命名都是下划线,不应该驼峰么?

Cucumber 的优势是用例的可读性,可以用你熟悉的任何自然语言描述测试用例和场景,让非技术测试或者客户专注于用例的设计,测试开发人员实现函数执行体。这样可以显著的提升测试过程的配合和效率改进。
比较肯爹的是思想是好的,但是需要用例设计者对语言的描述要求基本保持一致,因为他在执行函数与用例间的绑定主要还是用的正则匹配技术,这样又反过来限制了用例设计者的语言自由性,没有 Keyword 驱动的简单明了。期待自然语言智能理解的技术能够带给 Cucumber 新的生命。

David Tao 回复

IDE 自动创建方法的时候不知道为啥就是带下划线的了 呵呵

rest-assured 的最大优势,就是使用 fluent interface 编写自带 scenario style 的冒烟场景脚本
cucumber,则你就必须显式引入 req, res,在场景步骤中传递了。总感觉会有点变扭的说……

可能用其他框架,拿到响应以后,在 then and other 步骤里去断言响应更合适。(比如 jsoup)

cucumber 如果编写 when then when then 这种,再遇到 rest-assured 就会非常别扭

api 测试框架 +cucumber 曾经也写过,不过写完 demo 我就丢了 。 cucumber 不带这么玩,完全就是给自动测试添加工作量。

楼主,你好,请问你们现在还在用 rest-assured 和 cucumber 嘛?

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册