第四章 接口自动化测试用例详解(上)
------phpunit 接口自动化测试系列
经过前三章的学习,我们准备好了对接口进行自动化测试的相关知识。现在我们开始讲解接口自动化测试用例的编写。在本章编写的测试用例中,我们只针对具体的接口,编写自动化测试用例,而不对代码架构进行规划,那些儿进阶性的知识点,我们将在后面的章节讲解。先学习如何砌砖,然后我们再去建自己的高楼大厦。
4.1 Get方式接口自动化用例
Get方式的接口自动化相对来说比较简单,直接调用接口地址,把参数放到接口地址后面即可。下面我们以众筹网的接口实例来讲解:
(1)接口文档
按关键字搜索项目(GET):
URL:http://api.zhongchou.cn/deal/list
参数:
keyword,搜索关键字
offset,拉取偏移,非必需,默认为0
count,拉取个数,非必需,默认为10
返回:项目Feed基础数据结构的数组
上面是一个搜索项目的接口文档,从文档中我们得知,这个接口是Get方式的,而且有三个参数,第一个参数是必需的,后两个参数是非必需的。返回值是Feed基础数据结构的数据(暂不要理会)。
(2)Curl命令调用
为了安全期间,我们调用测试环境下的数据,先绑定host: xx.xx.xx.xx api.zhongchou.cn。然后在终端下执行下面的命令:
[root@n028 api]# curl http://api.zhongchou.cn/deal/list?v=1&keyword='测试'
执行结果如图4.1.1所示:
图4.1.1
Curl调用接口返回值
当然,上面在终端下的接口返回的结果是加密后的json字符串,不太容易看明白。
(3)浏览器访问接口
为了使用接口返回值更加清晰明了,我们要借助于一个浏览器插件JsonView。此插件可以直接解析接口返回的json字符串,方便明了,不过有个缺点:只能查看Get方式的接口。
针对上面的例子,我们直接在浏览器的地址栏中输入http://api.zhongchou.cn/deal/list?v=1&keyword='测试',然后回车,就可以看到如图4.1.2所示:
图4.1.2浏览器访问接口
这样访问接口,返回值是不是更加清晰了。对应返回值中包含的汉字也作了对应的解码。
(4)PHP调用Get方式接口
PHP对接口的调用有完整的一套函数,对于Get方式的接口,只需要调用函数file_get_contents()就能得到返回值。
示例代码如下:
class Demo extends PHPUnit_Framework_TestCase{ public function testSearch() { $url="http://api.zhongchou.cn/deal/list?keyword=测试&v=1"; $ret=file_get_contents($url); echo $ret; } }
在JetBrains PhpStorm执行结果如图4.1.3所示:
图4.1.3 PHP调用Get接口执行结果
这个结果和在终端下调用Curl命令结果是一样的,那有没有和浏览器下结果那样的呢?当然有了,因为这个接口返回值是json编码过的,我们调用函数json_decode()解码一下即可。解码后的结果见图4.1.4所示:
图4.1.4
对接口返回值进行解码输出
(5)PHP编写Get接口自动化测试用例
经过上面的四步分析,我们已经可以用php来调用接口了,可是这还不是完整的自动化测试用例。我们需要添加对返回结果的验证,如果和预期的一样,就成功,如果不一样就失败。
完整的测试用例:
class Demo extends PHPUnit_Framework_TestCase{ public function testSearch() { $url="http://api.zhongchou.cn/deal/list?keyword=测试&v=1"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 0); $ret=curl_exec($ch); curl_close($ch); $data=json_decode($ret,true); //print_r($data); if(is_null($data)==false) { if($data['errno']=='0') { $this->assertEquals('0',$data['errno']);//判断errno是否为0,此步为抛出执行通过 $index =strpos($data['data'][0]['name'],'测试'); $this->assertnotEquals(-1,$index);//判断结果是否包含关键字 print('接口/deal/list:搜索接口------------------OK'.'\n'); } else { $this->assertEquals('0',$data['errno']);//抛出执行失败 print("接口/deal/list:搜索接口---------------Failure!"."\n".$ret."\n"); } } } }
我们为了判断结果,没有调用file_get_contents()函数,而改用了PHP调用接口的通用方法,如果不理解可以去网上查找相关讲解。而后我们加入了对接口返回值$data的判断:判断errno是否为0,查询结果中有没有包含关键字等。对于检测点的设置技巧,我们将在后面进阶篇中讲解。
结过这样的测试用例代码,我们就可以执行测试用例了,并且测试用例会自己判断接口调用的结果。执行结果如图4.1.5所示,如果想查看接口的具体返回值 ,只需要取消//print_r($data);此句的注释即可。
图4.1.5 Get接口的执行结果