Ⅰ 二、SpringBoot的配置--yaml
SpringBoot使用一个全局的配置文件,配置文件名是固定的;
配置文件的作用:修改SpringBoot自动配置的默认值;SpringBoot在底层都给我们自动配置好;
YAML 是一个标记语言
标记语言:
以前的配置文件;大多都使用的是xxx.xml文件
YAML:以数据为中心,比json、xml等更适合做配置文件
YAML:配置例子
XML:
k:(空格)v : 表示一对键值对(空格必须有)
以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级的
属性和值也是大小写敏感;
k: v :字面直接来写;
字符串默认不用加上单引号或者双引号;
"" :双引号;不会转义字符串里面的特殊字符; 特殊字符会作为本身想表示的意思
name : "zhangsan lisi" :输出 : zhangsan 换行 lisi
'' :单引号;会转义特殊字符,特殊字符最终只是一个普通的字符串数据
name: 'zhangsan lisi' : 输出 ; zhangsan lisi
k: v : 在下一行来写对象的属性和值的关系 ;注意缩进
对象还是 k: v 的方式
行内写法:
用- 值表示数组中的一个元素
行内写法
配置文件
javaBean:
我们可以导入配置文件处理器,以后编写配置就有提示了
调整 图示:
配置文件yml还是properties他们都能获取到值;
如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value
如果说,我们专门编写一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties
@ImportResource:导入Spring的配置文件,让配置文件里面的内容生效
SpringBoot里面没有Spring的配置文件,我们自己编写的配置文件,也不能自动识别;
想让Spring的配置文件生效,加载进来;@ImportResource标注在一个配置类上
不来编写Spring的配置文件
Spring Boot推荐给容器添加组件的方式;推荐全注解的方式
1、配置类@Configuration------>Spring配置文件
2、使用@Bean给容器中添加组件
我们在主配置文件编写的时候,文件名可以是application-{profile}.properties/yml
默认使用application.properties的配置
1、在配置文件中指定spring.profiles.active=dev
2、在命令行:
java -jar spring-boot-02-config.jar --spring.profiles.active=dev;
可以直接在测试的时候,配置传入命令行参数
3.虚拟机参数
-Dspring.profiles.active=dev
springboot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring Boot的默认配置文件
-file:./config/
-file:./
-classpath:/config/
-classpath:/
优先级由高到低,高优先级的配置会覆盖低优先级的配置
SpringBoot会从这四个位置加载主配置文件:互补配置
==我们还可以通过spring.config.location来改变默认的配置文件位置==
项目打包好以后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置;指定配置文件和默认加载的这些配置文件共同起作用互补配置;
java -jar spring-boot-02-config.jar --spring.config.location=G:/application.properties
==SpringBoot也可以从以下位置加载配置;优先级从高到低;高优先级的配置低优先级的配置,所有的配置会形成互补配置==
1.命令行参数
2.来自java:comp/env的JNDI属性
3.java系统属性
4.操作系统环境变量
5.RandomValuePropertySource配置的random.*属性值
==有jar包外箱jar包内进行寻找==
==优先加载带profile==
6.jar包外部的application-{profile}.properties 或 application.yml(带spring.profile)配置文件
7.jar包内部的application-{profile}.properties 或 application.yml(带spring.profile)配置文件
==再来加载不带profile==
8.jar包外部的application.properties或者application.yml(不带spring.profile)配置文件
9.jar包内部的application.properties或者application.yml(不带spring.profile)配置文件
精髓:
1》springboot启动会加载大量的自动配置类
2》我们看我们需要的功能有没有springboot默认写好的自动配置类
3》我们再来看这个自动配置类中到底配置了那些组件;(只要我们要用的组件有,我们就不需要再来配置了)
4》给容器中自动配置类添加组件的时候,会从properties类中获取某些属性,我们就可以在配置文件中指定这些属性的值
Ⅱ SpringBoot中yaml文件配置属性
首先,在SpringBoot中,有两种配置文件的方式。一种是application.properties,另一种application.yaml(或者是application.yml)。
yaml文件格式是SpringBoot支持的一种JSON超集文件格式,相对于传统的Properties配置文件,yaml文件以数据为核心,是一种更为直观且容易被计算机识别的数据序列化格式。application.yaml配置文件的工作原理和application.properties是一样的,只是yaml格式配置文件看起来要跟简洁一些。
application.yaml文件使用 key:(空格) value 格式配置属性,使用缩进控制层关系
注意:此时port和path属性,属于同一层级
其中缩进式写法有两种表示形式,一种为:
另一种为:
上述两种缩进式写法为person对象的hobby属性赋值,其中一种是通过“-(空格)属性值”的形式为属性赋值,另一种是直接赋值使用英文逗号分隔属性值。
行内式的写法显然比缩进式写法更加简洁。使用行内式写法设置属性值时,中括号“[ ]”是可以省略的,程序会自动匹配校对属性的值
在yaml配置的属性值为Map或对象类型时,缩进式的形式按照yaml文件格式编写即可,而行内式写法的属性值要用大括号“{ }”包含
Ⅲ Golang项目中引入yaml.v2配置文件
在Go语言项目中,常用的配置文件yaml、toml、json、xml、ini几种,因为本章主要讲解yaml配置文件的使用方法,其他几种配置文件在这里就不展开了介绍了,大家有兴趣可以自行网络。
yaml文件的语法网上有很多的教程,大家自行网络,这里也推荐两个链接:
yaml文件解析使用的是github上第三方开源框架 gopkg.in/yaml.v2 ,下面详细介绍安装和使用的方法:
参考链接: https://blog.csdn.net/wade3015/article/details/83351776
Ⅳ THINKPHP支持YAML配置文件的设置方法
为什么要用
yaml
因为
Yaml
简单,而且对人类友好;
Yaml:
http://www.yaml.org/
在哪里会用到?
最基本的,在
ThinkPHP
的配置文件里面就可以选择
Yaml
的格式,你是愿意写
Yaml
的简洁格式配置呢?还是愿意写又长又臭又难写的
PHP
array
呢?
http://document.thinkphp.cn/manual_3_2.html#config_format
问题来了
于是,我把配置格式改为
Yaml:
复制代码
代码如下:
//
/index.php
//
定义配置文件的格式为
yaml
define('CONF_EXT',
'.yaml');
Ⅳ 现代配置指南——YAML 比 JSON 高级在哪
一直以来,前端工程中的配置大多都是 .js 文件或者 .json 文件,最常见的比如:
这些配置对前端非常友好,因为都是我们熟悉的 JS 对象结构。一般静态化的配置会选择 json 文件,而动态化的配置,涉及到引入其他模块,因此会选择 js 文件。
还有现在许多新工具同时支持多种配置,比如 Eslint ,两种格式的配置任你选择:
后来不知道什么时候,突然出现了一种以 .yaml 或 .yml 为后缀的配置文件。一开始以为是某个程序的专有配置,后来发现这个后缀的文件出现的频率越来越高,甚至 Eslint 也支持了第三种格式的配置 .eslintrc.yml 。
既然遇到了,那就去 探索 它!
下面我们从 YAML 的 出现背景 , 使用场景 , 具体用法 , 高级操作 四个方面,看一下这个流行的现代化配置的神秘之处。
一个新工具的出现避免不了有两个原因:
YAML 这种新工具就属于后者。其实在 yaml 出现之前 js+json 用得也不错,也没什么特别难以处理的问题;但是 yaml 出现以后,开始觉得它好乱呀什么东西,后来了解它后,越用越喜欢,一个字就是优雅。
很多文章说选择 yaml 是因为 json 的各种问题,json 不适合做配置文件,这我觉得有些言过其实了。我更愿意将 yaml 看做是 json 的升级,因为 yaml 在格式简化和体验上表现确实不错,这个得承认。
下面我们对比 YAML 和 JSON,从两方面分析:
JSON 比较繁琐的地方是它严格的格式要求。比如这个对象:
在 JSON 中以下写法通通都是错的:
字符串的值必须 k->v 都是 "" 才行:
虽然是统一格式,但是使用上确实有不便利的地方。比如我在浏览器上测出了接口错误。然后把参数拷贝到 Postman 里调试,这时就我要手动给每个属性和值加 "" 号,非常繁琐。
YAML 则是另辟蹊径,直接把字符串符号干掉了。上面对象的同等 yaml 配置如下:
没错,就这么简单!
除了 "" 号,yaml 觉得 {} 和 [] 这种符号也是多余的,不如一起干掉。
于是呢,以这个对象数组为例:
转换成 yaml 是这样的:
对比一下这个精简程度,有什么理由不爱它?
说起增加的部分,最值得一提的,是 YAML 支持了 注释 。
用 JSON 写配置是不能有注释的,这就意味着我们的配置不会有备注,配置多了会非常凌乱,这是最不人性化的地方。
现在 yaml 支持了备注,以后配置可以是这样的:
把这种配置丢给新同事,还怕他看不懂配了啥吗?
除注释外,还支持配置复用的相关功能,这个后面说。
我接触的第一个 yaml 配置是 Flutter 项目的包管理文件 pubspec.yaml ,这个文件的作用和前端项目中的 package.json 一样,用于存放一些全局配置和应用依赖的包和版本。
看一下它的基本结构:
你看这个结构和 package.json 是不是基本一致? dependencies 下列出应用依赖和版本, dev_dependencies 下的则是开发依赖。
后来在做 CI/CD 自动化部署的时候,我们用到了 GitHub Action。它需要多个 yaml 文件来定义不同的工作流,这个配置可比 flutter 复杂得多。
其实不光 GitHub Action,其他流行的类似的构建工具如 GitLab CI/CD,circleci,全部都是齐刷刷的 yaml 配置,因此如果你的项目要做 CI/CD 持续集成,不懂 yaml 语法肯定是不行的。
还有,接触过 Docker 的同学肯定知道 Docker Compose,它是 Docker 官方的单机编排工具,其配置文件 docker-compose.yml 也是妥妥的 yaml 格式。现在 Docker 正是如日中天的时候,使用 Docker 必然免不了编排,因此 yaml 语法早晚也要攻克。
上面说的这 3 个案例,几乎都是现代最新最流行的框架/工具。从它们身上可以看出来,yaml 必然是下一代配置文件的标准,并且是 前端-后端-运维 的通用标准。
说了这么多,你跃跃欲试了吗?下面我们详细介绍 yaml 语法。
介绍 yaml 语法会对比 json 解释,以便我们快速理解。
先看一下 yaml 的几个特点:
相比于 JSON 来说,最大的区别是用 缩进 来表示层级,这个和 Python 非常接近。还有强化的一点是支持了注释,JSON 默认是不支持的(虽然 TS 支持),这也对配置文件非常重要。
YAML 支持以下几种数据结构:
先看对象,上一个 json 例子:
转换成 yaml:
对象是最核心的结构,key 值的表示方法是 [key]: ,注意这里 冒号后面有个空格,一定不能少 。value 的值就是一个 纯量 ,且默认不需要引号。
数组和对象的结构差不多,区别是在 key 前用一个 - 符号标识这个是数组项。注意这里 也有一个空格 ,同样也不能少。
转换成 JSON 格式如下:
了解了基本的对象和数组,我们再来看一个复杂的结构。
众所周知,在实际项目配置中很少有简单的对象或数组,大多都是对象和数组相互嵌套而成。在 js 中我们称之为对象数组,而在 yaml 中我们叫 复合结构 。
比如这样一个稍复杂的 JSON:
转换成复合结构的 YAML:
若你想尝试更复杂结构的转换,可以在 这个 网页中在线实践。
纯量比较简单,对应的就是 js 的基本数据类型,支持如下:
比较特殊的两个,null 用 ~ 符号表示,时间大多用 2021-12-21 这种格式表示,如:
转换成 JS 后:
在 yaml 实战过程中,遇到过一些特殊场景,可能需要一些特殊的处理。
在 shell 中我们常见到一些参数很多,然后特别长的命令,如果命令都写在一行的话可读性会非常差。
假设下面的是一条长命令:
在 linux 中可以这样处理:
就是在每行后加 符号标识换行。然而在 YAML 中更简单,不需要加任何符号,直接换行即可:
YAML 默认会把换行符转换成 空格 ,因此转换后 JSON 如下,正是我们需要的:
然而有时候,我们的需求是 保留换行符 ,并不是把它转换成空格,又该怎么办呢?
这个也简单,只需要在首行加一个 | 符号:
转换成 JSON 变成了这样:
获取配置是指,在 YAML 文件中定义的某个配置,如何在代码(JS)里获取?
比如前端在 package.json 里有一个 version 的配置项表示应用版本,我们要在代码中获取版本,可以这么写:
JSON 是可以直接导入的,YAML 可就不行了,那怎么办呢?我们分环境解析:
在浏览器中
浏览器中代码用 webapck 打包,因此加一个 loader 即可:
然后配置 loader:
在组件中使用:
在 Node.js 中
Node.js 环境下没有 Webpack,因此读取 yaml 配置的方法也不一样。
首先安装一个 js-yaml 模块:
然后通过模块提供的方法获取:
配置项复用的意思是,对于定义过的配置,在后面的配置直接引用,而不是再写一遍,从而达到复用的目的。
YAML 中将定义的复用项称为锚点,用 & 标识;引用锚点则用 * 标识。
对应的 JSON 如下:
但是锚点有个弊端,就是不能作为 变量 在字符串中使用。比如:
此时 key2 的值就是普通字符串 _my name is *name_,引用变得无效了。
其实在实际开发中,字符串中使用变量还是很常见的。比如在复杂的命令中多次使用某个路径,这个时候这个路径就应该是一个变量,在多个命令中复用。
GitHub Action 中有这样的支持,定义一个环境变量,然后在其他的地方复用:
这种实现方式与 webpack 中使用环境变量类似,在构建的时候将变量替换成对应的字符串。
如果本文对你有启发,请甩手一个赞
Ⅵ 2020-06-15关于iOS 使用yaml配置文件总结
yaml,json,ini这三种格式用来做配置文件优缺点
适合人类编写:ini > toml > yaml > json > xml > plist
可以存储的数据复杂度:xml > yaml > toml ~ json ~ plist > ini
yaml解析库: https://github.com/mirek/YAML.framework
编译导出iOS版本的framwork, YAML.framework
导入进你的iOS工程,这里有个坑
但是发现虽然不报错了,但是解析不出数据
里,然后就可以正常使用了
结果
附上yaml格式文件的编写规则: https://www.jianshu.com/p/5d7cc8690f15
它的基本语法规则如下:
大小写敏感
使用缩进表示层级关系
缩进时不允许使用Tab键,只允许使用空格。
缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
纯量是最基本的、不可再分的值。以下数据类型都属于 JavaScript 的纯量。
后面引用和正则表达式是一些语法,参 https://blog.csdn.net/michaelhan3/article/details/69664932
Ⅶ 使用yaml文件管理测试数据
知道ddt的基本使用方法之后,练习把之前用excel文件来维护的接口测试用例改用unittest+ddt来实现。
这里我选用yaml文件来管理接口参数,开始本来想用json,但是json无法添加注释,可读性不好。
下面截图是接口文档中的各个接口,每个接口都有一个固定的序号,所以在设计每个接口的测试数据时,以序号来区分不同接口
yaml文件内容如下,需要注意的是yaml的语法:
(1)键值对用冒号分割,但是冒号后需要加一个空格
(2)禁止使用tab缩进,只能使用空格键;缩进长度没有限制,只要元素对齐就表示这些元素属于一个层级
(3)字符串可以不用引号标注,也可以加引号,如果想把数字变为字符串,加引号即可
(4)使用#表示注释
详情可以参考博客: https://blog.csdn.net/vincent_hbl/article/details/75411243
2. 简单 demo : python 读取 yaml 文件,取出接口参数
import yaml
fp = open('../dataconfig/信息互动模块接口.yaml', encoding='utf-8') #有中文字符的话,加编码格式
testdata = yaml.load(fp)
t = testdata['5.2.1.4']
print(t)
(1)封装读取yaml文件方法
handle_yaml.py
# coding: utf-8
# author: hmk
importyaml
importos
classHandleYaml:
def __init__(self,file_path=None):
if file_path:
self.file_path = file_path
else:
root_dir =os.path.dirname(os.path.abspath('.'))
# os.path.abspath('.')表示获取当前文件所在目录;os.path.dirname表示获取文件所在父目录;所以整个就是项目的所在路径self.file_path = root_dir +'/dataconfig/信息互动模块接口.yaml' #获取文件所在的相对路径(相对整个项目)
#elf.data = self.get_data()
def get_data(self):
fp =open(self.file_path, encoding='utf-8')
data =yaml.load(fp)
return data
if __name__ == '__main__':
test = HandleYaml()
p = test.get_data()
print(p['5.2.1.1'])
[if !vml][endif]
(2)封装requests请求方法
[if !vml][endif]
# coding: utf-8
# author: Archer
importrequests
importjson
classRunMethod:
defpost_main(self, url, data, header=None):if header is notNone:
res =requests.post(url=url, data=data, headers=header)
else:
res =requests.post(url=url, data=data)
# print(res.status_code)
# return res.json()
return res #为了方便后面断言,这里不再对服务器响应进行json格式编码
def get_main(self, url, data=None, header=None):if header is notNone:
res =requests.get(url=url, params=data, headers=header)
else:
res =requests.get(url=url, params=data)
print(res.status_code)
# return
res.json()
return res
def run_main(self, method, url, data=None, header=None):
if method== 'POST':
res =self.post_main(url, data, header)
else:
res =self.get_main(url, data, header)
returnres
# returnjson.mps(res, indent=2, sort_keys=False, ensure_ascii=False) #使用json模块格式化显示结果
[if !vml][endif]
(3)一个接口测试用例
[if !vml][endif]
# coding: utf-8
# author: Archer
importunittest
importddt
from base.run_method importRunMethod
from utils.handle_yaml importHandleYaml
get_data = HandleYaml() # 从yaml文件中取出该接口的参数
params = get_data.get_data()['5.2.1.4']
@ddt.ddt
classTest(unittest.TestCase):
"""加载咨询详情接口"""
defsetUp(self):
self.url ='http://localhost:8088/ApprExclusiveInterface/api/enterprise/info/consult/loadDetail.v'
self.run =RunMethod()
@ddt.data(*params)
deftest(self, value):
r =self.run.run_main("GET", self.url, value)
print(r)
self.assertTrue(value['assert'] inr.text)
if __name__ == '__main__':
unittest.main()
(4)利用HTMLTestRunner生成测试报告
run_report.py
# coding: utf-8
# author: hmk
from HTMLTestRunner importHTMLTestRunner
importunittest
importtime, os
root_dir = os.path.dirname(os.path.abspath('.')) # 获取当前文件所在目录的父目录的绝对路径,也就是项目所在路径E:\DDT_Interface
case_dir = root_dir + '/test_case/' # 根据项目所在路径,找到用例所在的相对项目的路径
print(root_dir)
print(case_dir)
"""定义discover方法"""
discover = unittest.defaultTestLoader.discover(case_dir,
pattern='test*.py', top_level_dir=None)
"""
1.case_dir即测试用例所在目录
2.pattern='test_*.py' :表示用例文件名的匹配原则,“*”表示任意多个字符
3.top_level_dir=None:测试模块的顶层目录。如果没顶层目录(也就是说测试用例不是放在多级目录中),默认为None
"""
if __name__ == "__main__":
"""直接加载discover"""
now = time.strftime("%Y-%m-%d%H_%M_%S")
filename = root_dir +'/report/' + now + '_result.html' #定义报告存放路径
print(filename)
fp = open(filename,'wb')
runner =HTMLTestRunner(stream=fp, title='个人网企业网接口测试报告', description='测试结果如下: ')
runner.run(discover)
fp.close()
ok ,unittest+ddt进行接口测试就完成了,还有很多不足,yaml配置文件还可以继续设计优化,例如可以把请求url也加进去。
其实感觉如何设计测试用例,组织测试数据也是一件很有意思的事情,很多事情都必须先有一个良好的设计思路才会进行的更顺畅。总之勤于思考,多参考他人的思路。不是有句话吗,学而不思则罔,思而不学则殆。
Ⅷ YAML 配置文件语言
YAML 是专门用来写配置文件的语言,非常简洁和强大,远比 JSON 格式方便。YAML 语言的设计目标,就是方便人类读写。它实质上是一种通用的数据串行化格式。它的基本语法规则如下:
对象的一组键值对,使用冒号结构表示
一组连词线开头的行,构成一个数组
数据结构的子成员是一个数组,则可以在该项下面缩进一个空格
对象和数组可以结合使用,形成复合结构
纯量是最基本的、不可再分的值。以下数据类型都属于 JavaScript 的纯量
课程演示会采用多虚拟机模拟分布式场景,为防止 IP 冲突,无法联网等问题,需要预先设置好主机名、IP、DNS 配置
修改 cloud.cfg 防止重启后主机名还原
修改主机名
编辑 vi /etc/netplan/50-cloud-init.yaml 配置文件,修改内容如下
使用 netplan apply 命令让配置生效