测试计划
测试套件
测试套件(test suite)和我们上面讲的组合用例类似,我们可以把单个用例按照业务逻辑进行组合运行,和组合用例不同的是:测试套件可以包含组合用例,但是组合用例不能包含组合用例。测试套件是对测试用例的更高一层的封装。
实践案例
创建测试用例集suite_test_methods
包含测试用例test_get_request
和组合用例test_method_group
然后执行查看结果。
从上图中我们可以看到创建的测试套件成功执行,加载的测试套件也可以任意调整执行顺序。相关的数据配置会自动从用例的配置中读取,无需再单独配置参数。
上面我们选择的是同步执行方式,我们可以选择异步执行方式,可以在后台执行,然后生成测试报告。
在异步执行之前我们需要先启动支持异步的相关服务:
1.启动RabbitMQ Server
2.进入到HttpRunnerManager目录,启动worker
代码语言:javascript复制python manage.py celery -A HttpRunnerManager worker --loglevel=info
3.启动任务监控后台
代码语言:javascript复制celery flower
celery简介
Celery是一个异步任务队列/基于分布式消息传递的作业队列。它侧重于实时操作,但对调度支持也很好。Celery用于生产系统每天处理数以百万计的任务。Celery是用Python编写的,但该协议可以在任何语言实现。它也可以与其他语言通过webhooks实现。
执行完成之后我们可以在【报告管理】——【查看报告】中看到生成的测试报告。
扩展资料:Python 并行分布式框架 Celery
定时任务
测试套件还支持定时任务,这样方便进行回归测试。定时任务需要启动定时任务监听器,具体如下:
代码语言:javascript复制python manage.py celery beat --loglevel=info
平台界面设置步骤为:点击菜单栏左侧【测试计划】-【定时任务】 进入到【系统设置】界面,可以进行如下设置:
上面定时配置 */10 * * * *
表示每10分钟执行一次,使用的是crontab
表达式
执行结果如下图所示,可以看到是每隔10分钟执行一次。
crontab格式
通过crontab 命令,我们可以在固定的间隔时间执行指定的系统指令或 shell script脚本。时间间隔的单位可以是分钟、小时、日、月、周及以上的任意组合。
分 时 日 月 星期
- 第1列分钟0~59
- 第2列小时0~23(0表示子夜)
- 第3列日1~31
- 第4列月1~12
- 第5列星期0~7(0和7表示星期天)
crontab设置案例
每隔1分钟执行一次
代码语言:javascript复制* * * * *
每30分钟运行一次:
代码语言:javascript复制*/30 * * * *
每隔1小时执行一次
代码语言:javascript复制* */1 * * *
每周一到周五早上八点运行
代码语言:javascript复制* 8 * * 1-5
相关资料:crontab表达式
注意
如果遇到如下报错:
代码语言:javascript复制D:HttpRunnerManager>python manage.py celery beat --loglevel=info
celery beat v3.1.26.post2 (Cipater) is starting.
OSError: [WinError 87] 参数错误。
进入到HttpRunnerManager目录,然后删除celerybeat.pid
文件,重启命令即可。
配置管理
前面我们用例的各个参数都是配置在各自用例之中的,如果参数有变化则需要打开对应请求用例来修改,当用例数量较多时,这样操作会比较低效。那么该如何有效解决这个问题呢?
使用HttpRunnerManager的配置管理工具就可以比较好的解决这个问题。我们可以将一些公共的变量,参数、方法、请求头信息都存储在一个配置模块中,这样维护和使用就非常便利。
支持的配置类型包括以下几类:
Variables
变量类型Parameters
参数类型Hooks
方法类型Request
请求类型
点击菜单栏左侧的配置管理 然后点击新增配置 或者直接顶部新增配置快捷入口,就可以创建配置。这里演示Variables
和Parameters
配置
variable配置
如下图所示:创建公共变量com_user
值设为zxw2018
操作过程如下:
变量创建完成之后,接下来要引用这个公共变量,在用例test_get_request
和test_post_formdata
分别添加公共变量com_user
,
最后开始引用配置,在用例test_method_group
中引用该配置,然后运行即可。
从上图可以看出,我们设置的配置变量已经在用例生效,下次想修改变量值,只需要修改配置就可以了。
注意:
当用例1关联了配置(config)1, 用例2关联了配置(config)2 时, 现在新建一个用例3, 将用例1和用例2都组合进用例3中, 并且用例3关联配置(config)3, 此时执行用例3, 配置(config)1 和 配置(config)2 会被使用么?
答案是不会, 执行用例3时, 只有配置(config)3 会被使用. 在执行的过程中, 用例1和用例2所要引用的变量, 都只会去配置(config)3中找。
Parameters配置
对用例中的某些请求参数, 有时想要测试多种输入情况, 可以为每种情况都编写独立的用例或配置. 但是这样会比较麻烦, 另一种方式是将原来的variables
变量定义改为Parameters
参数列表来定义. 这个列表中定义需要传入的参数. 然后使用这些参数分别执行一次,也就是参数化。
案例1——单个参数设置
针对用例test_get_request
设置参数para_user
分别取值为[‘zxw2016’,'zxw2017','zxw2018']
针对这三个不同的参数来进行接口测试。
配置好之后,接下来点击用例test_get_request
然后添加参数配置,
从上图我们可以看出,用例遍历执行了我们设定的三个参数。
案例2——多个参数
对于同时存在多个参数列表, 则需要对其排列组合的每一种情况都执行一次,也就是笛卡尔乘积
例如有xx
和yy
两组参数,对应的变量分别如下
xx : [xxvalue1, xxvalue2]
yy : [yyvalue1, yyvalue2, yyvalue3]
那么最终会按以下六种情况各执行一次用例:
代码语言:javascript复制xx=xxvalue1, yy=yyvalue1
xx=xxvalue1, yy=yyvalue2
xx=xxvalue1, yy=yyvalue3
xx=xxvalue2, yy=yyvalue1
xx=xxvalue2, yy=yyvalue2
xx=xxvalue2, yy=yyvalue3
所以, 当对多个变量使用parameters参数列表时, 特别需要事先考虑清楚用例将会被循环的次数. 避免不必要的测试时间的消耗.
例如在配置表中我们再增加一个参数para_pwd
取值为['666', '888']
然后在用例中引用变量para_pwd
最后执行的结果为6次。
参数组合为:
代码语言:javascript复制zxw2016,666
zxw2016,888
zxw2017,666
zxw2017,888
zxw2018,666
zxw2018,888
配置参数的作用域
当组合用例中的单个用例引用了配置参数,那么该组合用例下所有的用例都会按照参数组合来执行对应的次数。
例如在test_method_group
中用例test_get_request
引用了配置参数,那么所有的用例都会执行6次(上面案例中para_user
和para_pwd
的笛卡尔积),总共为3*6=18次。
这样带来一个问题也就是有些没有设置参数的用例也会重复运行,这对整体运行效率会有比较大的影响,
如果只想针对指定的用例遍历设定的参数,那么需要将参数配置在用例中,而不是在公共配置模块中。
例如在用例test_get_request
配置参数para_user
取值为['zxw2016', 'zxw2017', 'zxw2018']
同时删除之前配置模块的对应的参数,以及引用的参数。
然后执行用例集test_method_group
,那么test_get_request
会根据设置的三个不同参数运行3次,其他两个接口运行1次。
键值对参数
对于参数间有对应关系的(如用户名:密码)可以按如下方式定义, 这样就避免了无效的排列组合:
代码语言:javascript复制xx-yy: [[xxvalue1,yyvaule1], [xxvalue2,yyvalue2]]
组合结果:
代码语言:javascript复制xx=xxvalue1, yy=yyvalue1
xx=xxvalue2, yy=yyvalue2
在使用多个账户/密码进行测试时, 常用这种方式.
例如在用例test_post_formdata
中配置如下参数
#用户名密码组合
51zxw2016,666
51zxw2018,888
在用例中进行如下配置
运行测试用例:
从运行的报告中我们可以看到,参数按照我们设定的运行。
自定义辅助函数
在一些比较特殊的接口测试过程中,有时需要做一些比较复杂的逻辑处理,比如加解密。针对这些接口我们需要编写一些辅助函数来完成测试。
案例:接口参数md5加密
测试登录接口:http://httpbin.org/post
,参数除了user
和passwd
还需要一个sign
参数 sign
生成规则为用户名 密码然后进行md5
加密。
在项目管理菜单栏中点击debugtalk.py
然后编辑如下代码:
# debugtalk.py
import hashlib
def getSign(user,passwd):
str=user passwd
md5=hashlib.md5()
md5.update(str.encode(encoding='utf-8'))
sign=md5.hexdigest()
return sign
上面代码代表根据用户名密码生成md5摘要信息,并返回结果。
创建用例test_getSign
配置如下:
从上面的配置可以看出,方法引用格式为:{function(para)}
运行结果如下:
从上面的报告可以看出,sign
的值参数为md5
算法生成的结果。
Hook
有些接口测试前后需要进行一些特殊的处理,比如初始化操作或者执行完成之后等待操作。相当于unittest
中的setUp
和tearDown
方法,HttpRunner也支持类似于这样的方法。其中Hook
功能就支持这样的操作。
setup_hooks
: 在 HTTP 请求发送前执行 hook 函数,主要用于准备工作;也可以实现对请求的 request 内容进行预处理。teardown_hooks
: 在 HTTP 请求发送后执行 hook 函数,主要用于测试后的清理工作;也可以实现对响应的 response 进行修改,例如进行加解密等处理。
实践案例
设置接口请求之后如果响应状态码为200
就等待0.1s
否则就按照设定的时间等待。
在 debugtalk.py 创建辅助函数sleep()
定义如下:
import time
def sleep(response,t):
if response.status_code==200:
time.sleep(0.1)
else:
time.sleep(t)
然后在用例test_get_request中进行设置{time(response,2)}即可。
任务监控
任务监控可以查看节点的状况(包括处理的队列信息等)和task的执行情况
Tips:这里需要做一个小小的修改,因为作者把地址配置按照他自己的运行环境写死了。修改方式为:打开文件D:HttpRunnerManagertemplatesbase.html
将192.168.91.45
修改为:127.0.0.1
<!-- <li><a href="http://192.168.91.45:5555/dashboard">任 务 监 控</a></li>-->
<li><a href="http://127.0.0.1:5555/dashboard">任 务 监 控</a></li>
设置好之后打开即可看到如下页面:
线上部署
当前系统是部署在本地环境,如果想部署到线上环境,那么可以参考:Django快速部署简约版 v3.0。