在上一份工作中,我有一部分工作是在维护一套接口自动化测试,这一篇文章,我来介绍这套接口自动化框架的设计思路。

我们来看一个简单的PHP实现的超简单的接口。

...

//报名验证
private function apply_verify() {
$raid = $this->input->get_post('raid');
$mid = $this->input->get_post('mid'); if (!$raid || !$mid) {
$this->ret_json(10021, '参数错误');
} $this->load->model('enlist_model');
$result = $this->enlist_model->get_enlist_by_raid_mid($raid, $mid, true);
if (!empty($result)) {
$this->ret_json(10101, '你已经报过名');
}
}

说明:

  • 首先,它是一个POST接口。它需要两个参数:raid 和 mid。
  • 然后,判断raid 和 mid 是否为空,为空返回:参数错误。
  • 最后,调用 enlist_model 模型,通过 get_enlist_by_raid_mid方法查询是否为空,如果不为空返回:你已经报过名了。

接下来要做的事情不是写用例,而是构造一条已经报名的数据。

创建 xx_enlist_test_data.php 文件

array(
'table_name'=>'xx_enlist',
'data'=>array(
array('eid'=>1,'raid'=>99,'mid'=>150,'phone'=>'01234567890'),
)
)

当自动化在执行之前,会先到数据库的 xx_enlist 表插入这条数据,为什么要初始化数据?当然是为了保证接口测试用例的稳定性。比如,我在调用接口时,传入 raid=99, mid=150。如果数据库是表空的?那么,用例肯定失败了!如何保证这条用每次运行 100% 成功呢?当然是每次执行之前再对应的表中初始化这么一条数据了!

定义的数据怎么插入到数据库中,当然是有一层解析的,将上面的数据库转成一条SQL语句执行。上面的数据当然比原生的一条插入SQL语句好写。

最后,才是开始写用例。创建interface_enlist_test.php测试文件。

class Interface_enlist_test extends InterfaceTestCase
{
//初始化数据
public function db_fixtures()
{
return array(
array(
'data_file' => 'xx_enlist_test_data.php',
'truncate' => true
),
);
} /*
* 报名验证
* raid不传
*/
public function test_post_enlist_raid_null()
{
$result = $this -> request('enlist/apply_verify',array(),array('mid'=>150));
$this->assertEquals($result['status'],'10021');
$this->assertEquals($result['message'],"参数错误");
} /*
* 报名验证
* mid不传
*/
public function test_post_enlist_mid_null()
{
$result = $this -> request('enlist/apply_verify',array(),array('raid'=>99));
$this->assertEquals($result['status'],'10021');
$this->assertEquals($result['message'],"参数错误");
} /*
* 报名验证
* 用户已报名
*/
public function test_post_enlist_verify_success()
{
$result = $this -> request('enlist/apply_verify',array(),array('raid'=>99, 'mid'=>150));
$this->assertEquals($result['status'],'10101');
$this->assertEquals($result['message'],"你已经报过名");
}
}

这里的用例我就做过多解释了。调用接口写断言。

答疑环节

我知道你们大概会有哪些疑问,接下来,我将试着解答这些疑问。

1、我怎么知道接口调用了哪些表?

首先你要懂PHP编程,然后熟悉Web开发框架,申请代码查看权限,阅读接口处理逻辑,自然就知道接口调用哪些表。

2、看不懂开发代码怎么办?

学呗!我当年也不是一下子就看懂PHP代码的,前后也学了两三个月。

3、往数据库里面插入测试数据,有重复的怎么办?

我们当时的设计是,框架在运行时会自动化的修改被测试的接口项目将数据库指到我本地,也就是说我本地有一个跟测试环境一模一样的数据库,每次在插入数据之前先清空表。

要保证本地数据库的表结构和测试环境是一样的。这其实也不难,开发如果改到表会上传SQL脚本,我只需要在本地数据库执行一下就行了。

4、这样做接口测试有什么好处?

  • 首先,接口用例超级稳定,稳定是自动化测试的 大敌 ,做过自动化的同学知道我在说什么。在保证数据的基础上,如果用例失败了, 100% 是接口逻辑被改动到了。
  • 不依赖接口文档,有几个公司的接口文档是非常详细,且及时维护的?我这种方式不需要接口文档。
  • 不 盲测,盲测就是把接口的参数,每个类型试一遍,然后再排列组合,如果你不知道接口要调用哪个表的哪个字段来判断条件,那么这种盲测依然覆盖不到接口的所有处理逻辑。
  • 当然更装X(玩笑~!),实际情况是你测试接口的水平即全面又深入,比只会用 postman 盲测的同学厉害多了。
  • 反向促进接口代码质量,因为的接口用例编写是基于阅读接口代码的,有一个新来的PHP开发被我叫到面前几次,并直接指出对方的代码逻辑错误之后(分分钟教他怎么做开发,哈哈!),它的接口提测质量一下子提高了许多。

5、这样做接口测试的缺点是什么?

  • 不适合所有团队,不是每个测试都懂开发代码的,比如,我们现在的接口用GO,如果我现在想达到无障碍阅读GO接口代码,也需要较高的学习成本。
  • 不适合大型项目,我之前之所以可在这么玩,主要也是因为PHP项目不大,如果是一个大型项目的话就不适合了,在微服务的架构下,你甚至很难理清一个接口的调用关系。

不过,我仍然认为这是一个优秀的接口测试工程师应该努力的方法。接口测试平台解决的只是测试效率问题,如何把一个接口测好?当然是理解好需求,并有能力阅读接口处理逻辑,设计出有效和全面的接口用例。

