资深测试总结,接口自动化测试常用配置文件(超细整理)

目录:导读

    • 前言
    • 一、Python编程入门到精通
    • 二、接口自动化项目实战
    • 三、Web自动化项目实战
    • 四、App自动化项目实战
    • 五、一线大厂简历
    • 六、测试开发DevOps体系
    • 七、常用自动化测试工具
    • 八、JMeter性能测试
    • 九、总结(尾部小惊喜)


前言

1、常用的配置文件类型

在做自动化测试中,配置文件常用的有2种。

第一种是.ini文件,实际上.ini文件是Initialization file的缩写,即为初始化文件,是Windows系统配置文件所采用的存储格式,统管Windows的各项配置,用户可以通过修改对应的*.ini文件来实现不同的初始化配置

第二种是yaml文件,YML文件格式是YAML (YAML Aint Markup Language)编写的文件格式,YAML是一种直观的能够被电脑识别的的数据数据序列化格式。

2、ini文件

1)什么是ini

ini文件是Initialization File的缩写,即初始化文件,通常存放的是一个程序的初始化信息,是Windows的系统配置文件所采用的存储格式,统管windows的各项配置。ini文件的后缀名不一定是.ini,也可以是.cfg、.conf或者是.tx*。

优点:
通用格式,格式简单

缺点:
不适合存储大量数据

2)ini文件格式&语法规范

ini文件由若干个节(section)组成,每个section由若干键(Key)组成,每个Key可以赋相应的值。读写ini文件实际上就是读写某个的section中相应的Key的值,而这只要借助几个函数即可完成。

参数(Parameter)
ini文件包含的最基本元素是参数,参数包含参数名(name)和参数值(value),格式如下:

name=value

节(section)
所有的参数都是以节为单位结合在一起。节名称独占一行,在节声明后的所有的参数都属于该节。节没有结束标识符,一个section的开始就是上一个section的结束。格式如下:

[section]

注释(comments)
注释用分号;表示,放在注释之前,;号后直到行尾均为注释。示例如下:

;i wish nothing but the best for you

文件实例

[owner]
name=WU yanzu
organization=The United Nations
[UserConfig]
OpenDownloadFileAtOnec=Y
WindowStyle=DevExpress Dark Style
[Language]
Language=CHS
[AutoUpdate]
Version=2.10  ;last version:2.08

注意点

[section]不能重复
同一个[section]key不能重复
等号前后不要用空格
默认类型为字符串
添加、删除、修改只是对内存进行修改,并不会修改实际文件

3)ini文件操作

# 导入包
from configparser import ConfigParser
# 实例化
conf = ConfigParser()
conf.read(‘test.ini’, encoding=“utf-8)
# 掌握
# 获取所有section
sections = conf.sections()
# 获取指定section下所有的key
keys = conf.options(‘log1’)
# 获取指定section下所有的key,value
val_list = conf.items(‘your_section’)
# 获取指定section指定key的值
# 默认读取str
value = conf.get(‘your_section’,’key’)
# 获取布尔值
booleans = conf.getboolean(‘your_section’,’key1’)
# 获取数字为int
number = conf.getint(‘your_section’,’key1’)
# 获取数字类型小数
float = conf.getfloat(‘your_section’,’key1’)
# 了解
# 添加sections(操作内存)
conf.add_section(‘your_section’)
# 添加key,val(操作内存)
conf.set(‘your_section’,’key22’,’val22’)
# 删除(操作内存)
conf.remove_option(‘your_section’, “key1”)
# 写入文件
# 将你内存你的数据全部写入文件进行覆盖,conf初始化的时候读取的是所有对象
conf.write(fp=open(file=file_path,mode=’w’))
import configparser
"""读取ini文件中节点/选项/选项值"""
config = configparser.ConfigParser()
config.read("config.ini")
"""读取ini文件所有的节点"""
selections = config.sections()
print(f"文件中所有的节点:{selections}", type(selections))
print("--------------------------------------------------")
"""获取每个节点下的选线"""
for selection in selections:
    options = config.options(selection)
    print(f"{selection}节点所有的选项:{options}", type(options))
    """获取选项值"""
    for option in options:
        value = config.get(selection,option)
        print(f"{selection}节点{option}选项的值:{value}")
