谈谈API测试

2018-12-06  本文已影响0人  lingyunyang

什么是API测试

API是Application Programming Interface的简写。在我们常说的测试金字塔里面,API测试也是相当重要的一部分,一般来说,我们是通过工具或者代码去调用特定的API,获得response,然后去验证response是否和我们想要的相符合。一般来说我们提到API测试,会涉及到两种类型,一种是功能测试,主要体现在positive的cases,nagative的cases,然后还有一些内部逻辑,比如增删改查。另外一种是非功能测试,主要体现在性能和安全。

Screen Shot 2018-12-06 at 10.17.23.png

API测试工具哪家强?

说到挖掘机,大家第一个肯定能想到的就是某某技校。那说到API测试呢?现在市面API的工具多种多样,我们甚至也可以去自己搭建API的测试框架,我们究竟去怎么选择呢?我们今天拿常见的几个工具来比较一下吧。

Jmeter:

Jmeter不是性能测试的工具吗?的确是的。但是jemeter也可以用来做API的测试,首先Jmeter提供了一个GUI的界面,可以在里面配置URL,request,proxy等等,同时,Jmeter来提供了录制的功能,能够把你所操作的内容以脚本的形式录制下来。 而且jemeter也支持non GUI的形式,也就是说我们也能够很方便的把Jemeter集成到pipline里面去。

Jemeter整体来说还是比较重的一个工具,所以我的建议是如果你的API测试不多,都是一些简单的调用,那么Jemeter是一个选择。

Postman/Newman

Postman相信在很多项目应用的已经相当广了,在做API测试,或者trouble shooting,或者开发的时候起着很大的作用。能够很方便的进行手工测试和调试。而且Postman强大的是他也提供了non gui的形式-newman,这就是说它也能很好的和pipline集成。 Newman基本上能满足大部分项目的API的需求,它本身提供很强大的服务,能方便的支持断言,只需要你用JS语言去描述就好,而且还提供了collection run,可以在collection里面定义不同的环境变量,不同的data。比如说,针对一个API,你可能要用不同的参数跑多次,这个时候只需要定义个Data就够了,然后运行时加一个-d的参数即可。

下面是我们在最近的一个项目中写的断言,需要验证返回的body中action等于booking-confirmation,并且actionIncomplete等于false:

"exec": [
    "pm.test(\"Your test name\", function () {",
    "var jsonObject = JSON.parse(responseBody);",
    "pm.expect(jsonObject[\"result\"][\"action\"]).to.eql(\"booking-confirmation\");",
    "pm.expect(jsonObject[\"result\"][\"actionIncomplete\"]).to.eql(false);",
    "});"
]

即使是使用newman,它的脚本语言也是直接导出生成的,并不能太好的结构化,但是我觉的newman还是能够满足大部分项目的需求。除非你有特别复杂的API。

Rest Assured:

Rest-assured 是一个能够简化测试rest服务的Java DSL,像ruby或者python一样的动态语言去测试和验证http服务。基于java并且兼容了groovy动态语言的特性,使我们像写脚本语言一样去测试http服务。 同样支持很强大的断言,而且由于是用java进行编程,所以给整个框架留下了足够的编程空间。你甚至可以像写别的测试代码一样去做测试分层。

但是缺点是Rest Assured本身并没有GUi,你需要借助一些别的GUI,比如Postman,而且只支持java,需要有一定java编程基础,学习成本会比较高,如下图:

    RestAssured.baseURI = ENVs.getProperty(System.getProperty("env"));
    RequestSpecification httpRequest = RestAssured.given();
    httpRequest.header("Content-Type", "application/json");
    httpRequest.header("api-test", "true");
    httpRequest.body(createRecord.toString());
    System.out.println(createRecord.toString());
    Response response = httpRequest.post("/records");

自己搭建API框架

有的时候,在APIs特别多,调用特别复杂的情况下,我们会选择自己去搭建API的测试框架,我之前在一个微软的项目上遇见过,基本的架构是:

1. 定义了很多类,每一个类里面字段代表API的一个参数

2. 定义一些XML的文件作为数据源,给类里面的字段赋值。

3. 将类序列化成XML,发送给server。

4. server收到请求返回给客户端。

5. 客户端将response反序列化成类,进行assert验证。

整体感觉架构还是挺复杂的,而且维护成本也比较大,但是当时的情况就是客户要求每一个API都要验证(有近百个API),而且一个API的参数都需要用排列组合成不同集合(每一个API最多有1000多种参数的集合)。所以我们选择了这种比较重的框架。试想如果我们用Newman,或者Jemter去做,那可能需要去生成上万个文件,这是绝对不可行的。

其他因素

除了比较工具本身的区别之外,我们还要考虑:

1. APi与pipline的集成,这就需要API工具本身能够提供non gui的工作模式。

2. 项目本身的技术栈,比如如果API是前端调用,那我们可以选择Newman,因为newman也是用JS去写,这样我们可以很方便的用npm去做工程化。 如果是在JAVA栈的BFF端写API测试,那我们最好也选择Rest Assured,这个可以方便用maven,gradle来进行工程化。

3. 是否有其他的非功能测试的需求,比如安全和性能测试...

在项目中API的测试是很重要一个方面,需要去整体考虑项目的各种情况综合判断,最后附上一个之前和同事一起做的的总结图,希望能够对大家有所帮助。

13580951-2c1951785bae3e33.png
上一篇下一篇

猜你喜欢

热点阅读