让资深测试大老来告诉你什么是接口测试,

 接口测试(一)简单的开始

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

  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):

<?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;

  json对象的键“code”,是不是等于 200,

  json对象的键“msg”,是不是等于 "请求成功",

  result对象的键“key1”,是不是等于 "value1"

  .....

  工作中接口数据会根据一定规则变化的,那么这个“规则”才是我们要测试的重点,我们看如下这个接口(demo1.php)。

  在浏览器中多次访问,我们可能会得到如下结果:

{

    "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本身有发送的意思)

接口测试(二)接口本身

在我们测试接口提供的数据,支持的业务功能之前,我们非常有必要再提一下接口本身的规则,即便我们在前面的章节已经隐隐约约的提到过。

  1. 接口文档

  如果让我给接口文档下个定义,文档是使用接口的人对于接口的约束

  口头协定(对,你没看错,这是我最经常见的)

  word/Excel/txt 文件

  api管理平台(rap2/yapi等等)

  文档应该出现且不限于以下几点内容:

  接口访问的地址

  接口参数

  必须传的参数

  非必须传的参数

  指定数据类型参数

  请求方式

  GET请求

  POST请求

  返回字段的含义

  至于为什么是上面几条,不赘述,大家可以想一哈

  2. 遵循接口文档

  对于测试人员来讲,遵循接口文档,就是按照文档进行测试。测试也可以分为两种风格:

  懒汉式

  测试人员并非在文档形成之初,就按照文档进行严格的测试,而是在业务功能基本完成之时,才介入测试。然后当发现调用出错,或者功能出错时,才去翻阅接口文档,反馈给开发修改再测试

  饿汉式

  文档一形成,测试人员就开始介入,抛开业务需求,变换参数组合,请求方式等对于接口本身进行测试,直至符合文档。后期功能完成后,再把重点放到功能层面

  3. 设计测试用例

  对于接口本身的测试用例,由于测试的主要目标是接口本身而非业务功能,所以我们只要针对接口文档中主要的几点进行编写即可:

  使用get请求访问

  使用post请求访问

  必传参数为空

  非必传参数为空

  非指定类型参数请求

  参数组合

  当然,如果我们稍微了解以下后端代码是如何实现接口的,还可以编写一些特定的测试用例,比如如果操作数据库,可以尝试传入部分sql语句,进行安全方面的测试,在这里暂不做过多的说明

  4. 举个例子

  仍然以上一篇中的getList为例子:

<?php

// 告诉浏览器返回为json类型

header('Content-Type:application/json; charset=utf-8');

// 获取参数

$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;

  使用get请求访问 =====> 成功,无异常

  使用post请求访问 =====> 失败

 

[@HymandeMBP:~]$ curl localhost/about_test/getList.php -X POST -d 'page=4&size=2'

<br />

<b>Notice</b>:  Undefined index: page in <b>/Library/WebServer/Documents/about_test/getList.php</b> on line <b>8</b><br />

<br />

<b>Notice</b>:  Undefined index: size in <b>/Library/WebServer/Documents/about_test/getList.php</b> on line <b>9</b><br />

<br />

<b>Notice</b>:  Undefined variable: temp in <b>/Library/WebServer/Documents/about_test/getList.php</b> on line <b>40</b><br />

{"code":200,"msg":"请求成功","result":null}

  因为这个接口接受的请求方式是GET,没有处理请求方式是POST的情况,其他测试与此类似

  下一篇,我们主要介绍关于业务功能的测试,从一个更加的真实的需求出发,说一下考法测试流程

接口测试(三) 业务功能测试

1. 需求分析

  我们先给一份产品需求如下:

  点击“我喜欢”按钮,调起一个弹窗,展示我喜欢的明星列表

  明星排列顺序按照添加时间倒序排列

  可分页展示,向上划动,可展示下一页内容,每页最多展示2条内容

  我们逐条分析一下,这几条都分别是由哪些开发同学负责:

  肉眼可见的按钮一定是由前端或者客户端来完成,不是我们测试重点

  倒序排列,前后端均可完成,但一般是由后端处理完成后,交给前端客户端展示,这是接口测试的重点

  前后端均可完成。但如果是由前端完成,那么后端需要把所有数据一次性给到前端,我们想一下如果数据量巨大,那么对于后端来说是个灾难,所以最经济的做法是,由后端查出指定页面内容返回,这也是测试重点

  分析过后,我们有了一个基本想法如下:

  我需要一个接口来提供数据

  该接口有2个参数,一个是指定的页码,一个是每页展示的数据条数

  每个页面上,信息是按照添加时间倒序排列,最新的在最上面

  2. 接口测试

  给定接口文档如下:

  url: http://127.0.0.1/about_test/getList.php

  method: GET

  params:

  page 整数类型

  size 整数类型

  返回结果模版

{

    "code": 200,   // 200成功,400,错误

    "msg": "请求成功", 

    "result": [

        {

            "id": 3, 

            "name": "周星驰",

            "create_time":1587783346000,   //创建记录的时间

        },

        {

            "id": 4,

            "name": "李连杰",

            "create_time":1587783345000   //创建记录的时间

        }

    ]

}

  设计用例(功能):

  是否按照创建时间倒序排列

  是否返回指定的条数

  执行测试用例

  GET 请求:http://127.0.0.1/about_test/getList.php?page=2&size=2

  返回结果:

{

    "code": 200,

    "msg": "请求成功",

    "result": [

        {

            "id": 3,

            "name": "周星驰"

        },

        {

            "id": 4,

            "name": "李连杰"

        }

    ]

}

  从返回结果,我们可以看到,缺少创建时间字段;没有按照时间排序,需要协调后端开发进行修改

  大家可能发现,这和我们进行简单的“点点点”测试,没有什么区别,因为如果接口缺少字段,或者没有排序,我们一样可以通过UI一眼就看出来,那么接口测试还有什么意义呢?

  我们需要一个更好的工具进行测试,我们需要一个更早的时间点开始发现问题!这个时候我们的postman就派上了用场

  2. 总结

  分析产品需求,提炼出需要进行接口测试的点

  设计测试用例,执行用例协调开发修改

好了  这次就学习到这了哦! 

还想学习的话,记得收藏及关注哦


感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

① 2000多本软件测试电子书(主流和经典的书籍应该都有了)

② 软件测试/自动化测试标准库资料(最全中文版)

③ 项目源码(四五十个有趣且经典的练手项目及源码)

④ Python编程语言、API接口自动化测试、web自动化测试、App自动化测试(适合小白学习)


————————————————

⑤ Python学习路线图(告别不入流的学习) 

 在我的QQ技术交流群里(技术交流和资源共享,广告进来腿给你打断)

可以自助拿走,群号768747503备注(csdn999)群里的免费资料都是笔者十多年测试生涯的精华。还有同行大神一起交流技术哦。
————————————————

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值