接口自动化测试项目2.0
本框架主要是基于 Python + unittest + ddt + HTMLTestRunner + log + excel + mysql + 企业微信通知 + Jenkins 实现的接口自动化框架。
公司突然要求你做自动化,但是没有代码基础不知道怎么做?或者有自动化基础,但是不知道如何系统性的做自动化, 放在 excel 文件中维护,不知道如何处理多业务依赖的逻辑,又或者你想想postman一样可以给每一条测试用例编写一些代码来处理脚本,但是又不知道怎么做。 那么 gitee 中我的自动化测试框架,将为你解决这些问题。
本框架不收取汾河费用,其优势在于测试人员直接编写测试用例,运行一个测试文件就可以自动执行所有测试用例。
框架主要使用 python 语言编写,结合 unittest 进行二次开发,用户仅需要在 excel 文件中编写测试用例, 编写成功之后,会自动生成测试用例的代码,零基础代码小白,也可以操作。
本框架支持多环境切换,多业务接口依赖,mysql 数据库断言和 接口响应断言,并且用例直接在 excel 文件中维护,无需编写业务代码, 本框架支持动态脚本函数扩展,可以随时内部预置函数,或者增加动态脚本,通过固定格式写法 {{fun()}} 动态调用 接口 unittest 框架生成 HTML 报告及 excel 用例执行报告,并且发送 企业微信通知/ 钉钉通知/ 邮箱通知/ 飞书通知,灵活配置。
接口自动化框架地址:入群自取:微信:Testing_player
. └── 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, '[email protected]');" }, "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 | [email protected] | 甘肃省辽阳县沙湾海口街y座 180548 | 713101514054645086 | | 龙清承 | 男 | 56 | 1966-08-21 | 342400196608212132 | 62284150185529051643 | 0893-4423648 | 13487550352 | [email protected] | 辽宁省玉珍市黄浦重庆街z座 401247 | 93421303115117882W | | 刘娴 | 女 | 37 | 1985-05-23 | 411023198505239964 | 6213058212589619696 | 0562-0004972 | 17303409666 | [email protected] | 福建省拉萨县朝阳胡街X座 479131 | 92341122605351081N | | 朱晨 | 男 | 55 | 1967-10-08 | 142733196710082991 | 45128971703439970 | 0375-7394954 | 18024463495 | [email protected] | 宁夏回族自治区秀云县高坪任路Q座 544781 | 955205231604137955 | | 许天有 | 男 | 51 | 1971-10-17 | 330901197110176212 | 62592648755593670 | 0973-8733227 | 13413236004 | [email protected] | 辽宁省天津市南长深圳路f座 952461 | 91120114649961877C | | 陈锦 | 女 | 29 | 1993-02-12 | 452123199302128568 | 62260020819291645 | 0915-7410180 | 17509030433 | [email protected] | 重庆市西安市沙湾广州街G座 531384 | 92445302298701343Q | +--------+------+------+------------+--------------------+----------------------+--------------+-------------+-------------------------+----------------------------------------+--------------------+
以上就是我今天为各位小伙伴准备的内容,如果你想了解更多关于Python自动化测试的知识和技巧,欢迎关注哦!
【留言777】
各位想获取源码等教程资料的朋友请点赞 + 评论 + 收藏,三连!
三连之后我会在评论区挨个私信发给你们~