方法一:建议采纳此方法
1)首先在项目根目录下打开命令窗口,移除虚拟环境:pipenv –rm
2)安装虚拟环境时忽略锁定的版本号,同时安装依赖包:pipenv install –skip-lock
如果使用上述命令报错:Warning: Python 3.9 was not found on your system… Neither ‘pyenv’ nor ‘asdf’ could be found to install Python.
请使用如下命令:pipenv install –python 3.7 –skip-lock (注意:这里的版本号,如果你的是3.8,就应该如下写命令:pipenv install –python 3.8 –skip-lock)
前言
公司突然要求你做自动化,但是没有代码基础不知道怎么做?或者有自动化基础,但是不知道如何系统性的做自动化, 放在yaml文件中维护,不知道如何处理多业务依赖的逻辑?
那么本自动化框架,将为你解决这些问题。
一、框架介绍
本框架主要是基于 Python + pytest + pytest-html/Allure + loguru + 邮件通知/企业微信通知/钉钉通知 实现的接口自动化框架。
对于框架任何问题,欢迎联系我!
二、实现功能
三、目录结构
四、依赖库
五、安装教程
通过Git工具clone代码到本地 或者 直接下载压缩包ZIP
本地电脑搭建好 python环境,我使用的python版本是3.9
安装pipenv
六、如何创建用例
1. 修改配置文件
config.settings.py
1)确认用例是通过YAML还是Excel编写,由CASE_FILE_TYPE控制 2)确认测试完成后是否发送测试结果,由SEND_RESULT_TYPE控制,并填充对应邮件/钉钉/企业微信配置信息 3)确认测试是否需要进行数据库断言,如有需求,填充数据库配置信息 4)指定日志收集级别,由LOG_LEVEL控制
2. 修改全局变量,增加测试数据
config.global_vars.py
3. 删除框架中的示例用例数据
1)删除
data
目录下所有的YAML和EXCEL文件 2)删除test_case/test_manual_case
目录下所有手动编写的用例4. 编写测试用例(两种方式任选其一或者都选)
1 自动生成测试用例
data
test_case.test_auto_case
data
下新建一个YAML/Excel文件。按照如下字段要求进行测试用例数据添加2. 手动编写测试用例
data
test_case.test_manual_case
data
下新建一个YAML/Excel文件,按照要求编写测试用例数据 2)在test_case.test_manual_case下新建一个以”test”开头的测试方法,进行测试用例方法编写。5. 用例中相关字段的介绍
6. Excel用例单独说明
框架支持excel多表单自动生成测试用例,每一个表单作为一个测试用例模块。 例如: excel表格名称是:test_demo.xlsx excel表单1名称是:GitLink-登录模块 excel表单2名称是:示例模块
生成规则:
基于上述规则:
excel第一个表单生成的测试用例 测试用例模块:test_demo_dlmk.py 测试用例类:TestDemoDlmkAuto 测试用例方法:test_demo_dlmk_auto
excel第二个表单生成的测试用例 测试用例模块:test_demo_slmk.py 测试用例类:TestDemoSlmkAuto 测试用例方法:test_demo_slmk_auto
六、运行自动化测试
1. 激活已存在的虚拟环境
2. 运行
注意:
run.py
中右键运行七、查看测试报告
pytest-html测试报告
如果是pytest-html生成的测试报告,直接打开
outputs
目录下的.html
报告即可。支持通过任意浏览器打开查看Allure测试报告
outputs/report/allure_html/index.html
打开查看测试报告outputs/report/allure_html/双击打开Allure报告.bat
打开查看测试报告注意:
outputs/report/allure_html/双击打开Allure报告.bat
打开测试报告的方法,暂时不支持mac系统outputs/report/allure_html/双击打开Allure报告.bat
打开测试报告,命令窗口显示乱码,或者打不开,可以把.bat
的文件名称修改为英文的名称,里面的所有中文注释全部移除,再次尝试八 、详细功能说明
1. 用例中如何生成随机数据
在测试过程中,可能涉及到一些特殊场景,需要生成定制化的数据。每次运行测试,都需要按照指定规则随机生成。 例如:
data/test_new_project_demo.yaml
中payload.name就是使用Faker随机生成的。 我这里写了一个表达式:${faker.name().replace(" ", "").replace(".", "")}
case_data = RequestPreDataHandle(case).request_data_handle()
会进行用例数据处理common_utils.data_handle.data_replace
进行数据处理common_utils.data_handle
有导入Faker包,并且初始化了faker对象。因此上述表达式能成功运行获取其结果这里需要注意以下几点:
common_utils.data_handle
中定义好了。common_utils.data_handle
中进行添加。2. 用例中如何提取响应数据作为全局变量并使用
在测试过程中,通常下一个接口需要用到上一个接口的响应数据,这个时候就涉及到参数的提取。 我们在用例数据中定义了参数:
extract
进行后置参数的提取,根据接口返回数据的类型(JSON或者Text)采取不同的方法,从响应数据中提取参数,保存在全局变量中。 例如:data/test_login_demo.yaml
case_utils/request_data_handle.py.after_request_extract
就会接口返回数据的类型(JSON或者Text)采取不同的方法,从响应数据中提取参数,保存在全局变量中。${user_id}
即可。3. 如何进行响应数据断言
以下是支持的几种响应断言: | 断言方式 | 说明 | | ———— | ———— | | eq | 相等,判断预期结果是否等于实际结果 | | in | 包含, 判断实际结果是否包含预期结果 | | gt | 大于, 判断预期结果是否大于实际结果 | | lt | 小于, 判断预期结果是否小于实际结果 | | not | 非,判断预期结果不等于实际结果 |
以下是响应断言示例:
$.user_id
, 实际结果:${user_id}
; 会从接口响应数据中通过表达式$.user_id
提取user_id作为预期结果, 从全局变量中替换变量${user_id}
获取user_id作为实际结果,判断预期结果是否等于实际结果。$.login
, 实际结果:${login}
; 会从接口响应数据中通过表达式$.login
提取login作为预期结果, 从全局变量中替换变量${login}
获取login作为实际结果,判断实际结果是否包含预期结果。$.user_id
, 实际结果:84955; 会从接口响应数据中通过表达式$.user_id
提取user_id作为预期结果,判断预期结果是否大于实际结果。$.user_id
, 实际结果:84953; 会从接口响应数据中通过表达式$.user_id
提取user_id作为预期结果,判断预期结果是否小于实际结果。$.user_id
, 实际结果:85390; 会从接口响应数据中通过表达式$.user_id
提取user_id作为预期结果,判断预期结果是否不等于实际结果。4. 如何进行数据库断言
以下是支持的几种数据库断言: | 断言方式 | 说明 | | ———— | ———— | | len | 数据库SQL查询结果的数量 是否 等于预期结果 | | eq | 从数据库SQL查询结果中通过jsonpath表达式提取值,判断是否等于预期结果 | |…… | 其他断言方式待扩展 |
以下是数据库断言示例-1:
common_utils/mysql_handle.py.MysqlServer.query_one
, 返回的数据类型是字典。以下是数据库断言示例-2:
common_utils/mysql_handle.py.MysqlServer.query_one
, 返回的数据类型是字典。name
, identifier),并按创建时间倒序排序。$.id
, 实际结果:${project_id}
, 从数据库查询结果中通过表达式$.id
提取id作为实际结果, 从全局变量中替换变量${project_id}
获取project_id作为实际结果,判断预期结果是否等于实际结果。$.name
, 实际结果:${project_name}
, 从数据库查询结果中通过表达式$.name
提取name作为实际结果, 从全局变量中替换变量${project_name}
获取project_name作为实际结果,判断预期结果是否等于实际结果。$.identifier
, 实际结果:${project_identifier}
, 从数据库查询结果中通过表达式$.identifier
提取identifier作为实际结果, 从全局变量中替换变量${project_identifier}
获取project_identifier作为实际结果,判断预期结果是否等于实际结果。注意:
5. 配置邮箱通知
config/settings.py
中选择邮件发送方式:SEND_RESULT_TYPE = 3config/settings.py
中。这些配置信息可以从邮箱设置中获取。不知道如何配置的,可以直接互联网上搜索。config/settings.py
中配置邮件发送的标题以及内容。 注意: 1)以下${变量名}
是已经定义好的。只能减,不能增。 2)邮件标题以及内容也可自行调整。6. 配置钉钉通知
config/settings.py
中选择钉钉发送方式:SEND_RESULT_TYPE = 1config/settings.py
中。具体可以参考:钉钉机器人在配置文件
config/settings.py
中配置钉钉发送的标题以及内容。 注意: 1)以下${变量名}
是已经定义好的。只能减,不能增。 2)邮件标题以及内容也可自行调整。7. 配置企业微信通知
config/settings.py
中选择企业微信发送方式:SEND_RESULT_TYPE = 2config/settings.py
中。具体可以参考:企业微信config/settings.py
中配置企业微信发送内容。 注意: 1)以下${变量名}
是已经定义好的。只能减,不能增。 2)邮件标题以及内容也可自行调整。7. 上传文件接口支持
熟悉接口
文件上传的逻辑
common_utils/base_request.py
中封装的request请求,是使用from requests_toolbelt import MultipartEncoder
进行文件上传的。针对单文件上传,我们需要传递一个字典,参考如下:
针对多文件上传,我们需要传递一个列表嵌套元祖,参考如下:
上传文件,不带其他参数
我们需要设置: request_type=file
然后在files中按照如下格式书写:{接口中文件参数的名称:”文件路径地址”/[“文件地址1”, “文件地址2”]}
参考如下:
上传文件,带其他参数
我们需要设置: request_type=file
然后在files中按照如下格式书写:{接口中文件参数的名称:”文件路径地址”/[“文件地址1”, “文件地址2”]}
由于请求参数里面还传递了
language:zh
, 因此我们需要写在payload
中在
common_utils/base_request.py
中,我们会将language:zh
以元祖形式处理到files里面参考如下:
初始化项目可能遇到的问题
1. 测试机安装的是python3.7,但是本框架要求3.9.5,怎么办?
方法一:建议采纳此方法 1)首先在项目根目录下打开命令窗口,移除虚拟环境:pipenv –rm 2)安装虚拟环境时忽略锁定的版本号,同时安装依赖包:pipenv install –skip-lock 如果使用上述命令报错:Warning: Python 3.9 was not found on your system… Neither ‘pyenv’ nor ‘asdf’ could be found to install Python. 请使用如下命令:pipenv install –python 3.7 –skip-lock (注意:这里的版本号,如果你的是3.8,就应该如下写命令:pipenv install –python 3.8 –skip-lock)
3)激活虚拟环境:pipenv shell
4)运行框架:python run.py
方法二: 1)首先在项目根目录下打开命令窗口,移除虚拟环境:pipenv –rm 2)更改项目根目录下的Pipfile文件
3)更改项目根目录下的Pipfile.lock文件
4)安装虚拟环境,同时安装依赖包:pipenv install
5)激活虚拟环境:pipenv shell
6)运行框架:python run.py
2. 无法安装依赖包或者安装很慢,怎么办?
检查一下Pipfile文件中的pip的安装源(位置:Pipfile) 以下安装源均可: