• 3
  • 4
分享

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

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


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

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   为啥今天想起这个话题呢,因为我之前有过这样的经历,且身边的小伙伴也频频遇到面试官来这么个灵魂拷问,所以觉得这点其实还挺重要的,特来分享一下我的应对之策。  既然问题出来了,我们就要弄懂它的来龙去脉,深层次的去了解下这个问题背后折射着面试官什么心思。然后根据面试官的隐藏深意,再去找答案就有的放矢了。  当然有些小伙伴觉得自己技术过硬,又担任过测试的核心角色,有空窗期可是高枕无忧。我只想对这样的仁兄说一句:“too young, too simple”。可以这么说,无论你是测试大拿还是管理精英,只要你有职业空窗期,招聘方都是会有顾虑的。好一点的会询问你这段时间干嘛去了,差一点的直接无视你的简历...
            0 0 1724
            分享
          •   项目系统介绍  地质系统——主要作用进行地质数据建模、数据收集、数据计算及数据传递。  执行系统——主要根据地质系统传过来的数据,如平面地质图、巷道现状图等进行车辆调度并统计相关生产数据。  Mes系统——主要用于从相关系统获得的数据进行日报展示、大屏重点数据展示及相关数据业务数据展示。  各系统间逻辑关系:数据获取-计算-执行-展示。  项目背景:没有详细的需求文档,测试人力少 (2人)。  用例编写  用例的重要性  有时候因为时间紧张,没有编写测试用例,虽然可能会在一定程度上节省时间,但是这也可能导致关键的测试点被遗漏,从而影响测试的全面性和准确性。编写测试用例能够确保系统的各个方面...
            0 0 1643
            分享
          •   一.背景介绍  继自动提交bug到jira文章之后,这时候就会有人有疑问了,我每天都在跑自动化测试(美其名曰每日构建),也每天都在自动提交bug,可能昨天提交的bug尚未解决,今天又重新提了一遍,一周下来累计的bug好几千了,怎么办?一个个去手动过滤,有木有感觉直接崩溃了?那么为了解决这个问题,今天我们就来介绍一个自动化过滤的方案及其实践。  二.测试需求分析  此方案也主要使用python/pytest实现,主要针对于jira上bug的处理,当然也可以使用过滤重复需求,重复任务等等均可以。  准备工作:  1.在处理之前,你首先需要了解部门的jira流转图(不同公司或部门都可能不一样),...
            0 0 853
            分享
          • 问题场景:执行完一个测试计划后,在察看结果树或者聚合报告里可以看到执行结果,但是如果关闭JMeter后再打开该测试计划后,却发现上次的执行结果就被清空了,那怎么办呢?解决办法:JMeter提供了生成HTML报告的功能,这样保存后我们就能看到之前的执行结果生成的报告了。当然,这个报告不仅仅能看到执行结果,还有很多的统计图表,清晰明了,非常有用。操作步骤:            1   创建一个csv格式或jtl格式的文件    ...
            0 0 4860
            分享
          •   79元的国货套餐你也可以带回家,点击链接填测试行业调查问卷,并参与分享活动!链接:http://vote.51testing.com/   最近《罗刹海市》这首歌火了,连打出租车,司机都在循环播放。  还有一个火出圈半年的ChatGPT也“火出圈”半年了,在今年3月份我被ChatGPT爆火新闻震惊到,7月份又被《罗刹海市》火爆新闻震惊到了。  一年之内被震惊到两次,2023年确实是不平凡的一年。既然这两把火这么牛,那我就不得不把做点什么了。不如,做一个小小的测验,嘿嘿......  《罗刹海市》火的时候,有很多人分析这首歌的歌词是否在影射人或事,今天我们不管歌词在影射谁,单纯用几个常见AI...
            0 0 1902
            分享
      • 51testing软件测试圈微信