什么是API测试
API是Application Programming Interface的简写。在我们常说的测试金字塔里面,API测试也是相当重要的一部分,一般来说,我们是通过工具或者代码去调用特定的API,获得response,然后去验证response是否和我们想要的相符合。一般来说我们提到API测试,会涉及到两种类型,一种是功能测试,主要体现在positive的cases,nagative的cases,然后还有一些内部逻辑,比如增删改查。另外一种是非功能测试,主要体现在性能和安全。
Screen Shot 2018-12-06 at 10.17.23.pngAPI测试工具哪家强?
说到挖掘机,大家第一个肯定能想到的就是某某技校。那说到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. 是否有其他的非功能测试的需求,比如安全和性能测试...
13580951-2c1951785bae3e33.png在项目中API的测试是很重要一个方面,需要去整体考虑项目的各种情况综合判断,最后附上一个之前和同事一起做的的总结图,希望能够对大家有所帮助。
网友评论