• 1
  • 0
分享
  • 你不知道的接口测试之简单的开始
  • 大椿 2020-10-14 16:51:07 字数 5634 阅读 1793 收藏 0

当前的风气是,谈测试,必言“接口”。其实接口并不神秘,当今的应用中无处不是“接口”,从本篇开始让我来谈一些关于接口的浅薄认识。


一个简单的接口(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"
    }}

这就是一个比较简单的接口。


我们要测什么


还是用上面的接口实例,我们要测试的无非是(其他的用到再说,比如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”,是不是属于 “请求成功”,"请求失败","其他错误" 中的一个,
.....
以上步骤执行多次,直到取到所有的值!!!!


讲到这里产生了一个问题:如果始终没有返回所有的情况怎么办?


客观讲,这样的接口是没有意义的,也是不容易被测试的。所以后端工程师一般会根据请求端的变化而变化,那么请求如何变化的呢?这就是我们接下来要说的参数。


带参数的请求(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请求。


换个姿势请求(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本身有发送的意思)。


总结


  • 一个简单接口,发送请求就会返回数据。

  • 测试就是测试规则。

  • 接口返回数据是会根据参数发生变化的。

  • 接口请求方式有get和post。


作者:茧城寒舍

原文链接:https://www.jianshu.com/p/f6b948ba4aa4

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 1.Android APP 内存不足时,如何获得内存?系统优先结束被挂起(暂停)的进程,释放内存。 2.APP 测试常见问题有哪些?原因有哪些?常见的有 crash、ANR(应用无响应、卡死等),一般由设备碎片化、网络波动大、内存泄漏、代码编写错误。 3.APP 自动化测试工具有哪些,并简要介绍1)APP UI测试工具:①uiautomator2openatx开源的ui自动化工具,支持Android和iOS。主要面向的编程语言是Python,API设计简洁易用②Appium基于Node.js的一款非常成熟的APP UI自动化工具,支持多种语言开发,在测试圈非常流行,可以说是...
            1 4 14161
            分享
          •   行业现在比较卷,只会功能测试我感觉迟早会被淘汰。  我看今年很多面试的不会自动化连面试机会都没有,我还招聘网上刷了刷,基本岗位都需要自动化测试技能呢。  为什么说只会功能测试会被淘汰呢?毕竟功能测试可能一个月就能学会,很多人自学,随便做做项目功能测试就会了,这样门槛就太低了,这类人群就会很庞大,所以竞争就会很激烈,然后企业肯定会拉高门槛的,所以才有了今年的行业内卷,大家都在竞争一个岗位,那么你不就得各种技术掌握的扎实才行吗?  作为软件测试来说,功能测试是作为测试人员的基本功,也是必不可少的,随着时间的推移,科技的发展,作为测试,不仅仅要有扎实的基础,还是要不断的提升自己,如果一直停留在原...
            0 0 463
            分享
          •   前言  在学习计算机操作的系统的时候,分页存储管理与分段存储管理十分容易令人混淆,对其含义进行详细解读,能够加强我们对存储管理的整体理解。  存储管理  存储管理的对象是主存储器(主存、内存)。存储器能够存放各种信息,是计算机系统中的关键资源。其主要功能包括分配和回收主存空间、提高主存利用率、扩充主存、对主存信息实现有效保护。  存储管理的主要目的是解决多个用户使用主存的问题。分页存储管理、分段存储管理是两种重要的管理方案。  分页存储管理  将一个进程的地址空间划分成若干个大小相等的区域,称为页。  相应地,将主存空间划分成与页相同大小的若干个物理块,称为块或页框。为进程分配主存时,可将...
            0 0 868
            分享
          •   9月21日消息,由工信部主办的“5G与下一代移动通信技术发展”论坛近日在山东青岛举行。  华为无线产品线5.5G领域总裁高全中发表了题为“5.5G走向商用,迎接智能社会发展新浪潮”的主题演讲。  高全中表示,经过3年发展,5.5G技术和场景探索已逐步成熟,5.5G上下行速率、时延、确定性体验等传统网络能力实现10倍提升,同时引入了无源物联、通感一体等新技术新能力,实现与算力网络的深度融合,5.5G正走向商用部署阶段。  他补充道,5.5G已完成关键技术创新和验证,以及“五联一感”的业务应用验证,即将进入商用部署阶段。华为将于2024年推出面向商用的5.5G全套网络设备。  据了解,华为与中...
            0 0 787
            分享
          •   在利用Jmeter工具进行性能或自动化测试工作之初,第一步面临的交易想必就是登录。你可以运用控制器录制登录交易的脚本,或是通过自行配置环境、上送正确的用户名和密码完成登录操作,但这就算完成登录交易了么?事实是在继续配置后续交易之后,当你重复执行脚本时会发现,只有登录本身成功了,后续交易却报错。  产生这样的原因往往是当利用Jmeter首次录制登录交易后,此时有一个叫做token的值便作为固定参数存储在脚本中,而后置交易需依赖这个“令牌”而被系统所识别,而再次登录时,可能会返回不同的token,致使后续交易使用未匹配的token发给服务器,导致交易失败。  为解决这个问题,不得不分析toke...
            13 12 2264
            分享
      • 51testing软件测试圈微信