接口测试 从 CSV 文件读取测试用例,实现接口自动化测试

紫Qi · 2018年01月02日 · 最后由 紫Qi 回复于 2019年10月13日 · 3471 次阅读

前言

随着项目对外输出的接口日渐增多,接口测试逐渐提上日程。经过一段时间的学习和摸索后,总结了一下。

方案

对于一些比较简单的接口,我们希望可以通过 csv 文件进行编辑和整理用例,对于一些复杂的接口可以通过自定义脚本的方式去实现,在执行完成后,以邮件的形式发送给相关同学。

为什么用 CSV 文件呢? 接口测试大多数测试用例会比较相似,对类似的接口进行反复相同的校验。针对这种简单的情况,我们希望把测试用例与测试脚本分开。如果重复用数据去请求和重写,是对测试资源的一种浪费,而 CSV 文件可以直接用 EXCEL 进行编辑,读取也非常方便,因此选作我们测试的用例集合。

如何参与测试?

1、对于简单的接口,我们直接用 excel 对 csv 文件进行编辑。

在选择添加的时候,可以填写当前请求的请求头和请求数据(部分举例)。

2、对于一些复杂的接口,我们可以自定义脚本。

支持自定义脚本的好处是,我们既可以单独运行自定义测试脚本,也可以将自定义的文件纳入全部测试用例中,作为回归测试一起执行。

开发流程

测试用例准备——执行测试用例、生成质量报告——自动发送邮件

1、测试用例准备

测试用例包括两部分,自定义测试脚本中的测试用例和 CSV 文件中自动读取的测试用例。

Unittest 是 Python 自带的单元测试框架,默认有 TestCase、TestResult、TestRunner 等方法,非常方便。自定义接口测试的脚本类通过继承 Unittest,编写并验证一些较复杂的接口。

为兼容自定义接口用例与文件读取的接口用例类型,从文件中读取的接口用例也需继承 Unittest 类。主要的实现思路是从指定 CSV 文件里面中读取数据,每读取一行,便通过自定义工场类 TestFactory 创建一个继承于 Unittest 的 AutoTest 的类。

AutoTest 类当中,通过 unittest 默认的 setUP() 方法对每个参数进行初始化、judge_rule() 方法对每行输入的数据进行重新处理(关于接口 md5 加密、urlencode、时间戳等)、test 函数对接口进行简单的验证。

#每读取一行,变加入TestSuit里一个已test为名的用例

test_case =self.testf.create_test(row)

self.test_suit.addTests(map(test_case, ["test"]))

#通过unittest方法获取到自定义以_test为后缀名的用例

self.get_auto_test_suit = unittest.defaultTestLoader.discover("../basepages/",pattern='*_test.py')

#将两部分用例 通过addTests方法合并在一起,就是全部的接口测试用例

2、执行测试用例、生成质量报告

引入了 BSTestRunner,对其进行修改和编辑后,生成测试报告。BSTestRunner 也是通过重写 Unittest 的 TestResult 方法,对执行的结果进行展示。

在生成质量报告中,BSTestRunner 生成全部用例的执行结果报告。面对这个情况,我们希望可生成两份报告,一份仅记录执行失败的用例报告,另一份为原生的全部用例执行结果报告。所以在 BSTestRunner 的基础上稍微进行了些改进,让其生成两份报告。

#自动化测试报告

fp =open('../doc/my_report.html','wb')

#仅错误版测试报告

fpe =open('../doc/my_report_email_text.html','wb')

runner = BSTestRunner.BSTestRunner(

stream=fp,

stream2= fpe,

title='接口测试自动质量报告',

description='如需接口测试完整报告'

)

这里简单给大家介绍下 BSTestRunner 这个引入的开源测试框架。

BSTestRunner 继承于 Template_mixin 类,通过调用 sortResult 方法,将用例传给_TestResult 类,获取到执行结果,用 getReportAttribute() 方法,将结果在 html 中展示出来。

了解这个开发测试框架后,我们对其改动就会很方便,这里我们重新定义了一个 getReport()方法,仅将错误的执行结果在另一个 html 中保存。

3、发送测试报告邮件

使用 python 的 smtpserver 进行发送邮件,默认发送的邮件需要到具体邮箱里设置授权,这里注意 password 是授权码,不是邮箱的密码。

简洁版的执行结果 my_report_email_text.html 作为邮件内容 HTML 模板,全部执行结果 my_report.html 作为邮件附件。

发送邮件后,就可以收到具体的测试质量报告啦!

BSTestRunner Github 地址:
https://github.com/easonhan007/HTMLTestRunner

共收到 9 条回复 时间 点赞

我有个问题请教,最近做的接口测试是读取 excel 写的用例的,读取的时候是按照行列读取的,一共接近 100 个接口,几百条测试用例,即使按照模块分了几张表,但是一旦中间添加了用例,后面的行顺序就都变了,改起来麻烦

ASFKJHKJ 回复

如果有执行顺序依赖的用例,可以在 excel 里增加一列用于存储 执行优先级。读取后,对用例集进行重新排序,再通过 unittest.testsuite().addTests() 方法的按照指定的顺序进行添加。

紫Qi 回复

好的谢谢,我研究研究,之前一直习惯用 discover 方法批量执行的,只能通过用例的命名来调整顺序

BSTestRunner 是一个读取测试用例的工具还是生成美观的测试报告的工具呢

是根据用例结果生成报告的第三方工具

你好,想问一下 create_test()怎么实现的?

想问下 mac 电脑,如何导入 BSTestRunner.py 文件

aohu 回复

def create_test(self1, WMInterfaceData):
class AutoTest(unittest.TestCase):
....
return AutoTest
直接返回了这个类

LiuYanni 回复

导入是什么意思,你直接看 那篇文章的 readme 就好了

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册