print("--------------------------------------------------")
"""获取指定节点下的所有options"""
options = config.options("server")
print(f"获取指定节点(server)下的选项:{options}", type(options))
print("--------------------------------------------------")
"""获取指定节点指定选项的值"""
value = config.get(section="server",option="ip")
print(f"获取指定节点(server)下的(ip)的值:{value}")
print("--------------------------------------------------")
"""判断是否有指定的selection"""
print(f"判断是否有指定的server节点:", config.has_section("server"))
print("--------------------------------------------------")
"""判断是否有指定的option"""
print(f"判断在在指定的节点server下是否有指定的ip选项:", config.has_option("server", "ip"))
print("--------------------------------------------------")
config1 = configparser.ConfigParser()
with open("config.ini", "a+") as file:
    """添加节点"""
    config1.add_section("data")
    """添加选项以及选项值"""
    config1.set(section="data", option="TestName", value="Test01")
    config1.set(section="data", option="TestPassWd", value="12345678")
    """移除选项"""
    config1.remove_option(section="data",option="TestPassWd")
    """移除节点"""
    config1.remove_section(section="data")
    config1.write(file)
from configparser import ConfigParser
import os
"""
继承ConfigParser类
然后初始化编码格式
"""
class ReadConf(ConfigParser):
    def __init__(self,file_path):
        super().__init__()
        self.read(filenames=file_path,encoding='utf-8')
file_path = os.path.join(os.path.dirname(__file__), 'test.ini')
conf=ReadConf(file_path=file_path)
#使用直接导入conf实例
from confFile.conffengzhuang import conf
values = conf.options('log1')
print(values)
# 输出:['key1', 'key2']

3、yaml文件

1)什么是yaml

YAML是一种广泛使用的语言,用于跨不同语言和框架的配置文件。专注于简化XML的XML人员名单帮助生成Common XML,这是一个功能强大的XML子集,为XML创建了数据序列化的替代方案,特别是与Python ,Perl和Ruby。

它的可读性和可编辑性感觉比json高,支持C++强类型。YAML文件可视为二维。有些库支持配置引用。有些库支持配置引用。

优点:
配置有序,容易阅读。
支持数组,数组中的元素可以是基本数据类型或者对象。
简洁方便,容易与脚本语言交互。
以数据为核心,重数据轻格式。
支持所有编程语言以及支持跨平台

缺点:
不支持 @PropertySource 注解导入自定义的 YAML 配置

2)yaml文件格式&语法格式

yaml特点:
大小写敏感
使用缩进表示层级关系
禁止使用tab键,只能使用空格键
缩进长度无限制,只要是对齐的就算是同一个层级
字符串可以不用引号标注
使用#进行注释
一个yaml文件对外只能有一个类型(读出来要么是dict,要么是list)
可一次性读取全部数据
读取出来的是python对象,可以直接使用

支持数据类型:
字典
通过(:)来连接,冒号后面要带一个空格
key: val
列表
使用连接字符(-)表示,- 后面要带一个空格

hello:
scalar、纯量
字符串、数字、布尔值、不可变数据类型文件实例
yaml文件操作
安装包
pip install pyyaml
导入包
import yaml

3)yaml文件操作
安装包
pip install pyyaml
导入包
import yaml

import yaml
def get_yaml_data(yaml_file):
    print("*****获取yaml数据*****")
    with open(yaml_file, encoding='utf-8') as file:
        content = file.read()
        print(content)
        print(type(content))
        print("*****转换yaml数据为字典或列表*****")
        # 设置Loader=yaml.FullLoader忽略YAMLLoadWarning警告
        data = yaml.load(content, Loader=yaml.FullLoader)
        print(data)
        print(type(data))
        print(data.get('my'))  # 类型为字典 <class 'dict'> # print(data[0]["model"]) # 若类型为列表 <class 'list'>
if __name__ == "__main__":
    get_yaml_data("config.yaml")

yaml键值对:即python中的字典

user: my
pwd: 1111
*****获取yaml数据*****
# yaml键值对:即python中的字典
user: my
pwd: 1111
<class 'str'>
*****转换yaml数据为字典或列表*****
{'user': 'my', 'pwd': 1111}
<class 'dict'>
my

yaml键值对嵌套:即python中的字典嵌套字典

user1:
  name: a
  pwd: 111222
user2:
  name: b
  pwd: 222333
*****获取yaml数据*****
user1:
  name: a
  pwd: 111222
user2:
  name: b
  pwd: 222333
<class 'str'>
*****转换yaml数据为字典或列表*****
{'user1': {'name': 'a', 'pwd': 111222}, 'user2': {'name': 'b', 'pwd': 222333}}
<class 'dict'>
{'name': 'a', 'pwd': 111222}

yaml键值对中嵌套数组

user3:
  - a
  - b
user4:
  - d
  - e
*****获取yaml数据*****
user3:
  - a
  - b
