HttpRunner
1. 引入
接口测试有哪些方法?
1) 依靠工具:
postman, Jmeter,SoupUi
2) 使用代码创建接口请求
- 语言: Java Python
- 用例数据存储在哪里? – Excel
- 使用框架:unnittest框架+ 结合ddt数据驱动
- 日志器、配置文件、PyMysql、requests
- 参数化: 结合正则
- 接口依赖: 动态创建类属性的方式来处理
- 测试报告
- Jekins实现持续继承
- HttpRunner, 将上述所有优秀的框架进行了完美的封装,几乎可以0代码,高效率进行自动化测试
json/yaml格式的形式来表现
2. 安装
pip install httprunner
3. 创建项目(cmd创建)
hrun --startproject http_learn / httprunnnrt startproject http_learn
创建的项目目录:
1) api : 存放接口的地方 最小单元 — 一般是正向用例
name: 接口名称 (可以加“”)
variables: 变量 (在本yml文件调用,直接: $变量名)
var1: value1
var2: value2
request: 请求参数
url: 请求地址
method: 请求方法:GET/POST/PUT/UPDATE
headers : 请求头
Content-Type: “application/json”
json:
key: $var2
validate: 断言
-eq:[“status_code”,200] # 简写
- {check: “status_code”,comparator:“eq”,expect:200} # 最原始写法
断言类别可以在: Lib/site-packages/httprunner/builtin/comparators.py 查看
extract :
# 提取参数
- uname: content.username
2) reports: 存放报告
3) testcases: 接口依赖的工作
4) testsuites: 存放测试套件–测试用例
5) .env : 存放全局变量数据 (在yml使用变量,格式: ${ENV(变量名)}
定义时: 变量名= 值
调用变量时,格式: ${ENV(变量名)}
6) .gitignore
7) debugtalk.py
用例运行: hrun 用例路径/用例文件路径
如果想要查看更详细log信息: hrun 用例路径/用例文件路径 --log-level debug
3. 命令行操作演练
1) 基本操作
2) 常见&引用环境变量
- 当前yaml文件variable中定义的变量的引用: $变量命
- .env 中的变量,yml中引用需: ${ENV(变量名)}
3)调用函数、base_url,添加validate
validate 断言类别:Lib/site-packages/httprunner/builtin/comparators.py 查看
base_url 在testcase 或者testsuite yml文件中config中定义
4) testsuites中实现数据驱动
api/login_api.yml内容如下:
name: login
variables:
username: lujier
# yml读取会自动转型,所以如果是字符串,但里边内容全数字,加""区别
password: "123456"
base_url: ${ENV(URL)}
status_code: 200
request:
url: $base_url/user/login/
method: POST
headers:
User-Agent : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.162 Safari/537.36"
# 1. json格式传参
Content-Type: "application/json"
json:
# application/json传参,则json,如果是表单就是data,如果是文件,就是file
username: $username
password: $password
validate:
# 可用的响应属性 ok url status_code reason cookies encoding headers content_type body json
- eq: ["status_code", $status_code]
testcases/login_testcase.yml内容如下:
config:
name: "登录测试"
variables:
title: "登录"
status_code: 200
contain_msg: "user"
base_url: ${ENV(URL)}
teststeps:
-
name: $title
# 继承api目录下的登录接口,会与本区域定义的variables、validate合并覆盖(如本区域定义,则覆盖,负责继承)
api: api/login_api.yml
validate:
# - eq: ["status_code", 200]
- {check: "status_code",comparator: "greater_than_or_equals",expect: $status_code}
- {check: "content",comparator: "contains",expect: $contain_msg}
用例批量運行(testsuites/login_testsuite)
第一種:多个参数具有关联性的参数需要将其定义在一起,采用短横线(-)连接
config:
name: "登录接口测试数据驱动"
variables:
device_sn: "XYZ"
base_url: ${ENV(URL)}
testcases:
-
name: "登录接口"
testcase: testcases/login_testcase.yml
# 可以使用parameter下实现数据驱动
parameters:
# 方式一:
# 2. 多个参数具有关联性的参数需要将其定义在一起,采用短横线(-)连接
- title-username-password-status_code-contain_msg:
- ["正常登录", "lujier","123456",200,"token"]
- ["密码错误","lujier","1234567",400,"non_field_errors"]
- ["账号错误", "LujierLujier","123456",400,"non_field_errors"]
- ["用户名为空", "","123456",400,"username"]
- ["密码为空", "lujier","",400,"password"]
第二種: csv管理用例數據
csv 内容如下(新建data目錄,並新建csv文件):
title,username,password,status_code,contain_msg
正常登录, lujier,123456,200,token
密码错误,lujier,1234567,400,non_field_errors
账号错误, LujierLujier,123456,400,non_field_errors
用户名为空, ,123456,400,username
密码为空, lujier,,400,password
testsuite.yml内容如下:
config:
name: "登录接口测试数据驱动"
variables:
device_sn: "XYZ"
base_url: ${ENV(URL)}
testcases:
-
name: "登录接口"
testcase: testcases/login_testcase.yml
# 可以使用parameter下实现数据驱动
parameters:
# 方式二
# 使用csv文件來保存測試數據,引用格式: ${P(csv文件路徑)}
- title-username-password-status_code-contain_msg: ${P(datas/login.csv)}
第三種: 參數返回嵌套字典的列表
debugtalk.py定義函數如下:
def login():
login_tests_data = [
{"title":"正常登录", "username":"lujier","password":"123456",
"status_code": 200, "contain_msg":"token"},
{"title": "密码错误", "username": "lujier", "password": "1234567",
"status_code": 400, "contain_msg":"non_field_errors"},
{"title": "账号错误", "username": "lujier0001", "password": "123456",
"status_code": 400, "contain_msg":"non_field_errors"},
{"title": "用户名为空", "username": "", "password": "123456",
"status_code": 400, "contain_msg":"username"},
{"title": "密码为空", "username": "lujier", "password": "",
"status_code": 400, "contain_msg":"password"}
]
return login_tests_data
testsuite.yml内容如下:
config:
name: "登录接口测试数据驱动"
variables:
device_sn: "XYZ"
base_url: ${ENV(URL)}
testcases:
-
name: "登录接口"
testcase: testcases/login_testcase.yml
# 可以使用parameter下实现数据驱动
parameters:
# 方式三
# 使用函數動態生成字典
# 函數需要返回嵌套字典的列表
- title-username-password-status_code-contain_msg: ${login()}