当前的风气是,谈测试,必言“接口”。其实接口并不神秘,当今的应用中无处不是“接口”,从本篇开始让我来谈一些关于接口的浅薄认识。
1、一个简单的接口(demo.php)
<?php // 文件名称demo.php // 告诉浏览器返回为json类型 header('Content-Type:application/json; charset=utf-8'); // 组织的数据 $data = array( 'code' => 200, 'msg' => '请求成功', 'result' => array( 'key1' => 'value1', 'key2' => 'value2' ) ); // PHP数组转json $rst = json_encode($data,JSON_UNESCAPED_UNICODE); // 打印到浏览器 echo $rst;
把文件放到服务器指定目录,通过浏览器访问获得如下结果:
{ "code": 200, "msg": "请求成功", "result": { "key1": "value1", "key2": "value2" } }
这就是一个比较简单的接口。
2、我们要测什么
还是用上面的接口实例,我们要测试的无非是(其他的用到再说,比如http_code):
json对象的键“code”,是不是等于 200, json对象的键“msg”,是不是等于 "请求成功", result对象的键“key1”,是不是等于 "value1" .....
工作中接口数据会根据一定规则变化的,那么这个“规则”才是我们要测试的重点,我们看如下这个接口(demo1.php)。
<?php // 告诉浏览器返回为json类型 header('Content-Type:application/json; charset=utf-8'); // 获取一个0到2的随机数 $index = rand(0,2); $msgs = array('请求成功','请求失败','其他错误'); // 组织的数据 $data = array( 'code' => 200, 'msg' => $msgs[$index], 'result' => array( 'key1' => 'value1', 'key2' => 'value2' ) ); // PHP数组转json $rst = json_encode($data,JSON_UNESCAPED_UNICODE); // 打印结果 echo $rst;
在浏览器中多次访问,我们可能会得到如下结果:
{ "code": 200, "msg": "请求成功", "result": { "key1": "value1", "key2": "value2" } } { "code": 200, "msg": "请求成功", "result": { "key1": "value1", "key2": "value2" } } { "code": 200, "msg": "请求失败", "result": { "key1": "value1", "key2": "value2" } } { "code": 200, "msg": "其他错误", "result": { "key1": "value1", "key2": "value2" } }
在这个接口中,我们要测试的是“随机”这个规则,测试就是通过返回给浏览器中的msg是否发生了随机变化,那么我们要测试的是:
json对象的键“msg”,是不是属于 “请求成功”,"请求失败","其他错误" 中的一个, json对象的键“msg”,是不是属于 “请求成功”,"请求失败","其他错误" 中的一个, json对象的键“msg”,是不是属于 “请求成功”,"请求失败","其他错误" 中的一个, json对象的键“msg”,是不是属于 “请求成功”,"请求失败","其他错误" 中的一个, ..... 以上步骤执行多次,直到取到所有的值!!!!
讲到这里产生了一个问题:如果始终没有返回所有的情况怎么办?
客观讲,这样的接口是没有意义的,也是不容易被测试的。所以后端工程师一般会根据请求端的变化而变化,那么请求如何变化的呢?这就是我们接下来要说的参数。
3、带参数的请求(demo2.php)
<?php // 告诉浏览器返回为json类型 header('Content-Type:application/json; charset=utf-8'); // 获取参数index $index = $_GET['index']; // 获取一个0到2的随机数 //$index = rand(0,2); $msgs = array('请求成功','请求失败','其他错误'); // 组织的数据 $data = array( 'code' => 200, 'msg' => $msgs[$index], 'result' => array( 'key1' => 'value1', 'key2' => 'value2' ) ); // PHP数组转json $rst = json_encode($data,JSON_UNESCAPED_UNICODE); // 打印结果 echo $rst;
我们在浏览器中依次输入如下内容:
http://localhost/about_test/demo2.php?index=0,
http://localhost/about_test/demo2.php?index=1,
http://localhost/about_test/demo2.php?index=2,
返回结果如下:
{ "code": 200, "msg": "请求成功", "result": { "key1": "value1", "key2": "value2" } } { "code": 200, "msg": "请求失败", "result": { "key1": "value1", "key2": "value2" } } { "code": 200, "msg": "其他错误", "result": { "key1": "value1", "key2": "value2" } }
是不是看起来很眼熟?是的,这个和demo1.php的返回很像,但是也有区别,区别在于,只要url后面的index固定是某个值,那么返回结果也固定某个值。类似的有含有分页参数的接口如下(getList.php):
<?php // 告诉浏览器返回为json类型 header('Content-Type:application/json; charset=utf-8'); // 获取参数index $page = $_GET['page']; $size = $_GET['size']; /** * 在真正的开发过程中,会操作数据库,我们暂时用一个多维数组代替 */ $data_list = array( array('id'=>1,'name'=>'成龙'), array('id'=>2,'name'=>'周润发'), array('id'=>3,'name'=>'周星驰'), array('id'=>4,'name'=>'李连杰'), array('id'=>5,'name'=>'梁朝伟'), array('id'=>6,'name'=>'张曼玉'), array('id'=>7,'name'=>'惠英红'), array('id'=>8,'name'=>'林青霞'), array('id'=>9,'name'=>'王祖贤'), array('id'=>10,'name'=>'巩俐') ); foreach($data_list as $key=>$value){ if($key >= ($page -1) * $size && $key < $page * $size){ $temp[] = $value; } } // 组织的数据 $data = array( 'code' => 200, 'msg' => '请求成功', 'result' => $temp ); // PHP数组转json $rst = json_encode($data,JSON_UNESCAPED_UNICODE); // 打印结果 echo $rst;
我们在浏览器中打开如下连接:
http://localhost/about_test/getList.php?page=4&size=2
返回结果如下:
{ "code": 200, "msg": "请求成功", "result": [ { "id": 7, "name": "惠英红" }, { "id": 8, "name": "林青霞" } ] }
如果我们使用抓包工具(后面会详细讲),可能经常看到在url后面没有携带参数,但是返回的数据也可能发生变化,那是怎么回事呢?其实访问接口还有另外一种方式---post请求。
4、换个姿势请求(post请求)
我们把getList.php文件稍微做一下修改,得到以下代码(getList_post.php):
<?php // 告诉浏览器返回为json类型 header('Content-Type:application/json; charset=utf-8'); // 获取参数index //$page = $_GET['page']; //$size = $_GET['size']; $page = $_POST['page']; $size = $_POST['size']; /** * 在真正的开发过程中,会操作数据库,我们暂时用一个多维数组代替 */ $data_list = array( array('id'=>1,'name'=>'成龙'), array('id'=>2,'name'=>'周润发'), array('id'=>3,'name'=>'周星驰'), array('id'=>4,'name'=>'李连杰'), array('id'=>5,'name'=>'梁朝伟'), array('id'=>6,'name'=>'张曼玉'), array('id'=>7,'name'=>'惠英红'), array('id'=>8,'name'=>'林青霞'), array('id'=>9,'name'=>'王祖贤'), array('id'=>10,'name'=>'巩俐') ); foreach($data_list as $key=>$value){ if($key >= ($page -1) * $size && $key < $page * $size){ $temp[] = $value; } } // 组织的数据 $data = array( 'code' => 200, 'msg' => '请求成功', 'result' => $temp ); // PHP数组转json $rst = json_encode($data,JSON_UNESCAPED_UNICODE); // 打印结果 echo $rst;
这次我们不能通过在浏览器中直接输入访问地址+参数来获取返回结果,我们可以使用mac自带的终端来进行访问:
curl localhost/about_test/getList_post.php -X POST -d 'page=4&size=2'
我们如愿以偿的得到了下面的结果:
{"code":200,"msg":"请求成功","result":[{"id":7,"name":"惠英红"},{"id":8,"name":"林青霞"}]}
从上面的对比也许大概差不多可能大家能感觉到,post请求要比get麻烦!
这可能也符合我们朴素的认知:
简单的,意义不大的总是容易得到;
复杂的,意义重大的需要你付出才能得到(post本身有发送的意思)
5、总结
一个简单接口,发送请求就会返回数据。
测试就是测试规则。
接口返回数据是会根据参数发生变化的。
接口请求方式有get和post。
作者:茧城寒舍
链接:https://www.jianshu.com/p/f6b948ba4aa4