user4:
  - d
  - e
<class 'str'>
*****转换yaml数据为字典或列表*****
{'user3': ['a', 'b'], 'user4': ['d', 'e']}
<class 'dict'>
['a', 'b']

yaml中纯量

s_val: hello world
num_val: 15
bol_val: true
nul_val: null
data_val: 2023-08-17
*****获取yaml数据*****
s_val: hello world
num_val: 15
bol_val: true
nul_val: null
data_val: 2023-08-17
<class 'str'>
*****转换yaml数据为字典或列表*****
{'s_val': 'hello world', 'num_val': 15, 'bol_val': True, 'nul_val': None, 'data_val': datetime.date(2023, 8, 17)}
<class 'dict'>
hello world

yaml写入一组数据

current_path = os.getcwd()
path = os.path.join(current_path, 'config.yaml')
aproject = {'name': 'Silenthand Olleander',
            'race': '哈哈哈黑',
            'traits': ['ONE_HAND', 'ONE_EYE']
            }
# 写
with open(path, 'w', encoding='utf-8')as f1:
    # 字符串写入yaml中
    yaml.dump(aproject, f1, default_flow_style=False, encoding='utf-8', allow_unicode=True)
# 读
with open(path, 'r', encoding='utf-8')as f2:
    # 读取,此时读取出来的是字符串
    data = f2.read()
    # 将读取的内容转化成字典
    # 添加Loader=yaml.FullLoader,不然会有warning
    result = yaml.load(data, Loader=yaml.FullLoader)
    print(result)

yaml写入多组数据

import yaml
import os
current_path = os.getcwd()
path = os.path.join(current_path, 'config.yaml')
user1 = {
    'name': '张三',
    'age': 18,
    'like': {'kecheng': '语文','yundong': '跑步'}
}
user2 = {
    'name': '李四',
    'age': 17,
    'like': {'kecheng': '数学','yundong': '跳高'}
}
# 写
with open(path, 'w', encoding='utf-8')as f1:
    # 字符串写入yaml中
    yaml.dump_all([user1, user2], f1, default_flow_style=False, encoding='utf-8', allow_unicode=True)
# 读
with open(path, 'r', encoding='utf-8')as f2:
    data = f2.read()
    # 添加Loader=yaml.FullLoader,不然会有warning
    result = yaml.load_all(data, Loader=yaml.FullLoader)
    for i in result:
        print(i)
import yaml, os
class YamlUtil():
    def __init__(self, yaml_path):
        self.yaml_path = yaml_path
    def get_yml_data(self, is_modify=False, *key_names):
        """
        读取yaml配置文件并根据对应层级的key获取对应的value
        适用于两层数据
        :param: key_names: 需要查询的yaml文件的key关键字,从左向右依次
        :return: result: 根据key值返回对应value,不传key则直接返回所有, 没有对应key则返回None
        """
        with open(self.yaml_path, "r", encoding="utf-8") as f:
            content = f.read()
        yaml_content = yaml.safe_load(content)
        if is_modify:
            return yaml_content
        try:
            for key_name in key_names:
                yaml_content = yaml_content.get(key_name, None)
            return yaml_content
        except Exception as e:
            print(f"get_yml_data error:{e}")
            return None
    def set_yaml_data(self, value, *key_names):
        """
        设置yaml文件中的相关属性
        :param: value:修改后的值
        :param: key_names: 需要修改的yaml文件的key关键字,从左向右依次
        """
        yaml_content = self.get_yml_data(True, key_names)
        print(f'yaml_content:before:{yaml_content}')
        key_name = ''
        for item in list([[item] for item in key_names]):
            key_name += str(item)
        print(f'key_name:{key_name}')
        command = "yaml_content" + key_name + '=' + str(value)
        print(f'command:{command}')
        # exec:将字符串转换成python代码执行
        exec(command)
        print(f'yaml_content:after:{yaml_content}')
        with open(self.yaml_path, mode='w', encoding='utf-8') as f:
            f.write(yaml.safe_dump(yaml_content))
if __name__ == '__main__':
    YAML_PATH = os.path.join(os.path.dirname(__file__), 'config.yaml')
    yamlUtil = YamlUtil(YAML_PATH)
    print(yamlUtil.get_yml_data("test1", "test2-1"))
    print(yamlUtil.get_yml_data("test1", "test2-3", "test3-1"))
    yamlUtil.set_yaml_data(1234, "test1", "test2-1")
    yamlUtil.set_yaml_data(111, "test1", "test2-3", "test3-1")

