框架的设计思路
首先要明确进行接口自动化需要的步骤,如下图所示:
然后逐步拆解需要完成的工作:
1)了解分析需求:了解接口要实现的功能
2)数据准备:根据开发文档确定接口的基本情况,知晓接口的url、请求方式、入参等信息,然后根据业务逻辑以及入参来预期接口的输出
- 需要有一个配置文件来存储接口的一些基本信息;
- 需要有一个方法能读取配置文件;
- 需要有一个excel或者yaml格式文件来存储测试数据;
- 需要有一个方法能读取测试数据;
- 需要有一个方法来把读取到的配置文件和测试数据组装成测试执行时需要的参数化数据;
如果预期结果是需要根据入参查数据库来得到的时候还需要一个能执行sql的方法
3)设计&执行测试:生成一个测试文件,可以来根据入参调用接口获得接口输出然后验证
- 根据pytest的特性可以把准备参数化的数据的工作放到conftest.py下;
- 需要有一个调用接口以及断言验证的测试文件,命名规则为xxx_test.py或者test_xxx.py;
- 为了更好的对输出和预期输出做验证准备封装一下系统自带的断言;
- 为了能更好执行测试封装一下requests模块,制定统一的输入输出标准;
- 记录执行错误信息引入日志记录模块;
4)查看结果:根据断言结果来判定接口是否满足需求框架最终的执行顺序如下图所示
框架的基本结构
然后介绍一个每个目录下都有什么,分别完成什么工作
1、这里每一个文件对应一个接口所需要的测试数据,命名规则为nameA.xlsx或者nameA.yaml(nameA泛指待测接口名称),文件里面可以存放调用接口所需的参数name、参数value、所需cookie、预期输出结果
2、assertion.py
--封装的断言方法,用于验证接口返回值和预期结果是否一致
config.py
--封装读取配置文件的方法
get_caseparams.py
--把测试数据加工成接口所需要的格式
log.py
--封装的记录日志的方法
request.py
--封装的https请求方法,主要是post和get
selectDB.py
--查询sql并把结果加工成[dic1,dic2,dic3....]这种格式,每个dic是一条数据
testcasetemplate.py
--这个是根据caseparams文件夹下的测试数据自动在testcase文件夹下生成测试文件的脚本
3、里面存放两个配置文件,base.ini存放数据库连接的配置interface.ini是所有测试接口需要的配置。
4、记录测试的日志文件,没啥可说的,log.log是当天文件,其他的是对应日期下的历史日志。
5、conftest.py固定名称的一个文件,放在被测接口脚本同一个文件夹下,此处的作用是为每个被测脚本提供参数化支持 test_XXX.py这种文件是接口的测试文件,XXX为被测接口的名称。
6、run.py ---测试执行的主入口,如果把该接口自动化测试框架放到jenkins上做持续集成的时候,可以通过配置jenkins来代替这个入口。
使用说明
当我们需要有一个接口(假定名称为abc)需要用本框架进行自动化测试的时候,操作步骤如下:
1、interface.ini文件下添加名称为abc的节点,然后在该节点下配置好接口的参数文件格式、http请求方式、接口url、接口wiki。
2、casefparams文件夹下创建名称为abc.xlsx的用例数据文件。
3、执行common文件夹下的testcasetemplate.py,执行的结果是会自动根据前两步配置的内容在casefile文件夹下生成test_abc.py的脚本文件。
4、编辑test_abc.py添加所需要的断言,来验证接口的准确性。
5、执行run.py完成测试。
测试执行详情为run.py指定要执行测试的测试文件的路径testcase目录,根据pytest的运行机制这之前会先调用testcase目录下的conftest.py,这个文件在此处的作用就是通过遍历testcase目录下以test_为开头的测试文件,然后调用读取配置文件config.py、读取并组装参数的get_caseparams.py将测试用例数据参数化传递给test_开头的测试文件,test_开头的测试文件执行的时候会把之前步骤传递过来的参数拆分,然后调用request.py发送http请求,获得接口的json格式的返回结果,然后通过以下方式对接口返回结果做验证。
1)根据产品业务逻辑知道入参的情况下很简单就能得出预期结果的时候,可以直接把预期结果放到和入参一起的excel或者yaml测试数据文件中,在执行测试的时候这些参数也会一并传递给测试文件,直接取出来和接口输出做验证即可。
2)需要查库验证的情况需要把需要把接口的入参作为sql的条件写好sql后调用selectDB.py得到查询结果再拿sql返回的结果和接口输出做验证3)还有一些复杂的场景可能会根据接口入参,根据业务逻辑自己写脚本去获得预期结果,然后和接口输出做验证。