- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
theme: fancy
highlight: arta
接口自动化测试项目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, '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"}]
{"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自动化测试的知识和技巧,欢迎关注:
我的公众号:百态测试 。
博客( 奈非天的主页 - 博客园 (cnblogs.com) ) 。
我会不定期地分享更多的精彩内容。感谢你的阅读和支持! 。
本文来自博客园,作者: 奈非天 ,转载请注明原文链接: https://www.cnblogs.com/Nephalem-262667641/p/17460169.html 。
最后此篇关于震惊!强大的接口自动化测试框架2.0,unittest与pytest无缝穿插对接,可以像postman一样编写代码的文章就讲到这里了,如果你想了解更多关于震惊!强大的接口自动化测试框架2.0,unittest与pytest无缝穿插对接,可以像postman一样编写代码的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在尝试在我的代码库中为我正在编写的游戏服务器更多地使用接口(interface),并了解高级概念以及何时应该使用接口(interface)(我认为)。在我的例子中,我使用它们将我的包相互分离,并使
我有一个名为 Widget 的接口(interface),它在我的整个项目中都在使用。但是,它也用作名为 Widget 的组件的 Prop 。 处理此问题的最佳方法是什么?我应该更改我的 Widget
有一个接口(interface)可以是多个接口(interface)之一 interface a {x:string} interface b {y:string} interface c {z:st
我遇到了一种情况,我需要调用第三方服务来获取一些信息。这些服务对于不同的客户可能会有所不同。我的界面中有一个身份验证功能,如下所示。 interface IServiceProvider { bool
在我的例子中,“RequestHandlerProxy”是一个结构,其字段为接口(interface)“IAdapter”,接口(interface)有可能被调用的方法,该方法的输入为结构“Reque
我有一个接口(interface)Interface1,它已由类A实现,并且设置了一些私有(private)变量值,并且我将类A的对象发送到下一个接受输入作为Interface2的类。那么我怎样才能将
假设我有这样的类和接口(interface)结构: interface IService {} interface IEmailService : IService { Task SendAs
有人知道我在哪里可以找到 XML-RPC 接口(interface)的定义(在 OpenERP 7 中)?我想知道创建或获取对象需要哪些参数和对象属性。每个元素的 XML 示例也将非常有帮助。 最佳答
最近,我一直在阅读有关接口(interface)是抽象的错误概念的文章。一篇这样的帖子是http://blog.ploeh.dk/2010/12/02/InterfacesAreNotAbstract
如果我有一个由第三方实现的现有 IInterface 后代,并且我想添加辅助例程,Delphi 是否提供了任何简单的方法来实现此目的,而无需手动重定向每个接口(interface)方法?也就是说,给定
我正在尝试将 Article 数组分配给我的 Mongoose 文档,但 Typescript 似乎不喜欢这样,我不知道为什么它显示此警告/错误,表明它不可分配. 我的 Mongoose 模式和接口(
我有两个接口(interface): public interface IController { void doSomething(IEntity thing); } public inte
是否可以创建一个扩展 Serializable 接口(interface)的接口(interface)? 如果是,那么扩展接口(interface)的行为是否会像 Serilizable 接口(int
我试图在两个存储之间创建一个中间层,它从存储 A 中获取数据,将其转换为相应类型的存储 B,然后存储它。由于我需要转换大约 50-100 种类型,我希望使用 map[string]func 并根据 s
我正在处理一个要求,其中我收到一个 JSON 对象,其中包含一个日期值作为字符串。我的任务是将 Date 对象存储在数据库中。 这种东西: {"start_date": "2019-05-29", "
我们的方法的目标是为我们现有的 DAO 和模型类引入接口(interface)。模型类由各种类型的资源 ID 标识,资源 ID 不仅仅是随机数,还带有语义和行为。因此,我们必须用对象而不是原始类型来表
Collection 接口(interface)有多个方法。 List 接口(interface)扩展了 Collection 接口(interface)。它声明与 Collection 接口(int
我有一个 Java 服务器应用程序,它使用 Jackson 使用反射 API 对 DTO 进行一般序列化。例如对于这个 DTO 接口(interface): package com.acme.libr
如果我在 Kotlin 中有一个接口(interface): interface KotlinInterface { val id: String } 我可以这样实现: class MyCla
我知道Java中所有访问修饰符之间的区别。然而,有人问了我一个非常有趣的问题,我很难找到答案:Java 中的 private 接口(interface)和 public 接口(interface)有什
我是一名优秀的程序员,十分优秀!