一般在使用配置文件的时候,会采用ini文件,在测试数据上会采用yaml文件。同时在大部分的情况下,对于ini文件和yaml文件主要是以读取数据的操作为主,很少会对文件进行增删改操作。

下面是我整理的2023年最全的软件测试工程师学习知识架构体系图

一、Python编程入门到精通

请添加图片描述

二、接口自动化项目实战

请添加图片描述

三、Web自动化项目实战

请添加图片描述

四、App自动化项目实战

请添加图片描述

五、一线大厂简历

请添加图片描述

六、测试开发DevOps体系

请添加图片描述

七、常用自动化测试工具

请添加图片描述

八、JMeter性能测试

请添加图片描述

九、总结(尾部小惊喜)

坚持努力,放飞梦想,每一次坚韧的奋斗都是通往成功的阶梯,只要心怀信念,勇敢迈向前,终将收获属于自己的辉煌时刻。

在人生的道路上,坚持奋斗,勇敢前行,即使困难重重,也要坚定信念,不放弃希望,因为每一份努力都将迎来更美好的明天。

勇敢面对挑战,努力拼搏,相信自己的能力,坚持不懈地追逐梦想,只有不停地前行,才能到达心中向往的成功之地。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

经典查找算法

经典的查找算法有几种&#xff0c;它们适用于不同的场景和数据结构。以下是一些常见的经典查找算法&#xff1a; 1. **线性查找&#xff08;Linear Search&#xff09;**&#xff1a;线性查找是一种简单直观的查找算法&#xff0c;它按顺序检查数组或列表中的每个元素&#xf…

javascript基础入门

1.第一个javascript程序 javascript程序不能够独立的运行&#xff0c;必须依赖于HTML文件&#xff0c;type属性值用来说明脚本的类型&#xff0c;这里 是指使用javascript编写的文本文件&#xff1b; 2.alert警告框 alert&#xff08;&#xff09;函数显示一条指定的信息&am…

07 外键和表关联关系

文章目录 外键约束表关联关系E-R模型图表关联查询 外键约束 约束 : 约束是一种限制&#xff0c;它通过对表的行或列的数据做出限制&#xff0c;来确保表的数据的完整性、关联性foreign key 功能 : 建立表与表之间的某种约束的关系&#xff0c;由于这种关系的存在&#xff0c;能…

论文翻译:一种基于强化学习的车辆队列控制策略,用于减少交通振荡中的能量消耗

A Reinforcement Learning-Based Vehicle Platoon Control Strategy for Reducing Energy Consumption in Traffic Oscillations 一种基于强化学习的车辆队列控制策略&#xff0c;用于减少交通振荡中的能量消耗 文章目录 A Reinforcement Learning-Based Vehicle Platoon Cont…

基础50刷题之一(交替合并字符串)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、题目二、力扣官方题解&#xff08;双指针&#xff09;三、文心一言解释总结 前言 刚上研一&#xff0c;有人劝我好好学C&#xff0c;当时用的不多就没学&a…

快速上手:剧本杀dm预约平台小程序的制作流程

在当今的娱乐市场中&#xff0c;剧本杀已经成为一种备受欢迎的娱乐方式。为了给玩家提供更好的服务和体验&#xff0c;开发一个剧本杀DM预约平台小程序是至关重要的。下面&#xff0c;我们将详细介绍如何使用乔拓云第三方平台开发这样一个预约平台。 首先&#xff0c;打开乔拓云…

HarmonyOS 数据持久化之首选项 preferences

接下来 我们来说说数据持久化的问题 我们平时处理的数据都是在内存中处理的 我们应用一点重启 所有数据都消失了 肯恩是不符合一些场景的 harmonyos中 提供了比较多的解决方案 最多的两种是 用户首选项 关系型数据库 本文的话 我们就来看看 用户首选项 首先&#xff0c;什么…

Matlab在同一张图中如何加入多个图例

根据代码最终画出的图片如下&#xff1a; 其实原理很简单&#xff0c;就是在一张figure中画多个坐标轴&#xff0c;每个坐标轴都有对应的图例&#xff0c;之后再将多余坐标轴隐藏&#xff0c;只保留一个即可。 代码如下&#xff1a; clear all; close all;dd_linewidth 1;a …

VR全景数字工厂,制造业企业线上营销新助手

VR全景技术逐渐渗透到各行各业&#xff0c;其中&#xff0c;很多实体工厂的线上营销宣传也借助720云VR全景技术也迎来了新的变革。 一、VR全景技术的独特魅力 VR全景技术是一种基于虚拟现实技术的全新视觉呈现方式&#xff0c;能够为用户带来身临其境的沉浸式体验。通过VR全景…

