PHP接口自动化测试框架实现

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

我们来看一个简单的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项目不大如果是一个大型项目的话就不适合了在微服务的架构下你甚至很难理清一个接口的调用关系。

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

 总结
感谢每一个认真阅读我文章的人

 我个人整理了我这几年软件测试生涯整理的一些技术资料包含电子书简历模块各种工作模板面试宝典自学项目等。欢迎大家点击下方名片免费领取千万不要错过哦。

 文档获取方式

加入我的软件测试交流群632880530免费获取~同行大佬一起学术交流每晚都有大佬直播分享技术知识点

这份文档对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库这个仓库也陪伴我走过了最艰难的路程希望也能帮助到你

以上均可以分享只需要你搜索vx公众号程序员雨果即可免费领取

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: php