其实,这篇文章所传达的思想,我在《Web接口开发与自动化测试--基于Python语言》一书都有介绍,只是换了个语言和框架而已。

PHP接口自动化测试框架实现的更多相关文章

  1. 接口测试入门(4)--接口自动化测试框架 / list和map用法 / 随机选取新闻 (随机数生成) / 接口相关id映射

    一.接口自动化测试框架 为了更好的组织测试方法,测试用例并且持续集成,我们选择了  java+testNG(测试用例组织)+gitlab(代码版本管理)+Jenkins(持续集成工具) 作为一整套的自 ...

  2. python版接口自动化测试框架源码完整版(requests + unittest)

    python版接口自动化测试框架:https://gitee.com/UncleYong/my_rf [框架目录结构介绍] bin: 可执行文件,程序入口 conf: 配置文件 core: 核心文件 ...

  3. 接口自动化 [授客]基于python+Testlink+Jenkins实现的接口自动化测试框架V3.0

    基于python+Testlink+Jenkins实现的接口自动化测试框架V3.0   by:授客 QQ:1033553122     博客:http://blog.sina.com.cn/ishou ...

  4. 接口自动化 基于python+Testlink+Jenkins实现的接口自动化测试框架[V2.0改进版]

    基于python+Testlink+Jenkins实现的接口自动化测试框架[V2.0改进版]   by:授客 QQ:1033553122 由于篇幅问题,,暂且采用网盘分享的形式: 下载地址: [授客] ...

  5. 基于python+Testlink+Jenkins实现的接口自动化测试框架V3.0

    基于python+Testlink+Jenkins实现的接口自动化测试框架V3.0 目录 1. 开发环境2. 主要功能逻辑介绍3. 框架功能简介 4. 数据库的创建 5. 框架模块详细介绍6. Tes ...

  6. 【转】robot framework + python实现http接口自动化测试框架

    前言 下周即将展开一个http接口测试的需求,刚刚完成的java类接口测试工作中,由于之前犯懒,没有提前搭建好自动化回归测试框架,以至于后期rd每修改一个bug,经常导致之前没有问题的case又产生了 ...

  7. 【python3+request】python3+requests接口自动化测试框架实例详解教程

    转自:https://my.oschina.net/u/3041656/blog/820023 [python3+request]python3+requests接口自动化测试框架实例详解教程 前段时 ...

  8. 接口自动化 基于python实现的http+json协议接口自动化测试框架源码(实用改进版)

    基于python实现的http+json协议接口自动化测试框架(实用改进版)   by:授客 QQ:1033553122 欢迎加入软件性能测试交流QQ群:7156436     目录 1.      ...

  9. Python 基于python实现的http接口自动化测试框架(含源码)

    基于python实现的http+json协议接口自动化测试框架(含源码) by:授客 QQ:1033553122      欢迎加入软件性能测试交流 QQ群:7156436  由于篇幅问题,采用百度网 ...

  10. robot framework + python实现http接口自动化测试框架

    https://www.jianshu.com/p/6d1e8cb90e7d 前言 下周即将展开一个http接口测试的需求,刚刚完成的java类接口测试工作中,由于之前犯懒,没有提前搭建好自动化回归测 ...

随机推荐

  1. 【重学Git】基础命令篇

    1.git commit :在提交树中增加一个提交节点,注意:分支是指向提交节点的. 2.git branch newImage : 表示创建一个名为newImage的分支. 3.git checko ...

  2. 关于mybtis 使用过程中发生There is no getter for property named 'id' in class 'java.lang.String' 错误

    今天在修改一个关于mybtis语句时,偶然发现的一个错误  There is no getter for property named 'id' in class 'java.lang.String' ...

  3. Kafka与RabbitMQ对比

    Infi-chu: http://www.cnblogs.com/Infi-chu/ Kafka是LinkedIn在2012年发布的开源的消息发布订阅系统,他主要用于处理活跃的流式数据.大数据量的数据 ...

  4. presentViewController底部弹框适配ipad

    //适配ipad if ([alert respondsToSelector:@selector(popoverPresentationController)]) { alert.popoverPre ...

  5. 对Android 8.0以上版本通知点击无效的一次分析

    版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/178 对Android 8.0以上版本通知点击无效的一次分 ...

  6. java8-13-默认方法 静态方法 重复注解 类型注解

    java8增加默认方法 静态方法   重复注解 类型注解   1.默认方法 default修饰   为什么要有这个特性? 当修改接口时候,需要修改全部实现该接口的类.为了解决这个问题,所以引进默认方法 ...

  7. macOS 10.15 开启 HiDPI

    普通的显示,接上 MacBook 发现原生的分辨率设置在 2K 显示器上字体很小,换成 1080P 分辨率显示效果又特别模糊.下面介绍MacBook强行开启 HiDPI. 什么是 HiDPI 它使用横 ...

  8. Day14 - Python基础14 事件驱动模型、IO模型

    本节内容: 1:事件驱动模型 2:IO模型前戏准备 3:4种IO模型 1:事件驱动模型 传统的编程是如下线性模式的: 开始--->代码块A--->代码块B--->代码块C---> ...

  9. NOI Linux vim配置文件

    set nu " set mu set ruler color torte set tabstop=4 set shiftwidth=4 set autoindent set cindent ...

  10. Spring 中AOP及前后置增强案例

    1.AOP面向切面编程 面向切面编程的本质:面向切面编程,指扩展功能不修改源代码,将功能代码从业务逻辑代码中分离出来.  1主要功能:日志记录,性能统计,安全控制,事务处理,异常处理等等.  2主要意 ...