前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >HttpRunnerManager接口自动化测试—进阶应用

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

作者头像
清风穆云
发布2021-08-09 11:28:29
7170
发布2021-08-09 11:28:29
举报
文章被收录于专栏:QA一隅

测试计划

测试套件

测试套件(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:\HttpRunnerManager\templates\base.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。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 QA一隅 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 测试计划
    • 测试套件
      • 定时任务
        • 注意
        • 配置管理
          • variable配置
            • Parameters配置
            • 自定义辅助函数
              • Hook
                • 实践案例
              • 任务监控
                • 线上部署
                相关产品与服务
                项目管理
                CODING 项目管理(CODING Project Management,CODING-PM)工具包含迭代管理、需求管理、任务管理、缺陷管理、文件/wiki 等功能,适用于研发团队进行项目管理或敏捷开发实践。结合敏捷研发理念,帮助您对产品进行迭代规划,让每个迭代中的需求、任务、缺陷无障碍沟通流转, 让项目开发过程风险可控,达到可持续性快速迭代。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档