接口自动化测试框架实战-3-文件读写封装

news2024/12/27 3:18:02

上一小节我们详细介绍了项目中所使用的接口文档,本小节我们将进入到接口测试框架第一个部分通用函数commons的开发,本小节我们重点完成文件读写方法的封装。

首先为什么要封装文件读写的方法,原因有如下几点:

  1. 读接口配置:比如我们接口的一些配置信息(域名、接口路径、账号)等我们一般都是放在config.yaml文件里,我们需要先读取到配置,后续拼接成接口的请求信息
  2. 读数据库配置:比如我们的数据库信息一般是放在db.ini文件中,我们需要先读取到配置,后续可以根据配置信息连接数据库进行取数据或者数据库字段断言
  3. 读写测试数据:比如我们的本次的接口测试数据是写在api.yaml里的,我们需要先读取数据,生成测试用例,有时候我们的api.yaml还有一些动态的模板参数需要替换,这个时候我们就需要写入文件了
  4. 读日志文件:比如有时候我们日志里记录了接口报错信息,我们需要分类读取出来,放到测试报告中或者群消息通知中来做错误告警

新建commons目录,新建files.py

files.py具体代码如下:

#files.py
import yaml
import os
import pandas as pd
import openpyxl
from configparser import ConfigParser


class FileHandler:
    """处理文件读取和写入操作的类"""

    @staticmethod
    def read_file(path):
        """根据文件路径的后缀名读取文件内容"""
        _, file_extension = os.path.splitext(path)
        file_extension = file_extension.lower()

        try:
            if file_extension == '.yaml' or file_extension == '.yml':
                with open(path, 'r', encoding='utf-8') as fp:
                    # 返回dict类型
                    return yaml.safe_load(fp)
            elif file_extension == '.ini' or file_extension == '.conf':
                config = ConfigParser()
                with open(path, 'r', encoding='utf-8') as fp:
                    config.read_file(fp)
                    return config
            elif file_extension == '.csv':
                return pd.read_csv(path)
            elif file_extension == '.xlsx':
                return pd.read_excel(path, engine='openpyxl')
            else:
                with open(path, 'r', encoding='utf-8') as fp:
                    return fp.read()
        except Exception as e:
            print(f"Error reading file {path}: {e}")
            return None

    @staticmethod
    def write_file(path, data):
        """根据文件路径的后缀名写入文件内容"""
        _, file_extension = os.path.splitext(path)
        file_extension = file_extension.lower()

        try:
            if file_extension == '.yaml' or file_extension == '.yml':
                with open(path, 'w', encoding='utf-8') as fp:
                    yaml.dump(data, fp, default_flow_style=False)
            elif file_extension == '.ini' or file_extension == '.conf':
                config = ConfigParser()
                for section, options in data.items():
                    config[section] = dict(options)
                with open(path, 'w', encoding='utf-8') as fp:
                    config.write(fp)
            elif file_extension == '.csv':
                pd.DataFrame(data).to_csv(path, index=False, encoding='utf-8')
            elif file_extension == '.xlsx':
                FileHandler._write_excel(path, data)
            else:
                with open(path, 'w', encoding='utf-8') as fp:
                    fp.write(str(data))
        except Exception as e:
            print(f"Error writing to file {path}: {e}")

    @staticmethod
    def _write_excel(path, data):
        """将数据写入Excel文件"""
        workbook = openpyxl.Workbook()
        for sheet_name, sheet_data in data.items():
            worksheet = workbook.create_sheet(sheet_name)
            for row in range(len(sheet_data)):
                for col, value in enumerate(sheet_data[row]):
                    worksheet.cell(row=row + 1, column=col + 1).value = value
        workbook.save(path)


# 示例用法
file_handler = FileHandler()

