# HttpRunnerFrame
**Repository Path**: huanannan/HttpRunnerFrame
## Basic Information
- **Project Name**: HttpRunnerFrame
- **Description**: httprunner框架实例
- **Primary Language**: Python
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 1
- **Created**: 2021-08-16
- **Last Updated**: 2021-10-31
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# HttpRunnerFrame
此项目是我第一次接触httprunner框架,主要用以学习自动化框架简单的搭建,初识分层模式、热加载以及数据驱动。
### 一、Httprunner
* 面向http协议的通用测试框架
* 只需要维护yml/json/py文件就能实现自动化测试,性能测试(本文不涉及),线上监控以及持续集成
### 二、 设计理念
* 充分利用开源项目,降低框架的开发成本以及学习成本
* 遵循约定大于临时配置的准则
* 通过配置文件组织测试用例
### 三、 环境以及安装
* 需要安装python
* 安装httprunner插件
* pip install httprunner
* 通过 hrun -V 验证
* 安装allure
* [官网下载allure:https://github.com/allure-framework/allure2/releases](https://github.com/allure-framework/allure2/releases)
* 下载后解压到非中文目录
* 把bin路径配置到系统变量path中: E:\allure-2.13.7\bin
* 安装allure报告:pip install alluer-pytest
* 验证:allure --version
### 四、 框架接口说明
**httprunner startproject 项目名 ,使用该命令创建基础架构**
* api —— 测试接口层,用于存放yaml文件 【接口定义层】
* data —— 数据驱动,主要存放csv数据文件
* har —— 存放抓包工具导出的har文件
* reports —— 存放html或者allure测试报告
* testcase —— 存放测试用例 【测试用例层】
* testsuites —— 存放测试套件 【测试套件层】
* .env —— 存放环境变量,在api接口定义层里面使用:${ENV(变量名)}获取环境变
* all.py —— 执行文件,定义执行范围以及测试报告
* debugtalk.py —— 实现热加载的py文件,可以写随机数等方法,在yml文件中通过${方法名}调用
注意:
1. testcases调用api层(使用api关键字),testsuites调用testcases层。(使用testcase关键字)
2. 一个接口对应一个yaml文件,一个yaml文件对应一个csv文件
3. 每个yaml文件执行都会自动生成pytest文件
### 五、YAML文件结构说明
```yaml
config: # 配置
name: 获取标签接口 # 用例名称
variables: # 全局变量
access_token: $access_token # 多个变量回车往下增加
verify: false # 是否开启https验证
base_url: ${ENV(huanjing)} # 环境变量
teststeps: # 步骤
- name: 获取标签 # 步骤名称
request: # 请求
headers: # 请求头
Accept: '*/*'
Accept-Encoding: gzip, deflate, br
Cache-Control: no-cache
Connection: keep-alive
Host: api.weixin.qq.com
Postman-Token: 93ebbeef-823a-49d2-b4a3-66dbb5d6dd81
User-Agent: PostmanRuntime/7.28.0
method: GET # 请求方式
params: # 参数 也可以是data/json
access_token: $access_token # 参数
url: /cgi-bin/tags/get # 请求地址
extract: # json提取器 通过body或者content提取
access_token: body.access_token # 提取响应中的access_token的值放到access_token中
validate: # 断言
- eq: # 相等
- status_code # 需要判断的参数
- 200 # 值
- equals: # 相等
- headers.Content-Type
- application/json; encoding=utf-8
- str_eq: # 相等(str(a)==str(b))
- body.access_token
- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # 字符串
- contains: # 包含 只能判断一级目录的key,嵌套和和值都无法判断
- body
- access_token
```
### 六、接口关联
* 在接口定义层 使用extract关键字提取
```yaml
extract:
access_token: body.access_token
```
* 其他接口调用需要在全局变量中获取后,再使用
```yaml
variables: # 全局变量
access_token: $access_token # 多个变量回车往下增加
```
```yaml
params:
access_token: $access_token
```
### 七、 动态参数
* 通过debugtalk.py的热加载的方式实现
* 第一步:创建一个debugtalk.py文件,然后再里面写一个函数。
* 第二步:在yaml文件中通过${函数名()}的方式调用。
```python
# 获取一个指定范围的随机数
def get_random_number(min, max):
return random.randint(min, max)
```
```yaml
variables:
access_token: $access_token
name: 李明${get_random_number(1000, 10000)}
```
### 八、数据驱动
* **使用parameters定义数据源。应用于测试用例层**
* 直接在脚本里面指定参数列表,最简单。适合于参数比较少的情况
```yaml
config:
name: 测试用例
parameters:
appid‐grant_type‐secret‐assert_str:
‐ ["wx74a8627810cfa308","client_credential","e40a02f9d79a8097df497e6aaf93ab80","access_token"]
‐ ["","client_credential","e40a02f9d79a8097df497e6aaf93ab80","errcode"]
‐ ["wx74a8627810cfa308","","e40a02f9d79a8097df497e6aaf93ab80","errmsg"]
teststeps:
‐ name: 获得token鉴权码API
api: api/get_token.yml
```
* 使用CSV文件,适合于参数比较大的情况
* csv文件中第一行必须放参数名称,并且参数名称必须和测试用例里面的名称一致
* csv文件中第二行放数据,每一组数据占一行
* 在测试用例层【参数名称-参数名称:】的样式,再通过${P(csv文件路径+名称)}调用数据,
```yaml
config:
name: 测试用例
parameters:
appid‐grant_type‐secret‐assert_str: ${P(data/get_token_data.csv)}
teststeps:
‐ name: 获得token鉴权码API
api: api/get_token.yml
```
```csv
appid,grant_type,secret,assert_str
"wx74a8627810cfa308","client_credential","e40a02f9d79a8097df497e6aaf93ab80","access_token"
"","client_credential","e40a02f9d79a8097df497e6aaf93ab80","errcode"
"wx74a8627810cfa308","","e40a02f9d79a8097df497e6aaf93ab80","errmsg"
```
* 使用函数生成数据,适用于数据变化大的情况
### 九、文件上传
* 前提: 需要安装两个包
```python
pip install requests_toolbelt filetype
pip install "httprunner[upload]"
```
### 十、生成测试报告
**执行测试用例统一在all.py文件中运行**
* html报告
```python
# 运行文件夹中所有的测试用例并输出 html格式报告
os.system("hrun testcase --html=reports/report.html")
```
* allure报告
1. 在reports目录下生成temps目录,并且在temps目录下生产临时的json格式的临时报告
```python
# ‐‐clean‐alluredir 命令用于每次执行都先清空json格式的临时文件
os.system("hrun testsuites/test_suites.yml ‐‐alluredir=reports/temps ‐‐clean‐alluredir")
```
2. 根据临时json报告生成allure报告
```python
# ‐clean 删除之前的allure报告,保证执行过后的报告为正确的
os.system("allure generate reports/temps ‐o reports/allures ‐‐clean")
```