项目介绍
接口主动化测验项目2.0
软件架构
本结构主要是基于 Python + unittest + ddt + HTMLTestRunner + log + excel + mysql + 企业微信告诉 + Jenkins 完成的接口主动化结构。
- 项目参与者: 陈勇志
- 技术支撑邮箱: 262667641@qq.com
- 个人微信: Testing_player
- 个人博客地址:home.cnblogs.com/u/Nephalem-…
- 微信公众号:测验玩家勇哥
- 假如有任何问题,能够加勇哥,进群学习结构。
前言
公司忽然要求你做主动化,可是没有代码根底不知道怎样做?或许有主动化根底,可是不知道怎样系统性的做主动化,
放在 excel 文件中保护,不知道怎样处理多事务依靠的逻辑,又或许你想想postman一样能够给每一条测验用例编写一些代码来处理脚本,可是又不知道怎样做。
那么 gitee 中勇哥的主动化测验结构,将为你处理这些问题。
结构优势
本结构不收取汾河费用,其优势在于测验人员直接编写测验用例,运转一个测验文件就能够主动履行一切测验用例。
结构主要运用 python 语言编写,结合 unittest 进行二次开发,用户仅需求在 excel 文件中编写测验用例,
编写成功之后,会主动生成测验用例的代码,零根底代码小白,也能够操作。
本结构支撑多环境切换,多事务接口依靠,mysql 数据库断语和 接口呼应断语,并且用例直接在 excel 文件中保护,无需编写事务代码,
本结构支撑动态脚本函数扩展,能够随时内部预置函数,或许增加动态脚本,经过固定格式写法 {{fun()}} 动态调用
接口 unittest 结构生成 HTML 陈述及 excel 用例履行陈述,并且发送 企业微信告诉/ 钉钉告诉/ 邮箱告诉/ 飞书告诉,灵敏装备。
完成功用
- 测验数据隔离, 完成数据驱动。
- 支撑多套环境运用,比方测验用例相同,可是环境不同,只需在 excel 中启用需求履行的环境即可。
- 支撑多接口数据依靠: 如A接口需求同时依靠 B、C 接口的呼应数据作为参数,或许 c 接口断语需求动态运用A接口的入参作为预期成果。
- 数据库断语: 直接在测验用例中写入查询的 sql 即可断语,无需编写代码。
- 动态多断语: 如接口需求同时校验呼应数据和 sql 校验,支撑多场景断语。
- 支撑自定义脚本代码(python语言),能够让你像 postman 一样给每一条测验用例编写恣意前后置脚本代码,内置了 action
目标操作及一些办法能够很便捷的处理前置或后置脚本。 - 主动生成用例代码: 测验人员在 excel 文件中填写好测验用例, 程序能够直接生成用例代码,纯小白也能运用。
- 支撑自定义拓宽函数: 如用例中需求运用自己完成的函数,能够随时在指定的目录下面写上函数,经过 {{func(*args,**kwargs)}}
随时调用你自己设置的函数。 - 内置完成了一部分随意函数及自定义常用函数:如:随机字符串、恣意日期时刻、随机gps、随机用户身份证、地址、邮箱、企业信息等等,用户还能够自己定义恣意函数,无门槛运用。
- 计算接口的运转时长: 拓宽功用,订制开关,能够决议是否需求运用。
- 支撑用例定时器运转,比方:B用例履行前需求A用例履行后等候5秒才开端履行,能够随意加上等候时刻。
- 日志模块: 打印每个接口的日志信息,同样订制了开关,能够决议是否需求打印日志。
- 钉钉、企业微信告诉、邮件告诉: 支撑多种告诉场景,履行成功之后,可选择发送钉钉、或许企业微信、邮箱告诉。
- 封装了发送MQTT的类,支撑发送MQTT音讯。
- 支撑导入postman或许swargs导出的json文件主动处理成测验用例,然后修正一下参数即可运用。
gitee 地址
接口主动化结构地址:加我入群自取:微信:Testing_player
遇到问题
- 请仔细阅读文档,文档中几乎能够帮你避免一切的问题
- 能够增加微信: blue-blue-lemon, 增加微信会将你拉倒主动化沟通群中,群内有很多热心的小伙伴,可是条件是希望你现已阅读了文档中的一切内容
- 你也能够请作者为你解答,当然在我时刻空闲的时分,也能够让作者为你一对一服务,当然是收费的。
目录结构
.
└── cases/ // 测验用例数据文件夹
└── cases/ // 测验用例
└── test_cases.xlsx
└── templates/ // 测验用例模板
└── template.xlsx
└── temporary_file/ // swagger| postman 导出的 json文件寄存方位
└── openapi.json
└── postman.json
└── common/ // 装备及核心功用代码
└── bif_functions/ // 内置函数东西
└── __init__.py
└── bif_datetime.py // 内置日期时刻函数
└── bif_hashlib.py // 内置hash 函数
└── bif_json.py // 内置json解析函数
└── bif_list.py // 内置列表操作函数
└── bif_random.py // 内置随机函数
└── bif_re.py // 内置正则函数
└── bif_str.py // 内置字符串函数
└── bif_time.py // 内置时刻函数
└── random_tools.py // 内置其他随机函数
└── crypto/ // 加密东西
└── __init__.py
└── encrypt_data.py // 履行数据加密封装进口
└── encryption_aes.py // aes 加密
└── encryption_base64_to_image.py // base64 转图片东西
└── encryption_main.py // 履行参加函数进口,对应excel中的加密办法选项,结合 extensions 中的 sign 可自定义加密规则
└── encryption_rsa.py // rsa 加密
└── encryption_str.py // 常用的字符串加密东西函数
└── data_extraction/ // 数据提取器
└── __init__.py
└── analysis_json.py // json 字典分析函数,类似 jsonpath
└── assert_dict.py // 旧断语字段函数 (暂时放弃)
└── data_extractor.py // 数据提取函数
└── dependent_parameter.py // 数据替换函数
└── dict_get.py // 旧途径提取函数
└── database/ // 数据库操作东西
└── __init__.py
└── execute_sql_files.py // sql 批处理东西
└── mongodb_client.py // mongoDB 操作东西
└── mysql_client.py // mysql 操作东西
└── psycopg_client.py // presto 操作东西
└── redis_client.py // redis 操作东西
└── file_handling/ // 文件操作
└── __init__.py
└── do_excel.py // excel 处理
└── excel.py // excel 处理
└── file_utils.py // json、yarm等文件操作以及一些目录操作
└── http_client/ // http_client 发送http的东西
└── __init__.py
└── http_client.py // http 恳求封装
└── MQclient/ // MQ 东西
└── __init__.py
└── mqtt_client.py // mqtt 东西
└── rabbit_mq_client.py // rmq 东西
└── random_tools/ // 常用随机数东西包
└── credit_cards/ // 随机银行卡
└── __init__.py
└── bankcard.py
└── cardbin.csv
└── credit_identifiers/ // 随机企业仅有信用代码
└── __init__.py
└── address.json
└── credit_identifier.py
└── unified_social_credit_identifier.py
└── emails/ // 随机邮箱
└── __init__.py
└── email.py
└── free_email.csv
└── identification/ // 随机身份证
└── __init__.py
└── area.csv
└── id_card.py
└── names/ // 随机姓名
└── __init__.py
└── first_name_boy.csv
└── first_name_girl.csv
└── last_name.csv
└── name.py
└── phone_numbers/ // 随机手机号
└── __init__.py
└── phone.py
└── phone_area.csv
└── __init__.py
└── utils/ // 东西包
└── __init__.py
└── captcha.py // 识别图片转字符串,常用于验证码登录
└── load_and_execute_script.py // 动态加载自定义python文件东西
└── logger.py // loggin 日志封装
└── mylogger.py // loguru 日志封装
└── parsing_openapi.py // 解析 swagger 文件 转测验用例
└── parsing_postman.py // 解析 postman 文件 转测验用例
└── singleton.py // 单例
└── WxworkSms.py // 企业微信
└── validation/ // 断语及加载动条函数东西包
└── __init__.py
└── comparator_dict.py // 自定义比较器名词释义
└── comparators.py // 自定义比较器
└── extractor.py // 提取器
└── load_modules_from_folder.py // 动态从模块中加载函数
└── loaders.py // 动态加载函数及加载内置比较器等东西包
└── validator.py // 断语校验器
└── __init__.py
└── action.py // 核心类
└── config.py // 装备文件
└── variables.py // 数据操作类
└── extensions/ // 动态扩展模块目录
└── __init__.py
└── ext_method_online.py // 动态扩展办法模块
└── sign.py // 加签模块
└── image/
└── wx.jpg
└── zfb.jpg
└── OutPut/ // 日志报错
└── log/
└── 2023-06-25.log
└── 2023-07-04.log
└── 2023-07-05.log
└── reports/
└── history.json
└── scripts/ // 动态脚本目录
└── __init__.py
└── prepost_script_安全纯洁大屏_2.py // 对应每条测验用例的前后置脚本(可选)
└── request_script_sheetname_id.py
└── test_script/ // 测验脚本核心模块
└── __init__.py
└── test_api.py
└── directory_tree.txt
└── excel_converter.py // postman、swagger 文件转换主进口模块
└── generate_tree.py // 项目目录树模块
└── main_personal_information.py // 随机个人信息核心进口
└── pipenv_command.text
└── Pipfile
└── Pipfile.lock
└── README.md
└── run.py // 主动化测验履行进口模块
装置教程
依靠库
参阅 pipenv –Pipfile 虚拟环境文件,不一一列出
首先,履行本结构之后,需求树立好 python 环境,python 环境树立自行百度
- 装置 pipenv环境: pip install pipenv
- 创立虚拟环境: pipenv install
- 假如有个别包无法装置,则:pipenv shell 进入环境后,再pipenv install XX包
运用说明
- 测验用例只需求在 cases/cases/xxx.xlsx 文件填写测验用例即可,能够参阅测验用例模板文件,由于模板文件的用例现已做了灵敏信息处理,所以履行履行模板的用例应该会报错
- 运转用例能够直接进入到 test_script/test_xxx.py 中,履行test_xxx.py文件,也能够直接运训 最外层的 run.py文件,
- Personalinformation.py 这个文件是用来生成一些测验数据,方便做功用测验或许其他一般性测验运用
敞开测验接口文档
大家能够运用开源接口中的登录、个人信息、收藏(新增、检查、修正、删去)等功用,编写接口主动化事例,然后测验程序脚本
下方是接口文档地址,大家能够自行检查(因为开源的接口,里面有些逻辑性的功用,如修正被删去的网址接口并没有过多的做判别,
因此用例中只写了一些根底的场景,仅供大家参阅。)
- wanandroid.com/blog/show/2
怎样创立用例
excel中的测验用例相关字段介绍
下面是一个关于一个用例中的一切字段,字段不是悉数必填
下面对每一个字段的效果,做出解释:
- Id:测验用例的id,仅有,必填
- Name: 测验用例的称号,必填
- Description: 测验用例描绘,可选,主张填写,生成的陈述会用到这个字段
- Run: 是否运转这条用例,假如不填或填写的不是
YES/yes
,则不运转这条用例 - Time: 定时器,数字,非必填,填写则会等候多少秒后运转这条用例
- Method: 恳求办法,支撑一切的http恳求办法,
get/post/put/patch
等等 - Url: 接口途径或许整个恳求地址,假如不带域名,则会主动去init表中拼接host上去,Url中能够参数化,如:
/test/api/get/{{id}}/{{func(*args,**kwargs)}}
- Headers: 恳求头,字典填写办法,如:
{"Content-Type":"application/json","token":"{{token}}",'time':'{{timestamp()}}'}
- Headers Crypto: 恳求头是否加密,能够自定义加密办法,然后这儿输入你的加密办法名即可,如
MD5\sha1
等 - Query Str: 查询字符串参数,也便是URL过长的时分,能够将URL后边的参数拆出来填写在这儿,字典的办法填写,支撑参数化
- Request Data Type: 恳求参数类型,有
json,file,params,data
等等这几种 - Request Data: 恳求参数,字典办法填写,支撑参数化,如:
{"projectId":"{{projectId}}","tvSequence":"{{random_string()}}"}
- Setup Script: 前置脚本,能够直接写 pthon 代码,比方类,函数,等等,假如是函数,类一定要调用才会履行。编写办法示例:
# 能够写类,能够写函数,能够直接普通python句子,
def setup(action):
print("获取action示例的特点", action.get_vars())
# 更新特点到action实例的特点中
action.update_vars("999", "99999")
print("获取一切的暂时变量", action.get_variable())
print("将变量存到暂时变量表中以便后续用例{{key}}运用", action.update_variable("key", "value"))
print("将函数存到暂时变量表,以便后边调用{{setup_func()}}也能够", action.update_variable("setup_func", setup))
# 调用办法
setup(action)
- Request Data Crypto: 恳求参数是否加密,能够填写你需求的加密办法,如
MD5\sha1
等 - Extract Request Data:提取恳求参数的字段或整个恳求参数字典,如:
{"k": "$.projectId", "x": "$.data[0].age[3].a"}
- Jsonpath: 提取呼应成果的 jsonpath 表达式,示例:默许情况下若表达式成果只有一个值那么就存为字符串,假如表达式履行成果有多个值,那么就存为列表,表达式填写办法如下:
{"k": "$.data", "x": "$.data[0].age[3].a"}
- Regex: 正则表达式,填写正则表达式字符串,示例:
r'"id": (\d+), "name": "(\w+)",'
- Regex Params List:填写一个列表(list),用来存正则表达式提取值的变量列表,如:
["a", "b"]
,则表明用a,b 变量接纳上面的正则表达式的回来值 - Retrieve Value:python字典的取值办法,多条用分号间隔,如:
name=data[0].name;ok=data[0].id;an=data[0].age[3].a
- SQL:填写增删改查sql句子,字典的key是需求履行的sql办法,值是sql句子,能够填写多条,填写格式示例:
{
"insert": {
"insert_data": "INSERT INTO users (name, age, email) VALUES ('John', 25, 'john@example.com');"
},
"select": {
"select_data": "SELECT name, age, email FROM users WHERE age > 20;"
},
"delete": {
"delete_data": "DELETE FROM users WHERE age > 30;"
},
"update": {
"update_data": "UPDATE users SET age = 26 WHERE name = 'John';"
}
}
- Sql Params Dict:提取sql的成果,同jsonpath,如:
{"name": "$.select.select_data.name", "age": "$.select.select_data.age"}
- Teardown Script: 后置python脚本代码,恣意函数或许类,用例发送恳求后会主动履行该代码
- Expected:预期成果,写法示例:
[{"check":"result.user.name","comparator":"eq","expect":"chenyongzhi"}]
or{"check":"result.user.name","comparator":"eq","expect":"chenyongzhi"}
,支撑的断语比较办法有如下这些:
{
"eq": "eq:实践值与希望值持平",
"lt": "lt:实践值小于希望值",
"lte": "lte:实践值小于或等于希望值",
"gt": "gt:实践值大于希望值",
"gte": "gte:实践值大于或等于希望值",
"neq": "neq:实践值与希望值不持平",
"str_eq": "str_eq:字符串实践值与希望值相同",
"length_eq": "length_eq:实践值的长度等于希望长度",
"length_gt": "length_gt:实践值的长度大于希望长度",
"length_gte": "length_gte:实践值的长度大于或等于希望长度",
"length_lt": "length_lt:实践值的长度小于希望长度",
"length_lte": "length_lte:实践值的长度小于或等于希望长度",
"contains": "contains:希望值包含在实践值中",
"contained_by": "contained_by:实践值被包含在希望值中",
"type_match": "type_match:实践值的类型与希望值的类型相匹配",
"regex_match": "type_match:正则匹配(从字符串的开端方位匹配)",
"regex_search": "regex_search:正则匹配(从字符串的恣意方位匹配)",
"startswith": "startswith:实践值是以希望值开端",
"endswith": "endswith:实践值是以希望值完毕"
}
- Response: 呼应成果,用例履行后,会主动将成果回写到这个excel中,检查测验成果,一望而知。
创立用例过程
开端填写测验用例前,先看看这个init表的字段,下面我会一致讲解:
- 在
cases
文件夹下方创立被测模块或许系统,然后在系统下创立相关的excel
用例(能够复制模板excel文件来填写测验用例) - 将测验用例途径增加到
common
文件夹下的config.py
文件中 - 进入
test_script/
文件夹,在该文件夹下操作test_api.py
文件将test_file
变量地址替换为刚刚填写的测验用例地址 - excel 中的用例有必要填写用例
id
,别的init sheet
表照中的全局初始化数据字段 中的部分字段有必要填写如:
"""
# init 表中的字段
id: 序号
environment: 被测环境,主张填写:如测验环境,开发环境,出产环境等等
host:域名地址,如:https://www.baidu.com,非必填,填写了就会取这部分的地址与测验用例中的Url拼接发送恳求
path:一小部分的恳求途径,比方一切的接口或许都存在:/test/api 这种,就能够填写上去,非必填
databases: 数据库,非必填,{"host": "127.0.0.1","port": 3306,"database": "mysql","user":"root","password":"root@3306"}
sheets:你想履行的sheet是哪一个,悉数履行就填写 'all',部分履行就填写详细的sheet如["第一个sheet的称号","第二个sheet的称号"...]
initialize_data:初始化的一些固定参数,比方登录账号,密码,等等都是根本不变的数据能够填写这儿,属于全局变量,填写办法字典{"{{username}}":"1234","{{pwd}}":"密码"}
run: 决议运用的环境,值为yes表明用这个环境运转,有多个环境都填写yes,只运转第一个yes
"""
以上都填写完成,记住先关闭excel
,然后就能够独自履行test_api.py
文件,或许直接运转run.py
主进口文件,生成HTML陈述及excel测验陈述
下面咱们来看一下,怎样创立用例
用例中相关字段的介绍
- 下发截图为 init 初始化根底数据填写用例
- init 中 sheets 内的列表排序是有效果的,履行用例是依照列表内值排序履行的。
- 下方截图便是 excel 用例 每个字段是否必填的描绘
- 每条测验用例都能够自定义是否敞开,敞开则履行,不敞开则越过,默许履行成果是经过
- 每一个sheet都能够随意组合用例,不同sheet之间的变量参数能够共用(即变量全局的),不独立规划,主要是考虑到分sheet仅仅为了方面办理用例,可是履行依然是一次性悉数履行
- 现在没有规划每一个sheet的最大用例条数,默许取excel最大数据量,假如发现最大数据量撑爆内存,主张分多个excel来写测验用例
- 现在运用的生成器的办法读取excel,主要是避免一次性内存被撑爆
- 测验陈述是依照excel来生成的,测验陈述的样式没有按模块差异,实践上直接打开excel就能够看到陈述成果了。
- 其他一些没有多大效果的,经过率,越过条数,经过条数,失败条数等,没有别的处理,悉数由html的陈述主动处理
- 下方截图为相关参数填写示例
常用的一些内置函数
一切的内置函数都在common/bif_functions
这个包内,用户能够自定义增加内置函数,规划内置函数一定要规划回来值,不能直接回来
None,形似没有对 None 特别处理
以下是一些内置函数讲解
- 这个MD5办法,一般都没有运用,一般都是直接excel中是否运用【参数加密办法字段开关】来处理加密
- 内置函数运用,一致是
{{xxx()}}
,能够传参数到()内,比方{{token(999)}}
- 获取一些时刻戳办法,能够带参数
- Faker 库里面的有些随机数,需求更多自己增加就行了。
用例中增加等候时刻
excel 字段中一个Time
,字段值设置为数字
,单位S
用例在履行前,需求独自履行 sql 或许履行后需求独自履行 sql,或许恳求后马上履行 sql 并断语 sql
excel 中有一个 method 字段,设置值为 sql 即可,后边的 SQL,SQL 变量字段按需填写即可,一定要契合标准填写
或许在恳求的后边填写 sql 句子及 sql 变量,都会默许先履行 sql,再履行恳求。
setup setupclass teardown tearDownClass ?
其实这套代码这些都能够不需求运用,也能够运用,定制一些初始化函数或许仅有登录这样用,做数据清晰操作?能够将sql写excel,
或许独自再excel种树立一个sheet来履行sql也是可行的,办法很多,很灵敏
postman或许swagger的文件怎样快速转为测验用例?
本结构现已封装好了解析函数,直接将postman文件导出,放到指定目录
运转excel_converter.py文件,即可得到测验用例
十分方便省劲,不必一条一条复制粘贴
替换不同的数据库?
现在内置有多种数据库查链接办法,可是尚未运用起来,仅仅将mysql运用起来了,运用者如需求运用其他如 mongoDB 这类数据库,
能够按 mysql 规划的办法去扩展这个数据库以习惯 excel测验用例编写办法,也能够联系作者处理
发送企业微信告诉
能够根据需求,自在修正企业微信发送的模板等等信息
主函数履行进口
日志打印装修器
日志打印成果示例:
根本数据
测验陈述?
html 或许 excel 中 都有,直接自行运用检查吧
企业微信测验陈述:
html测验陈述:
计算用例运转时长?
计算了每条用例从恳求发出到呼应的时长,没有计算其他时常信息,详细能够从 html 中检查
其他
- 本结构为2.0晋级版别,晋级之后的功用,现在根本上都是在 excel 中保护用例,无需测验人员编写代码,
- 和 1.0版别的差异在于,1.0版别也不需求测验人员写代码,可是断语的办法比较僵硬。
- 1.0版别现已集成到测验开发平台,能够去平台运用,详细gitee
地址:gitee.com/chenyongzhi…
独立个人信息东西介绍
直接履行main_personal_information.py
文件就能够生成十分棒的测验数据
Python随机生成个人信息, 包含姓名、性别、年纪、出生日期、身份证号、银行卡号、电话、手机号、邮箱等信息。
生成随机个人信息
PS D:\api-test-project> python .\main_personal_information.py 海省广州市南
请输入你需求生成的数据总数:10
+--------+------+------+------------+--------------------+----------------------+--------------+-------------+-------------------------+----------------------------------------+--------------------+ 门特别行政区
| 用户名 | 性别 | 年纪 | 生日 | 身份证 | 银行卡或信用卡 | 座机 | 手机号 | 邮箱 | 地址 | 一致社会信用代码 |
+--------+------+------+------------+--------------------+----------------------+--------------+-------------+-------------------------+----------------------------------------+--------------------+ 西省张家港市
| 刘世 | 男 | 57 | 1965-07-21 | 342422196507219413 | 62263745016607204 | 0744-3715089 | 14705083324 | liushi@tianya.cn | 甘肃省辽阳县沙湾海口街y座 180548 | 713101514054645086 |
| 龙清承 | 男 | 56 | 1966-08-21 | 342400196608212132 | 62284150185529051643 | 0893-4423648 | 13487550352 | longqingcheng@tianya.cn | 辽宁省玉珍市黄浦重庆街z座 401247 | 93421303115117882W |
| 刘娴 | 女 | 37 | 1985-05-23 | 411023198505239964 | 6213058212589619696 | 0562-0004972 | 17303409666 | liuxian@tianya.cn | 福建省拉萨县朝阳胡街X座 479131 | 92341122605351081N |
| 朱晨 | 男 | 55 | 1967-10-08 | 142733196710082991 | 45128971703439970 | 0375-7394954 | 18024463495 | zhuchen@139.com | 宁夏回族自治区秀云县高坪任路Q座 544781 | 955205231604137955 |
| 许天有 | 男 | 51 | 1971-10-17 | 330901197110176212 | 62592648755593670 | 0973-8733227 | 13413236004 | xutianyou@wo.cn | 辽宁省天津市南长深圳路f座 952461 | 91120114649961877C |
| 陈锦 | 女 | 29 | 1993-02-12 | 452123199302128568 | 62260020819291645 | 0915-7410180 | 17509030433 | chenjin@icloud.com | 重庆市西安市沙湾广州街G座 531384 | 92445302298701343Q |
+--------+------+------+------------+--------------------+----------------------+--------------+-------------+-------------------------+----------------------------------------+--------------------+