159 lines
5.7 KiB
Markdown
159 lines
5.7 KiB
Markdown
|
**EasyTest接口自动化测试框架**
|
|||
|
===
|
|||
|
## 框架模式
|
|||
|
基于 pytest + allure + yaml + mysql + 钉钉通知 + Jenkins 实现的接口自动化框架
|
|||
|
* git地址: [https://gitee.com/t_l_h/EasyTest.git](https://gitee.com/t_l_h/EasyTest.git)
|
|||
|
|
|||
|
## 框架介绍
|
|||
|
为了抛弃臃肿庞大的测试框架,EasyTest将大部分代码逻辑通过conftest文件实现前置,使得编写测试用例时无需导入各种乱七八糟的模块。
|
|||
|
|
|||
|
## 框架功能
|
|||
|
* yaml管理测试数据,实现测试数据分离
|
|||
|
* 支持不同接口间的数据依赖
|
|||
|
* 支持数据库的增、删、改、查
|
|||
|
* 支持yaml文件中的动态参数自动替换
|
|||
|
* 支持测试完成后发送钉钉消息通知
|
|||
|
* 可轻易集成jenkins
|
|||
|
|
|||
|
## 遇到问题
|
|||
|
* 可以直接提issue或联系v:Tlh_0717
|
|||
|
|
|||
|
|
|||
|
## 目录结构
|
|||
|
```
|
|||
|
├── files 存放接口上传的文件
|
|||
|
├── test_cases 存放测试用例
|
|||
|
├── test_data yaml格式测试数据
|
|||
|
├── utils 存放各种封装方法
|
|||
|
├── conftest.py pytest钩子函数
|
|||
|
├── pytest.ini pytest执行脚本参数配置文件
|
|||
|
├── run.py 全量执行用例
|
|||
|
├── send_ding.py 钉钉消息通知
|
|||
|
├── config.yml 全局配置
|
|||
|
├── requirements.txt 依赖文件
|
|||
|
└── Pipfile 虚拟环境依赖文件
|
|||
|
```
|
|||
|
### 使用教程
|
|||
|
|
|||
|
#### 1、Gitee 拉取项目
|
|||
|
|
|||
|
需要先配置好python、jdk、allure环境(不懂的自行百度)
|
|||
|
|
|||
|
```shell
|
|||
|
git clone https://gitee.com/tanlinhai_code/EasyTest.git
|
|||
|
```
|
|||
|
|
|||
|
#### 2、安装依赖
|
|||
|
|
|||
|
方式一:
|
|||
|
直接安装依赖文件
|
|||
|
|
|||
|
```shell
|
|||
|
pip install -r requirements.txt
|
|||
|
```
|
|||
|
|
|||
|
方式二:
|
|||
|
使用pipenv创建虚拟环境运行
|
|||
|
```shell
|
|||
|
"""配置虚拟环境"""
|
|||
|
|
|||
|
pipenv install # 根据根目录下的Pipfile创建一个新环境
|
|||
|
|
|||
|
pipenv --venv # 查看虚拟环境路径
|
|||
|
|
|||
|
/Users/用户/.local/share/virtualenvs/api_autotest-J3yMsRGU # 创建的虚拟环境地址
|
|||
|
```
|
|||
|
|
|||
|
```shell
|
|||
|
"""激活虚拟环境"""
|
|||
|
|
|||
|
pipenv shell # 激活虚拟环境
|
|||
|
|
|||
|
exit # 退出虚拟环境
|
|||
|
|
|||
|
```
|
|||
|
|
|||
|
## 配置项目的通用配置
|
|||
|
![img.png](files/testconfig.png)
|
|||
|
|
|||
|
|
|||
|
|
|||
|
## 编写测试用例
|
|||
|
|
|||
|
### 创建yaml测试文件
|
|||
|
![img.png](files/testdata.png)
|
|||
|
|
|||
|
在test_data目录下的login目录中创建yaml文件,注:必须是二级目录下创建,通常业务也会划分模块。
|
|||
|
|
|||
|
字段说明:
|
|||
|
|
|||
|
* common_inputs: 请求方法,请求路径(只需要写域名后的路径即可)
|
|||
|
* case: 用例名
|
|||
|
* inputs: 用例输入
|
|||
|
* params: 请求为get类型时填写
|
|||
|
* json: 请求为post类型时填写
|
|||
|
* file: 请求上传的文件名,文件需要放在files目录下
|
|||
|
* sql: sql语句
|
|||
|
* expectation: 用例输出
|
|||
|
* response: 接口返回数据体
|
|||
|
|
|||
|
创建好了yaml文件,就可以创建测试用例文件了
|
|||
|
### 创建测试用例文件
|
|||
|
![img.png](files/testcase.png)
|
|||
|
|
|||
|
同样的,在test_cases下的login目录中创建yaml文件,目录层级与test_data保持一致
|
|||
|
|
|||
|
字段说明:
|
|||
|
|
|||
|
* allure.feature: 模块名称
|
|||
|
|
|||
|
* allure.title: 用例名称
|
|||
|
|
|||
|
* pytest.mark.imports 用imports标记这条用例,后续可以执行指定标记的用例
|
|||
|
|
|||
|
* pytest.mark.datafile: 需要使用的yaml测试数据(需要从test_data目录开始写,千万不能写错)
|
|||
|
|
|||
|
* 测试函数必须test_*开头,重点说各个入参的字段
|
|||
|
|
|||
|
* requests: 封装好的实例化请求方法,根据请求方式直接调用requests.post或requests.get,如图中的res所示
|
|||
|
|
|||
|
* url: 由根目录config.yml文件中读取的路由及该测试用例对应的yaml文件中读取的path拼接,无需填写,只需正常传入
|
|||
|
|
|||
|
* headers: 以静态方法存放在utils.requests_control文件的RestClient类中,可按需更改
|
|||
|
|
|||
|
* case: 用例对应yaml文件中的case名称,可在做不同校验时作为判断条件
|
|||
|
|
|||
|
* inputs: 用例对应yaml文件中inputs内容,使用时直接用获取字典值的方式获取,
|
|||
|
|
|||
|
1、如果是上传文件的接口,可以参考前面截图中的样式填写,只需要填写files目录下的文件名即可
|
|||
|
|
|||
|
2、如果请求参数需要动态参数,需要用"{{xxx}}"这种双引号和双括号包裹的方式填写,名称必须是utils.fake_data_control.py文件Execute类中定义的方法名,可以按需添加
|
|||
|
|
|||
|
* expectation: 用例对应yaml文件中expectation内容,使用时可以直接用字典值方式获取
|
|||
|
|
|||
|
* sql: 数据库实例化方法,可以通过sql.query('xxxx'), sql.execute('xxxxx')方式调用,使用时直接使用yaml文件中的sql语句:sql.query(inputs['sql'])(当然也可以直接写)
|
|||
|
|
|||
|
* cache: 共享的缓存数据,这个使用起来主要注意:例如在test_1中我需要使用某个数据给test_2使用,那么可以在test_1中使用cache['key'] = 1 这样的方式把数据存入全局的共享数据中,test_2使用时就用字典取值的方式cache['key']即可
|
|||
|
,那么就有人问了,那多个数据依赖怎么办呢?目前的办法是将会产出依赖数据的接口打上@pytest.mark.run(order=1)的标签,并且存入共享数据时的key必须不重复,
|
|||
|
这样可以理解为用例执行开始前有一个空字典,在测试过程中不断向其中添加依赖数据,而在后面执行的用例只需要从里面取就可以了
|
|||
|
|
|||
|
### 运行测试用例
|
|||
|
|
|||
|
```shell
|
|||
|
|
|||
|
python run.py # 全量执行用例,生成测试报告保存在allure-report目录下
|
|||
|
|
|||
|
pipenv run.py -m login # 执行被@pytest.mark.login标记的所有用例
|
|||
|
|
|||
|
python send_ding.py # 发送测试结果到钉钉通知,如果jenkins和config.yml都配置好了,可以直接使用
|
|||
|
|
|||
|
```
|
|||
|
|
|||
|
钉钉通知样式:
|
|||
|
|
|||
|
![img.png](files/testding.png)
|
|||
|
|
|||
|
|
|||
|
## 最后
|
|||
|
框架还有许多能优化的地方,如果有什么好的建议欢迎一起来讨论。
|