项目介绍
接口主动化测验项目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 库里面的有些随机数,需求更多自己增加就行了。

用例中增加等候时刻
用例在履行前,需求独自履行 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 |
+--------+------+------+------------+--------------------+----------------------+--------------+-------------+-------------------------+----------------------------------------+--------------------+














