接口测试作为集成测试的一部分,通过直接调用被测试的接口来确定系统在功能性、可靠性、安全性和性能方面是否能达到预期,有些情况是功能测试无法覆盖的,所以接口测试是非常必要的。
接口测试分为两种,一种是webservice接口,走soap协议通过http传输,请求报文和返回报文都是xml格式的,测试时通过工具soapUI进行测试。使用情况比较少;另一种http api接口,走http传输协议,通过路径来区分调用的方法,最常用的是get和post请求。
上面说过,get和post请求是通过路径来区分的,get请求的请求参数都是写在URL里的,格式为:http://url?param1¶m2。而post的请求一般都是写在body里的,可能是key-value格式,或者json串格式,也可能是上传一个文件。。。那么问题来了,get请求和post请求的区别在哪里呢?我们百度时,大多数的答案是这样的:
1、get请求可以在浏览器中请求到,post请求的测试需要借助工具
2、get请求使用url和cookie传参,post的数据放在body中
3、post比get更安全,因为传递的参数在url上是看不到的
4、get请求的url会有限制,而post请求的数据可以非常大
5、一般get请求是来获取数据,post请求是传递数据的
其实,对于现在飞速发展的互联网来说,上面的说法已经不严谨了。首先,post请求的参数也可以写在url里,但是这种情况不多见;其次表面上看起来,post利用body传参,比get的url传参安全,但其实只要用抓包工具(fiddler,Charles等),post的参数也是一览无余;再次,现在的浏览器非常强大,可以输入支持很长的URL,所以也不再有限制一说了。这么说来,种种区别只有最后一条是最根本的了。
怎么来测试接口呢?根据什么来测呢?这就需要开发提供的接口文档了,接口文档和功能测试的需求说明书的功能是一样的。包括:接口说明、调用的url,请求方式(get or post),请求参数、参数类型、请求参数说明,返回结果说明。有了接口文档后,我们就可以设计用例了,一般接口测试的用例分为以下几种:
1、通过性验证,说白了就是传递正确的参数,是否返回正常的结果
2、参数组合,因为参数有必传和非必传,参数的类型和长度,以及传递时可能业务上的一些限制,所以在设计用例时,就要排列组合这些情况,保证所有情况都能覆盖到
3、接口的安全性,这个又分为几种情况:
1)绕过验证,比如提交订单时,在传递商品价格参数时,修改商品价格,就要看后端有没有验证了。或者我支付时,抓个包将订单金额一改,如果能以我改后的金额支付,那这个借口就有问题了。
2)绕过身份验证,就是某个功能只有有特殊权限的用户才能操作,那我传递一个普通的用户,是不是也能操作呢
3)参数是否加密,这个关系到一些账户的安全,比如我们在登录一些网站时,它要将我们的登录信息进行加密,如果不加密我们的信息就会暴露,危害性极大。
4) 密码安全规则,设置密码时复杂程度的校验。
4、根据业务逻辑来设计用例
用例设计完了,用什么来测试接口呢?我们可以借助一些工具,比如postman和jmeter。postman使用比较简单,可以在列表中选择请求方式,在输入框中输入URL,如果是get请求,直接点击send就可以看返回结果了。
如果是post请求,会涉及到几种参数的上传方式和添加请求头、权限验证还有添加cookie等操作。在标红的地方基本都能完成。
还有一种测试接口的工具是jmeter,用途比较广泛,不但能测接口的功能,还能对接口进行压力测试。自带的一些功能,比如参数化、数据关联更符合自动化测试的思想。而且还能操作数据库。在jmeter中需要创建线程组,线程组的循环次数和线程数决定了并发量,也可以设置持续时间或者启动结束时间来决定请求的运行时间。如图:
然后在线程组下面添加http请求,将接口的url、路径、参数、请求方法写好,再添加察看结果树来看请求返回结果,如果压测接口的化,需要添加聚合报告。
在jmeter中post请求添加请求头、cookie或者授权等,都需要添加相应的功能,比如标红部分,操作起来也比较简单。
使用jemeter时,可以对传递的参数进行参数化,有个函数生成器这样的小工具,举一个小小的例子,比如你想要生成一个随机数,只有打开函数生成器,输入最小值和最大值,再点击生成,就可以使用这个函数了,创建一个用户定义的变量,起一个变量名,变量值输入生成的函数,这样每次用到的时候,写成$(variable)就可以了。
jmeter关联的意思是,上一个接口的返回结果,作为下一个接口的请求参数,很多场景都会用到,如果压测这种场景的接口,关联是非常好用的。
以上便是使用jmeter做接口测试的一些基本用法。