简单讲述框架的使用
本框架主要基于:Python+Pytest+Yaml(Yaml+CSV)+Allure+Log+Mysql,实现接口自动化框架
Git地址:https://gitee.com/make_a_summer/interface.git
项目作者:唐松(挽一夏)
个人邮箱:tasng@foxmail.com (欢迎探讨学习进步)
|-common // 辅助类,用于整个测试框架
| |-debugtalk.py // 自定义函数供测试脚本调用。生成随机数、日期时间戳等常用的功能
|-config // 配置
| |-config.py // 读取项目配置文件-config.yaml
| |-config.yaml // 项目配置文件
| |-extract.yaml // 存储接口数据关联
| |-setting.py // 项目基础路径
|-data // CSV测试文件
|-files // 上传文件
|-logs // 日志
|-reports // 测试报告
|-testcase // 测试用例
|-util_tools // 工具库文件
| └──db_connector // 数据库模块
| └──connectMysql.py // MySQL工具类
| └── headle_data // 测试文件操作模块
| └── csv_anlaysis_params.py // Yaml文件使用CSV格式,进行数据处理
| └── csv_handler.py // 读取CSV文件
| └── yaml_handler.py // 读取Yaml文件
| └── other_util // 其他工具类
| └── allure_type.py // Allure报告步骤中,数据格式处理
| └── genrate_id.py // 测试用例ID
| └── yaml_process // Yaml文件处理
| └── yaml_analysis.py // Yaml数据规范、替换、发送请求、数据提取、执行断言
| └── yaml_extract.py // 处理数据提取
| └── yaml_replace.py // 处理数据替换
| └── assertion_util.py // 封装断言
| └── logger_util.py // 封装日志
| └── requests_util.py // 封装发送请求
|-conftest.py // 运行前之前操作,清空extract.yaml文件
|-pytest.ini
|-environment.xml // allure报告中环境配置
|-run.py // 运行入口
微信公众号-标签管理: https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_access_token.html
B站博主学习资料,且配套测试接口(强烈推荐)
需要创建两个文件
1、创建YAML测试文件,编写接口数据
2、创建执行YAML的Py文件,进行读取YAML文件,发送接口请求
1、testcase目录下,创建YAML测试文件,编写接口数据,其中有严格的关键字层级
,编写时需遵守(开发者根据实际要求自定义)
-
name: # 用例名称
base_url: # 用例基础URL
request:
headers: # 请求头 (可选)
cookies: # cookies (可选)
method: # 请求方式
path: # 接口请求路径
data: # 请求参数 (可选)
extract: # 提取参数 (可选)
#extract_list: # 提取参数列表
validation: # 断言
YAML测试文件中,需要包含
4
个一级关键字:name、base_url、request、validation`2` 个二级关键字:method、path
提取参数:extract或者extract_list,根据接口返回值实例使用,提取单个还是提取列表。
2、testcase目录下,创建Py文件,进行读取并执行发送接口
@allure.feature(next(m_id) + "XXX模块")
class TestXXX:
"""XXX模块"""
@allure.story(next(c_id) + "XXX接口")
@allure.description("描述信息: XXX接口测试")
@pytest.mark.parametrize('caseinfo', read_testcase_file('testcase/XXX/XXX.yaml'))
def casetest_login(self, caseinfo):
allure.dynamic.title(caseinfo['name'])
YamlAnalysis().yaml_analysis_execution(caseinfo)
一个YAML文件管理,能管理一组或者多组数据
-
name: 登录成功
base_url: http://127.0.0.1:8787
request:
headers:
Content-Type: application/x-www-form-urlencoded;charset=UTF-8
method: post
path: /dar/user/login
data:
user_name: test01
passwd: admin123
extract:
token: $.token
userid: $.userId
validation:
- contain: {'msg': '登录成功'}
- code: 200
-
name: 登录失败
base_url: http://127.0.0.1:8787
request:
headers:
Content-Type: application/x-www-form-urlencoded;charset=UTF-8
method: post
path: /dar/user/login
data:
user_name: test01111
passwd: admin123
extract:
msg: $.msg
validation:
- contain: {'msg': '登录失败'}
严格控制YAML文件的层级格式即可
看上方发现,在YAML文件中管理多组测试数据,一组两组还好,多了之后YAML中数据就过多,不好查看与管理。
所有就引入了CSV管理,对可变的参数进行处理
1、CSV文件存储在data目录下
2、使用CSV方式,在YAML文件中新增关键字
parameters
,与对应的读取数据格式$csv{XXX}
下面使用同一个接口,展示CSV管理用例
1、data目录下,新建CSV文件,有四个字段需要被替换使用
name,user_name,passwd,validation
正常登录01,test01,admin123,登录成功
账号错误02,test111,admin123,登录失败
账号错误03,test222,admin123,登录失败
账号错误04,test333,admin123,登录失败
密码错误05,test01,admin111,登录失败
密码错误06,test01,admin222,登录失败
密码错误07,test01,admin333,登录失败
2、testcase,YAML测试文件,要被替换的字段用$csv{XXX},且parameters中要一一对应
-
name: $csv{name}
base_url: http://127.0.0.1:8787
parameters:
name-user_name-passwd-validation: data/user_login.csv # parameters关键字下,需要替换的字段-CSV文件路径
request:
headers:
Content-Type: application/x-www-form-urlencoded;charset=UTF-8
method: post
path: /dar/user/login
data:
user_name: $csv{user_name}
passwd: $csv{passwd}
extract:
token: $.token
userid: $.userId
validation:
- contain: $csv{validation}
Py文件依旧不变,运行成功后效果
提取参数有两个方式,根据接口实际结果使用,支持使用jsonpath、正则表达式。提取的接口关联参数存储到:extract.yaml
文件中
extract_list : 提取的数据是列表
extract :提取单个数据
示例:
# 正则提取列表
extract_list:
goodIds: '"goodsId":\s*"(\d+)"'
# jsonpath提取列表
extract_list:
materIds: $.material[*]
# jsonpath提取单个数据
extract:
token: $.token
userid: $.userId
1、通过上个接口发送请求,得到token请求值,存储到extract.yaml文件中
2、YAML文件中,通过debugtalk.py文件中,使用get_extract_data方法,获取extract.yaml文件数据
读取extract.yaml值,因为提取的有单个数据、列表数据,所以提取的方式略有不同
单个参数,如上述
token
值,在YAML文件中,使用${get_extract_data(token)}列表参数,如上述
goodIds
第1个值,在YAML文件中,使用${get_extract_data(goodIds,0)}
params:
token: ${get_extract_data(token)}
json:
pro_id: ${get_extract_data(goodIds,0)}
有的接口发送时需要携带cookie信息。
首先是获取cookie存储到extract.yaml文件中,在使用get_extract_data进行数据获取
-
name: 获取物料信息
base_url: ${get_base_url(base_url)}
request:
headers:
${get_headers(data)}
cookies:
${get_extract_data(Cookie)}
method: get
path: /api/order/customer/orderPlan/getMaterial
validation:
- eq: { 'message': '操作成功' }
- code: 200
extract_list:
materIds: $.material[*]
在使用的过程中,发现yaml文件中,有 ${get_base_url()}、${get_headers()}、 ${get_extract_data(Cookie)}
这些方法均在debugtalk.py文件中
class DebugTalk:
@classmethod
def get_base_url(cls, node_name):
"""
:param node_name: base_url
:return:
"""
return read_config_file('base', node_name)
@classmethod
def get_mysql_config(cls, node_name):
"""
:param node_name: mysql
:param node_name:
:return:
"""
return read_config_file('mysql', node_name)
@classmethod
def get_headers(cls, params_type):
headers_mapping = {
'data': {'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'},
'json': {'Content-Type': 'application/json;charset=UTF-8 '}
}
header = headers_mapping.get(params_type)
if header is None:
raise ValueError('不支持其他类型的请求头设置')
return header
@classmethod
def get_random_number(cls, min, max):
return random.randint(int(min), int(max))
XXXXXX
本框架只实现了五种类型断言
状态码断言、包含模式断言、相等断言、不相等断言、数据库断言
validation:
- contain: {'msg': '登录成功'} # 包含模式
- code: 200 # 接口的响应状态码断言
- eq: {'msg': '登录成功'} # 相等断言
- ne: {'msg': '登录失败'} # 不相等断言
- db: SELECT name, fee FROM testcase.`user` WHERE id=4; # 数据库断言
执行run.py文件,在reports文件allures文件下,打开index.html文件,即可查看
运行run.py文件,读取pytest.ini配置,到指定文件下,读取指定类下的指定测试方法
调用read_testcase_file方法,读取yaml文件,检查yaml文件是否存在字段:parameters,如果就是yaml+csv参数化。没有就是yaml测试文件。 读取的yaml有多少组数据,就传多少组,一组就是一条case。
csv参数化,在调用read_testcase_file方法,读取yaml文件,检查存在字段:parameters,读取时候就调用csv_analysis_params方法,对yaml文件中$csv{XX}做替换
通过conftest.py文件,先调用clear_extract方法,清除extract.yaml文件-存在数据关联文件
测试文件开始执行YamlAnalysis类中,yaml_analysis_execution方法,对整体yaml文件做处理
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。