接口自动化测试项目2.0
本框架主要是基于 Python + unittest + ddt + HTMLTestRunner + log + excel + mysql + 企业微信通知 + Jenkins 实现的接口自动化框架。
公司突然要求你做自动化,但是没有代码基础不知道怎么做?或者有自动化基础,但是不知道如何系统性的做自动化, 放在 excel 文件中维护,不知道如何处理多业务依赖的逻辑,又或者你想想postman一样可以给每一条测试用例编写一些代码来处理脚本,但是又不知道怎么做。 那么 gitee 中勇哥的自动化测试框架,将为你解决这些问题。
本框架不收取汾河费用,其优势在于测试人员直接编写测试用例,运行一个测试文件就可以自动执行所有测试用例。
框架主要使用 python 语言编写,结合 unittest 进行二次开发,用户仅需要在 excel 文件中编写测试用例, 编写成功之后,会自动生成测试用例的代码,零基础代码小白,也可以操作。
本框架支持多环境切换,多业务接口依赖,mysql 数据库断言和 接口响应断言,并且用例直接在 excel 文件中维护,无需编写业务代码, 本框架支持动态脚本函数扩展,可以随时内部预置函数,或者增加动态脚本,通过固定格式写法 {{fun()}} 动态调用 接口 unittest 框架生成 HTML 报告及 excel 用例执行报告,并且发送 企业微信通知/ 钉钉通知/ 邮箱通知/ 飞书通知,灵活配置。
.
└── 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 环境搭建自行百度
大家可以使用开源接口中的登录、个人信息、收藏(新增、查看、修改、删除)等功能,编写接口自动化案例,然后测试程序脚本 下方是接口文档地址,大家可以自行查看(因为开源的接口,里面有些逻辑性的功能,如修改被删除的网址接口并没有过多的做判断, 因此用例中只写了一些基础的场景,仅供大家参考。)
下面是一个关于一个用例中的所有字段,字段不是全部必填 下面对每一个字段的作用,做出解释:
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(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)
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
{
"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';"
}
}
{"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.py
文件中test_script/
文件夹,在该文件夹下操作 test_api.py
文件将 test_file
变量地址替换为刚刚填写的测试用例地址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)}}
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测试报告: 样式一 样式二
统计了每条用例从请求发出到响应的时长,没有统计其他时常信息,具体可以从 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 |
+--------+------+------+------------+--------------------+----------------------+--------------+-------------+-------------------------+----------------------------------------+--------------------+
如果你对Python感兴趣,想要学习python,这里给大家分享一份Python全套学习资料,都是我自己学习时整理的,希望可以帮到你,一起加油!
😝有需要的小伙伴,可以V扫描下方二维码免费领取🆓
对于从来没有接触过Python的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
还有很多适合0基础入门的学习视频,有了这些视频,轻轻松松上手Python~
每节视频课后,都有对应的练习题哦,可以检验学习成果哈哈!
学习Python常用的开发软件都在这里了!每个都有详细的安装教程,保证你可以安装成功哦!
光学理论是没用的,要学会跟着一起敲代码,动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。100+实战案例源码等你来拿!
如果觉得上面的实战案例有点枯燥,可以试试自己用Python编写小游戏,让你的学习过程中增添一点趣味!
我们学会了Python之后,有了技能就可以出去找工作啦!下面这些面试题是都来自阿里、腾讯、字节等一线互联网大厂,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
上述所有资料 ?? ,朋友们如果有需要的,可以扫描下方👇👇👇二维码免费领取🆓