Docker容器化解决方案(镜像,容器的操作管理)

Docker镜像管理 搜索官方仓库镜像 docker search [rootlocalhost ~]# docker search nginx NAME DESCRIPTION STARS OFFICIAL nginx Official build of Nginx. …

计算机mfc140.dll文件缺失的修复方法分析,一键修复mfc140.dll

电脑显示mfc140.dll文件缺失信息时&#xff0c;不必担心&#xff0c;这通常是个容易解决的小问题。接下来让我们详细探究并解决mfc140.dll文件缺失的状况。以下将详述相应的解决方案&#xff0c;从而帮助您轻松克服这一技术难题。通过几个简单步骤&#xff0c;即可恢复正常使用…

C语言项目实战——贪吃蛇

C语言实现贪吃蛇 前言一、 游戏背景二、游戏效果演示三、课程目标四、项目定位五、技术要点六、Win32 API介绍6.1 Win32 API6.2 控制台程序6.3 控制台屏幕上的坐标COORD6.4 GetStdHandle6.5 GetConsoleCursorInfo6.5.1 CONSOLE_CURSOR_INFO 6.6 SetConsoleCursorInfo6.7 SetCon…

LeetCode每日一题只 快乐数

目录 题目介绍&#xff1a; 算法原理&#xff1a; 鸽巢原理&#xff1a; 如何找到环里元素&#xff1a; 代码实现&#xff1a; 题目介绍&#xff1a; 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 算法原理&#xff1a; 我先简单举两个例子&#xff…

python大数据分析游戏行业中的 Apache Kafka:用例 + 架构!

python大数据分析游戏行业中的 Apache Kafka&#xff1a;用例 架构&#xff01; 这篇博文探讨了使用 Apache Kafka 的事件流如何提供可扩展、可靠且高效的基础设施&#xff0c;让游戏玩家开心并让游戏公司取得成功。讨论了游戏行业中的各种用例和架构&#xff0c;包括在线和移…

day04-SpringBootWeb入门

一、SpringBootWeb快速入门 1 需求 需求&#xff1a;基于 SpringBoot 的方式开发一个 web 应用&#xff0c;浏览器发起请求 /hello后&#xff0c;给浏览器返回字符串“Hello World ~”。 2 开发步骤 第1步&#xff1a;创建 SpringBoot 工程项目 第2步&#xff1a;定义 HelloC…

2024年k8s最新版本安装教程

k8s安装教程 1 k8s介绍2 环境搭建2.1 主机准备2.2 主机初始化2.2.1 安装wget2.2.2 更换yum源2.2.3 常用软件安装2.2.4 关闭防火墙2.2.5 关闭selinux2.2.6 关闭 swap2.2.7 同步时间2.2.8 修改Linux内核参数2.2.9 配置ipvs功能 2.3 容器安装2.3.1 设置软件yum源2.3.2 安装docker软…

Claude3、Gemini、Sora VS GPT-4:AI技术如何助力科研与产业发展?

【最新增加Claude3、Gemini、Sora、GPTs讲解及AI领域中的集中大模型的最新技术】 2023年随着OpenAI开发者大会的召开&#xff0c;最重磅更新当属GPTs&#xff0c;多模态API&#xff0c;未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义&#xff0c;不亚…

【Java EE】文件内容的读写⸺数据流

目录 &#x1f334;数据流的概念&#x1f338;数据流分类 &#x1f333;字节流的读写&#x1f338;InputStream&#xff08;从文件中读取字节内容)&#x1f33b;示例1&#x1f33b;示例2&#x1f33b;利用 Scanner 进行字符读取 &#x1f338;OutputStream(向文件中写内容&…

阿里云重新更新系统导致秘钥失效

报错解决方案&#xff1a; ssh-keygen -f "/Users/pengzhanliang/.ssh/known_hosts" -R "39.105.149.49"这个命令会从~/.ssh/known_hosts文件中移除与IP地址39.105.149.49相关的所有条目 再次尝试连接到远程服务器。这次&#xff0c;SSH将提示您接受新的主…

简单、透明、安全、高度集成!龙蜥可信 SBOM 能力探索与实践

近两年&#xff0c;软件供应链有非常多安全事件&#xff0c;包括软件供应链的各个阶段开发、构建、交付、使用等每个环节都有很多的软件供应链的安全事件发生。在 2023 龙蜥操作系统大会全面建设安全生态分论坛上&#xff0c;阿里云技术专家郑耿、周彭晨分享了龙蜥社区在构建 S…