同步操作将从 TestingPlayer/Python_Unitest+ddt+excel+HTMLTestRunner+Email+dingtalk+WeChat完美接口自动化测试框架 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
接口自动化测试项目2.0
本框架主要是基于 Python + unittest + ddt + HTMLTestRunner + log + excel + mysql + 企业微信通知 + Jenkins 实现的接口自动化框架。
公司突然要求你做自动化,但是没有代码基础不知道怎么做?或者有自动化基础,但是不知道如何系统性的做自动化, 放在 excel 文件中维护,不知道如何处理多业务依赖的逻辑,又或者你想想postman一样可以给每一条测试用例编写一些代码来处理脚本,但是又不知道怎么做。 那么 gitee 中勇哥的自动化测试框架,将为你解决这些问题。
本框架不收取汾河费用,其优势在于测试人员直接编写测试用例,运行一个测试文件就可以自动执行所有测试用例。
框架主要使用 python 语言编写,结合 unittest 进行二次开发,用户仅需要在 excel 文件中编写测试用例, 编写成功之后,会自动生成测试用例的代码,零基础代码小白,也可以操作。
本框架支持多环境切换,多业务接口依赖,mysql 数据库断言和 接口响应断言,并且用例直接在 excel 文件中维护,无需编写业务代码, 本框架支持动态脚本函数扩展,可以随时内部预置函数,或者增加动态脚本,通过固定格式写法 {{fun()}} 动态调用,支持使用函数调用链:{{func.().()}} 本框架支持各类自定义的加密方法以及加签规则,无需修改任何代码,只需要在制定的文件中写入函数名即可 接口 unittest 框架生成 HTML 报告及 excel 用例执行报告,并且发送 企业微信通知/ 钉钉通知/ 邮箱通知/ 飞书通知,灵活配置。
接口自动化框架地址:点我查看
.
└── src/ // 测试用例数据文件夹
└── cases/ // 测试用例
└── test_cases.xlsx
└── templates/ // 测试用例模板
└── template.xlsx
└── files // 存放需要上传的文件
└── text1.txt
└── 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 // 数据操作类
└── encryption_rules/ // 加密规则模块
└── __init__.py
└── rules.py // 用来自定义加密函数或者类模块
└── extensions/ // 动态扩展模块目录
└── __init__.py
└── dynamic_scaling_methods.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 环境搭建自行百度
大家可以使用开源接口中的登录、个人信息、收藏(新增、查看、修改、删除)等功能,编写接口自动化案例,然后测试程序脚本 下方是接口文档地址,大家可以自行查看(因为开源的接口,里面有些逻辑性的功能,如修改被删除的网址接口并没有过多的做判断, 因此用例中只写了一些基础的场景,仅供大家参考。)
下面是一个关于一个用例中的所有字段,字段不是全部必填 下面对每一个字段的作用,做出解释:
YES/yes
,则不运行这条用例get/post/put/patch
等等/test/api/get/{{id}}/{{func(*args,**kwargs)}}
{"Content-Type":"application/json","token":"{{token}}",'time':'{{timestamp()}}'}
MD5\sha1\自定义的函数名称
等json,file,params,data
等等这几种{"projectId":"{{projectId}}","tvSequence":"{{random_string()}}"}
# 可以写类,可以写函数,可以直接普通python语句,
def setup(pm):
print("获取pm的属性,包含完整的请求信息或者响应信息", pm.get_variables)
print("处理请或者响应代码xxxxxxxxxxxx")
print("获取所有的临时变量", pm.get_environments())
print("将变量存到临时变量表中以便后续用例{{key}}使用", pm.update_environments("key", "value"))
print("将函数存到临时变量表,以便后面调用{{setup_func()}}也可以", pm.update_environments("setup_func", setup))
# 调用方法
setup(pm)
MD5\sha1\自定义的函数名称
等{"k": "$.projectId", "x": "$.data[0].age[3].a"}
{"k": "$.data", "x": "$.data[0].age[3].a"}
r'"id": (\d+), "name": "(\w+)",'
["a", "b"]
,则表示用a,b 变量接收上面的正则表达式的返回值name=data[0].name;ok=data[0].id;an=data[0].age[3].a
{
"select": {
"select_name": "SELECT username, password AS pwd FROM lea.user WHERE id <200 limit 2;",
"select_password": "SELECT username, password AS pwd FROM lea.user WHERE id <200 limit 2;",
"select_all": "SELECT username, password,age,email FROM lea.user WHERE id <200 limit 2;"
},
"write": {
"update_one": "UPDATE table_name SET column1=value1 WHERE condition",
"insert_one": "INSERT INTO table_name (column1, column2) VALUES (value1, value2)",
"delete_one": "DELETE FROM table_name WHERE condition"
}
}
{"name": "$.select.select_data.name", "age": "$.select.select_data.age"}
[{"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:实际值是以期望值结束"
}
开始填写测试用例前,先看看这个init表的字段,下面我会统一讲解:
cases
文件夹下方创建被测模块或者系统,然后在系统下创建相关的 excel
用例(可以复制模板excel文件来填写测试用例)common\config
文件中的 TEST_CASE
修改一下即可common\config.py
中的 钉钉,邮箱,企业微信机器人等信息.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测试报告
所有的内置函数都在 common/bif_functions
这个包内,用户可以自定义添加内置函数,设计内置函数一定要设计返回值,不能直接返回
None,貌似没有对 None 特殊处理
以下是一些内置函数讲解
自定义函数的编写方式:
{{xxx()}}
,可以传参数到()内,比如 {{token(999)}}
,也可以使用调用链,比如dat = {
"a": "{{var_a}}", # 调用提取到的依赖参数
"b": {"c": "{{var_c}}", "d": "{{var_d}}", "e": ["{{var_e_1}}", "{{var_e_2}}"]},
"f": "{{var_f}}[1]",
"g": "{{var_g}}",
"t": "{{get_timestamp()}}", # 调用自定义函数不传参数
"fk": "{{fk().email()}}", # 调用内置 faker 库,不传参数
"ft": "{{fk().ean(length=13)}}", # 调用内置 faker 库 并传入参数
"st": "{{ms_fmt_hms(2000)}}", # 调用自定义函数并传参数
"time": "{{random_id_card()}}",
"x":'{"a":"b","c":"{{get_timestamp()}}"}'
}
excel 字段中一个 Time
,字段值设置为 数字
,单位S
excel 中有一个 method 字段,设置值为 sql 即可,后面的 SQL,SQL 变量字段按需填写即可,一定要符合规范填写 或者在请求的后面填写 sql 语句及 sql 变量,都会默认先执行 sql,再执行请求。
其实这套代码这些都可以不需要使用,也可以使用,定制一些初始化函数或者唯一登录这样用,做数据清晰操作?可以将sql写excel, 或者单独再excel种建立一个sheet来执行sql也是可行的,方法很多,很灵活
本框架已经封装好了解析函数,直接将postman文件导出,放到指定目录 运行excel_converter.py文件,即可得到测试用例 非常快捷省事,不用一条一条复制粘贴
目前内置有多种数据库查链接方式,但是尚未使用起来,只是将mysql使用起来了,使用者如需要使用其他如 mongoDB 这类数据库, 可以按 mysql 设计的方式去扩展这个数据库以适应 excel测试用例编写方式,也可以联系作者处理
可以根据需要,自由修改企业微信发送的模板等等信息
html 或者 excel 中 都有,直接自行使用查看吧
统计了每条用例从请求发出到响应的时长,没有统计其他时常信息,具体可以从 html 中查看
直接执行 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 |
+--------+------+------+------------+--------------------+----------------------+--------------+-------------+-------------------------+----------------------------------------+--------------------+
如果这个库有帮助到你并且你很想支持库的后续开发和维护,那么你可以扫描下方二维码随意打赏我,我将不胜感激
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。