# 读取文件示例
# yaml_data = file_handler.read_file('example.yaml')
# print(type(yaml_data))
# ini_data = file_handler.read_file('example.ini')
# print(ini_data[""][""])
# conf_data = file_handler.read_file('example.conf')
# print(conf_data["database"]["host"])
# csv_data = file_handler.read_file('example.csv')
# print(csv_data)
# excel_data = file_handler.read_file('example.xlsx')
# print(excel_data)
# 写入文件示例
# yaml_data_to_write = {'key': 'value'}
# file_handler.write_file('output.yaml', yaml_data_to_write, 'yaml')
#
# config_data_to_write = {'Section1': {'Option1': 'Value1'}}
# file_handler.write_file('output.ini', config_data_to_write, 'ini')
#
# csv_data_to_write = {'Column1': [1, 2, 3], 'Column2': ['a', 'b', 'c']}
# file_handler.write_file('output.csv', csv_data_to_write, 'csv')
#
# excel_data_to_write = {
#     'Sheet1': [[1, 'a'], [2, 'b'], [3, 'c']],
#     'Sheet2': [[4, 'd'], [5, 'e'], [6, 'f']]
# }
# file_handler.write_file('output.xlsx', excel_data_to_write, 'excel')

代码逻辑讲解如下:

  1. 首先我们支持我们FileHandler类支持yaml、ini、csv、xlsx、conf、txt、log等常见文件的读写
  2. 其中pyyaml用来读写yaml文件,pandas库用来读写csv/excel文件,configparser用来读写ini/conf,

openpyxl 用来写excel文件,其余文件用python系统方法读写即可。

  1. 代码结构,一个类FileHandler,三个静态方法read_file、write_file、_write_excel
  2. 代码逻辑,读文件:先用os.path.splitext(path)取得文件路径后缀,比如yaml、ini、csv、xlsx,在根据后缀来做判断,分别调用2中对应的库方法,来进行文件数据的读取,最终返回读到的数据。写文件:和读文件类似先取后缀做判断,分别调用对应的库方法,将数据写入文件,这里excel的写入pandas库不支持,所以单独写了一个写入excel文件的方法,用openpyxl库方法来写入文件。

以上就是文件读写的封装方法,大家也可以自己找一些文件读写练习一下!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1947653.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

B站音视频分开 大小问题

音频是33331 kb,视频是374661 kb 合并之后却是2561363 kb 这可能是B站音频和视频分开的原因吧

html实现酷炫美观的可视化大屏(十种风格示例,附源码)

文章目录 完整效果演示1.蓝色流线风的可视化大屏1.1 大屏效果1.2 大屏代码1.3 大屏下载 2.地图模块风的可视化大屏2.1 大屏效果2.2 大屏代码2.3 大屏下载 3.科技轮动风的可视化大屏3.1 大屏效果3.2 大屏代码3.3 大屏下载 4.蓝色海洋风的可视化大屏4.1 大屏效果4.2 大屏代码4.3 …

深入指南:VitePress 如何自定义样式

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

边缘计算网关项目(含上报进程、32Modbus采集进程、设备搜索响应进程源码)

目录 边缘层 架构说明 包含知识点 数据上报进程 功能描述 功能开发 上报线程 数据存储线程 指令处理线程 项目源码 上报模块.c代码: 上报模块Makefile代码: STM32采集模块.c代码 设备搜索响应模块Linux部分.c代码 设备搜索响应模块Qt端代码.h …

计算机毕业设计-程序论文-高校智能排课系统

本系统开发采用技术为JSP、Bootstrap、Ajax、SSM、Java、Tomcat、Maven 此文章为本人亲自指导加编写,禁止任何人抄袭以及各类盈利性传播, 相关的代码部署论文ppt代码讲解答辩指导文件都有可私要 项目源码,请关注❥点赞收藏并私信博主&#xf…

UML通信图建模技术及应用例

