一、安装说明
python3.6安装:参考安装教程
httprunner安装:
pip install selenium
pip install pyOpenSSL
pip install pymysql
pip install httprunner==2.0.2
运行如下命令,若正常显示版本号,则说明 HttpRunner 安装成功:
参考:
#卸载httprunner命令:
pip uninstall httprunner
二、基础概念
1、测试用例(testcase)
HttpRunner 的测试用例描述方式进行如下设计:
测试用例应该是完整且独立的,每条测试用例应该是都可以独立运行的;在 HttpRunner 中,每个 YAML/JSON 文件对应一条测试用例。
测试用例包含 测试脚本 和 测试数据 两部分:
测试用例 = 测试脚本 + 测试数据
测试脚本 重点是描述测试的业务功能逻辑,包括预置条件、测试步骤、预期结果等,并且可以结合辅助函数(debugtalk.py)实现复杂的运算逻辑;可以将 测试脚本 理解为编程语言中的 类(class);
测试数据 重点是对应测试的 业务数据逻辑,可以理解为类的实例化数据;
测试数据 和 测试脚本 分离后,就可以比较方便地实现数据驱动测试,通过对测试脚本传入一组数据,实现同一业务功能在不同数据逻辑下的测试验证。
测试步骤(teststep)
测试用例是测试步骤的 有序 集合,而对于接口测试来说,每一个测试步骤应该就对应一个 API 的请求描述。
测试用例集(testsuite)
测试用例集 是 测试用例 的 无序 集合,集合中的测试用例应该都是相互独立,不存在先后依赖关系的。
如果确实存在先后依赖关系怎么办,例如登录功能和下单功能。正确的做法应该是,在下单测试用例的前置步骤中执行登录操作。
- config:
name: order product
- test:
name: login
testcase: testcases/login.yml
- test:
name: add to cart
api: api/add_cart.yml
- test:
name: make order
api: api/make_order.yml
2、文件类型
在 HttpRunner 自动化测试项目中,主要存在如下几类文件:
YAML/JSON(必须):测试用例文件,存储接口测试相关信息
debugtalk.py(可选):存储项目中逻辑运算辅助函数
.env(可选):存储项目环境变量,通常用于存储项目敏感信息
.csv(可选):项目数据文件,用于进行数据驱动
reports:默认生成测试报告的存储文件夹
3、测试用例结构
三、快速上手
1、测试用例执行
操作
修改登录账号和密码后执行测试用例
hrun login1.yml
2、用例断言(关键字validate)
作用
判断接口返回内容的准确性;
示例
validate:
- eq: [content.code, 200]
- eq: [content.success, true]
- eq: [content.message, "SUCCESS"]
- eq: [content.data.char_pieces.29, "3"]
断言关键字
3、作用域
在测试用例内部,HttpRunner 划分了两层变量空间作用域(context)。
config:作为整个测试用例的全局配置项,作用域为整个测试用例;
test:测试步骤的变量空间(context)会继承或覆盖 config 中定义的内容;
各个测试步骤(test)的变量空间相互独立,互不影响;
如需在多个测试步骤(test)中传递参数值,则需要使用 extract 关键字,并且只能从前往后传递
操作
把请求URL地址配置成用例的全局配置项(base_url)
把 hearders的Content-Type 配置成用例的全局配置项
- config:
name: 登录功能
base_url: ****************************
parameters:
request:
headers:
Content-Type: application/x-www-form-urlencoded
4、变量(关键字variables)
定义变量
局部变量:测试步骤中定义的变量
全局变量:congfig中定义的变量
变量引用($name)
示例
- config:
name: 登录功能
variables:
name: '15920143494'
pwd: 'vvic2017'
5、测试步骤编写
通过浏览器工具(F12)或者抓包工具抓取loginUMoreInfo接口信息。
在login1.yml文件中添加获取登录用户信息(loginUMoreInfo接口)的测试步骤。
运行login1.yml文件。
6、参数传递(extract)
测试场景:
B接口需要用到A接口返回的响应内容某个参数时,需要获取到该参数值,并传递给B接口使用。
定义关键字extract的参数名称和参数值,如下所示:
extract:
- recordCount: content.page.recordCount
引用参数
$recordCount
7、hook(钩子)机制
可以在请求前和请求后调用钩子函数。
hook 机制分为两个层级:
测试用例层面(config中配置)
setup_hooks: 在整个用例开始执行前触发 hook 函数,主要用于准备工作。
teardown_hooks: 在整个用例结束执行后触发 hook 函数,主要用于测试后的清理工作。
2) 测试步骤层面(teststep中配置)
setup_hooks: 在 HTTP 请求发送前执行 hook 函数,主要用于准备工作;也可以实现对请求的 request 内容进行预处理。
teardown_hooks: 在 HTTP 请求发送后执行 hook 函数,主要用于测试后的清理工作;也可以实现对响应的 response 进行修改,例如进行加解密等处理。
编写 hook 函数
hook 函数的定义放置在项目的 debugtalk.py 中,在 YAML/JSON 中调用 hook 函数仍然是采用 ${func($a, $b)} 的形式。
def hook_print(msg):
print(msg)
对于单个测试用例层面的 hook 函数,除了可传入自定义参数外,还可以传入与当前测试用例相关的信息,包括请求的 $request 和响应的 $response,用于实现更复杂场景的灵活应用。
操作:
1、在登录接口请求前等待2秒。(函数:setup_hook_sleep_N_sec)
2、在登录接口请求后等待4秒。(函数:teardown_hook_sleep_N_secs)
debugtalk.py中setup_hook_sleep_N_secs函数:
#指定接口请求前的休眠时间
def setup_hook_sleep_N_secs(n_secs):
time.sleep(n_secs)
teardown_hook_sleep_N_secs函数
#指定接口响应后的休眠时间
def teardown_hook_sleep_N_secs(response, n_secs):
if response.status_code == 200:
time.sleep(n_secs)
else:
time.sleep(1)
8、环境变量
.env文件配置内容:
debugtalk.py内容
base_url = os.environ["base_url"] #读取环境变量
def get_base_url():
return base_url
测试用例中调用环境变量
- config:
name: 档口中心-商品数据-列表
base_url: ${get_base_url()}
9、文件目录结构管理 && 脚手架工具
推荐的方式汇总如下:
debugtalk.py 放置在项目根目录下,假设为 PRJ_ROOT_DIR
.env 放置在项目根目录下,路径为 PRJ_ROOT_DIR/.env
接口定义(API)放置在 PRJ_ROOT_DIR/api/ 目录下
测试用例(testcase)放置在 PRJ_ROOT_DIR/testcases/ 目录下
测试用例集(testsuite)文件必须放置在 PRJ_ROOT_DIR/testsuites/ 目录下
data 文件夹:存储参数化文件,或者项目依赖的文件,路径为 PRJ_ROOT_DIR/data/
reports 文件夹:存储 HTML 测试报告,生成路径为 PRJ_ROOT_DIR/reports/
10、脚本调试(log)
若需要查看到更详尽的信息,例如请求的参数和响应的详细内容,可以将日志级别设置为DEBUG,即在命令中添加--log-level debug。
hrun --log-level debug testcases/test.yml
这里提供了一个demo,给大家参考
demo已经实现了邮件通知和钉钉通知
demo
链接:https://pan.baidu.com/s/1X0JVxFnxMByeQDmPw3wW-g
提取码:irvo
testcases:测试用例
.env:配置文件(url)
config.ini:数据库配置
debugtalk.py 默认加载项(python脚本)
mysqlDB.py 数据库链接脚本
sendMail.py 邮件发送,钉钉通知脚本