# 接口自动化测试？平台VS框架




这几天准备接手一些接口的测试开发工作？在技术方案的选型上碰到了一些困惑，拿来和大家探讨。

在我来新公司之前，团队已经开发出来了相对成熟的接口平台。

![](http://img.testclass.net/tc_if_platform.png)

注：以上截图自开源项目[HttpRunnerManager](https://github.com/HttpRunner/HttpRunnerManager) 。

我们公司的平台要更加完善，可以自定义测试前置，测试后置，添加断言，自定义运行套件，执行SQL语句，定时任务，以及自动发邮件等。最主要的是不用写接口测试代码。

我在上一家公司是基于单元测试框架写接口自动化测试的。

![](http://img.testclass.net/tc_if_framework.png)

注：以上截图取自《[Web接口开发与自动化测试――基于Python语言](https://item.jd.com/12164814.html)》书中项目[pyrequest](https://github.com/defnngj/pyrequest/) 。

真正的项目要复杂得多，单元测试框架本身就帮我们做了很多事情，集成的参数化插件，极大的减少了用例的编写。可以方便的连接数数据库，初始化数据。同样可以实现HTML测试报告，自动发邮件，结合持续集成做定时任务。

以下为某抽奖接口的10条测试用例：

```Python
@parameterized.expand([
    ("all_null", '', '', 10021, '无效ID'),
    ("lid_mid_error", 'a', 'b', 10021, '无效ID'),
    ("mid_error", 1, 90132, 10609, '会员不存在'),
    ("lid_error", 901, 132, 10601, '活动不存在'),
    ("activity_not_open", 5, 132, 10604, '活动未启用'),
    ("activity_not_start", 2, 132, 10605, '活动未开始'),
    ("activity_has_ended", 3, 132, 10606, '活动已结束'),
    ("not_participate_in_activity", 11, 140, 10612, '用户没有加入活动'),
    ("have_been_exhausted", 11, 132, 10613, '您的抽奖次数已用完!'),
    ("is_prisoner", 11, 41, 200, "您没有中奖")
])
def test_random(self, name, lid, mid, status, message):
    """ 随机抽奖接口失败用例 """
    self.result = MACRequests().get(self.url, {'lid': lid, 'mid': mid})
    self.assertEqual(self.result['status'], status)
    self.assertEqual(self.result['message'], message)

```
前面展示的各自的优势和特点。接下来说说各个的缺点。

__测试平台的缺点：__

添加用例过程有点麻烦。对于一个熟练的测试开发来说，写代码的速度是高于在是高于在Web页面上点点点的。而且平台功能没有写代码灵活。

__接口框架的缺点：__

必须要会写代码。接口测试用例是通过代码完成的，所以要求必须会写代码。框架看不去也没有平台高大上。



其实，接口测试的难点并不在测试的编写上，而在数据的初始化上。假设有一个用户签到接口，第一次调用返回“签到成功”，第二次调用“已签到”；那我们在跑接口之前是不是要先修改数据状态为“未签到”。怎么构造数据就需要你对业务和表结构非常熟悉。脱离了这一个前提条件，不管是用平台还是框架你都写不出接口用例。如果想把用例设计更加全面可能还需要阅读接口代码的处理逻辑。



__作为测试开发怎么考虑？__

如果做成接口平台，那么需要测试开发具备Web开发能力，主要工作是开发和维护接口平台。只需要教会测试人员使用平台创建接口用例即可。

如果做成框架，开发工作量要小很多，只需要简单封装一些接口API，定制开发接口测试报告等。主要工作量是教会测试人员去写接口自动化代码。

作为测试开发，我倾向于平台化，教会徒弟饿死师傅。而且平台也更好衡量测试开发工作。你们觉得呢？




原始封面

![课程图片](https://images.unsplash.com/uploads/1412026095116d2b0c90e/3bf33993?w=300)


