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

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

注:以上截图自开源项目HttpRunnerManager

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

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

注:以上截图取自《Web接口开发与自动化测试――基于Python语言》书中项目pyrequest

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

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

@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,定制开发接口测试报告等。主要工作量是教会测试人员去写接口自动化代码。

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