新书速览|《UML 2.5基础、建模与设计实践》 在对系统的动态行为进行建模时,通信图常被用于按组织结构对控制流进行建模。与顺序图一样,一个单独的通信图只能显示一个控制流。 使用通信图建模时可以遵循如下策略: (1&#xff09…

操作系统杂项(九)

目录 一、简述sleep和wait的区别 1、sleep 2、wait 3、区别 二、简述线程池的设计思路,线程池中线程数量的决定因素 1、设计思路 2、线程池中线程数量 三、进程和线程相比,为何更慢 四、简述Linux零拷贝的原理 1、概念 2、优点 3、原理 五、…

MySQL第一阶段:多表查询、事务

继续我的MySQL之旅,继续上篇的DDL、DML、DQL、以及一些约束,该到了多表查询和事务的学习总结,以及相关的案例实现,为未来的复习以及深入的理解做好知识储备。 目录 多表查询 连接查询 内连接 外连接 子查询 事务 事务简介…

加油卡APP系统开发,线上发展优势分析

在当下社会中,汽车加油已经必不可少了,不管有什么出行计划,都需要提前给汽车加油或者中途加油。随着技术的发展,加油卡APP受到了有车一族的欢迎,大众可以在手机上给汽车加油,还能够享受诸多的优惠活动&…

python-阶乘和(赛氪OJ)

题目描述 求Sn​1!2!3!4!5!⋯n!的值,其中 𝑛n 是一个数字。输入格式: 输入一个整数 n。输出格式: 输出对应的 Sn​。 样例输入输出样例输入 5样例输出 153数据范围 对于 100% 的数据,保证1≤n≤20。来源/分类&#xff…

如何使用Python和Selenium解决reCAPTCHA

CAPTCHA已成为我们日常在线活动中重要的防御线。无论是登录账户、提交表单还是进行在线支付,CAPTCHA都在幕后保护我们的安全。然而,CAPTCHA有时可能会成为自动化的绊脚石,阻碍自动化测试、数据收集和效率提升。那么,如何以合法合理的方式绕过这些复杂的CAPTCHA挑战呢?在本文中…

导航不是GPS吗,有人用北斗吗?

在现代生活中,提到导航,人们脑海中最先浮现的往往是GPS。然而,近年来,中国自主研发的北斗导航系统(BeiDou Navigation Satellite System, BDS)正在迅速崛起,逐步占据全球导航市场的一席之地&…

2023年全国赛C题《 电容电感测量装置》设计报告

测量原理 参考下面网站的方案 bookmark 参考LCR测试仪,基本工作原理为给DUT加上正弦激励信号,然后测得该DUT两端的电压和流过DUT的电流,即可通过计算得到DUT的性质和参数。 对于一个理想电容,电流相位应该超前电容两端电压90。…

Java结合uniapp实现验证码(附Demo)

目录 前言1. Java2. uniapp 前言 对于Java的知识点推荐阅读: java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)【Java项目】实战CRUD的功能整理(持续更新) 本次的Demo主要以图片验证码的方式输入和接…

抖音矩阵管理系统功能说明:一站式掌握

在当下这个信息爆炸的时代,抖音作为短视频领域的佼佼者,其用户规模持续扩大,影响力日益增强。对于内容创作者和营销人员来说,如何高效管理抖音账号,实现内容的多平台分发和精准触达,成为了亟待解决的问题。…

【JAVA多线程】线程的状态控制

目录 1.JDK中的线程状态 2.基础操作 2.1关闭 2.2中断 2.3.等待、唤醒 2.4.阻塞、唤醒 1.JDK中的线程状态 在JDK的线程体系中线程一共6种状态: NEW(新建): 当线程对象创建后,但尚未启动时,线程处于新建状态。RUN…

代码随想录算法训练营day8 | 344.反转字符串、541.反转字符串 II、卡码网:54.替换数字

文章目录 344.反转字符串思路 541.反转字符串 II思路 卡码网:54.替换数字思路复习:字符串 vs 数组 总结 今天是字符串专题的第一天,主要是一些基础的题目 344.反转字符串 建议: 本题是字符串基础题目,就是考察 revers…

链式法则和自动求导

向量链式法则 说明: 1.第一个式子, y是标量,u是标量,x是n维向量 2.第二个式子,y是标量,u是k维向量,x是n维向量,所以y对u求导是k维的行向量,u对x求导是k行n列的矩阵&…

Node 版本控制工具 NVM 的安装和使用(Windows)

遇到了一个项目,前端的node版本很低,需要我去降低node版本才能下载依赖运行,我当然不是傻乎乎的降版本了,而是使用node版本控制工具 NVM。 NVM(Node Version Manager) nvm 是一个命令行工具,用于…

【OSS对象存储】Springboot集成阿里云OSS + 私有化部署Minio

【OSS对象存储】Springboot集成阿里云OSS 私有化部署Minio 一、摘要二、POM依赖三、配置文件四、表结构设计五、代码实现5.1 代码包结构5.2 API封装5.3 增删改查 六、扩展6.1 Minio配置https访问 一、摘要 掌握阿里云OSS、私有化部署Minio两种对象存储的使用方式运用工厂策略…