HttpRunnerManager接口自动化测试—进阶应用

2021-08-09 11:28:29 浏览数 (1)

测试计划

测试套件

测试套件(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 请求类型

点击菜单栏左侧的配置管理 然后点击新增配置 或者直接顶部新增配置快捷入口,就可以创建配置。这里演示VariablesParameters配置

variable配置

如下图所示:创建公共变量com_user 值设为zxw2018 操作过程如下:

变量创建完成之后,接下来要引用这个公共变量,在用例test_get_requesttest_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——多个参数

对于同时存在多个参数列表, 则需要对其排列组合的每一种情况都执行一次,也就是笛卡尔乘积

例如有xxyy两组参数,对应的变量分别如下

代码语言:javascript复制
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_userpara_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中配置如下参数

代码语言:javascript复制
#用户名密码组合
51zxw2016,666
51zxw2018,888

在用例中进行如下配置

运行测试用例:

从运行的报告中我们可以看到,参数按照我们设定的运行。

自定义辅助函数

在一些比较特殊的接口测试过程中,有时需要做一些比较复杂的逻辑处理,比如加解密。针对这些接口我们需要编写一些辅助函数来完成测试。

案例:接口参数md5加密

测试登录接口:http://httpbin.org/post,参数除了userpasswd还需要一个sign参数 sign生成规则为用户名 密码然后进行md5加密。

在项目管理菜单栏中点击debugtalk.py 然后编辑如下代码:

代码语言:javascript复制
# 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中的setUptearDown方法,HttpRunner也支持类似于这样的方法。其中Hook功能就支持这样的操作。

  • setup_hooks: 在 HTTP 请求发送前执行 hook 函数,主要用于准备工作;也可以实现对请求的 request 内容进行预处理。
  • teardown_hooks: 在 HTTP 请求发送后执行 hook 函数,主要用于测试后的清理工作;也可以实现对响应的 response 进行修改,例如进行加解密等处理。
实践案例

设置接口请求之后如果响应状态码为200就等待0.1s 否则就按照设定的时间等待。

在 debugtalk.py 创建辅助函数sleep() 定义如下:

代码语言:javascript复制
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

代码语言:javascript复制
<!-- <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。

0 人点赞