「yaml接口java」yaml接口自动化测试
本篇文章给大家谈谈yaml接口java,以及yaml接口自动化测试对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、yaml java代码自动生成 部分类生出不出来
- 2、二、SpringBoot的配置--yaml
- 3、面试官:什么是 YAML?和 Spring Boot 有什么关系?
- 4、yaml文件怎么实现java类转换
- 5、使用yaml文件管理测试数据
- 6、超越XML和JSON:YAML,Java开发人员的新选择
yaml java代码自动生成 部分类生出不出来
做自动测试时,使用yaml文件做界面要素配置,出现一个问题,经过自己的尝试实现了xpath方式的读取。把代码分项出来。尤其是在使用xpath是,会出现yaml读取出错的情况。此时需要将xpath的内容使用双引号括起来。代码如下
6
logout: type:name value:logoutlogoutConfirm: type:xpath value:"//*[@id='queding']//td/*//button"
来自CODE的代码片
snippet_file_0.txt
读取yaml文件的java代码如下
package com.bfm.utilities;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.util.HashMap;import org.ho.yaml.Yaml;/*该类为获取yaml文件中的内容*/public class YamlReader { private HashMapString, HashMapString, String yml; @SuppressWarnings("unchecked") public HashMapString, HashMapString, String getYamlFile(String yamlFile) { File f = new File(yamlFile); try { this.yml = (HashMapString, HashMapString, String) Yaml.loadType(new FileInputStream(f.getAbsolutePath()), HashMap.class); } catch (FileNotFoundException e) { e.printStackTrace(); } return this.yml; } public static void main (String args[]){ YamlReader yr = new YamlReader(); yr.getYamlFile("E:\\workspace\\bfm\\src\\com\\bfm\\pageElements\\mainPageElements.yaml"); }}
二、SpringBoot的配置--yaml
SpringBoot使用一个全局的配置文件,配置文件名是固定的;
配置文件的作用:修改SpringBoot自动配置的默认值;SpringBoot在底层都给我们自动配置好;
YAML 是一个标记语言
标记语言:
以前的配置文件;大多都使用的是xxx.xml文件
YAML:以数据为中心,比json、xml等更适合做配置文件
YAML:配置例子
XML:
k:(空格)v : 表示一对键值对(空格必须有)
以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级的
属性和值也是大小写敏感;
k: v :字面直接来写;
字符串默认不用加上单引号或者双引号;
"" :双引号;不会转义字符串里面的特殊字符; 特殊字符会作为本身想表示的意思
name : "zhangsan \n lisi" :输出 : zhangsan 换行 lisi
'' :单引号;会转义特殊字符,特殊字符最终只是一个普通的字符串数据
name: 'zhangsan \n lisi' : 输出 ; zhangsan \n 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类中获取某些属性,我们就可以在配置文件中指定这些属性的值
面试官:什么是 YAML?和 Spring Boot 有什么关系?
YAML是"YAML Ain’t a Markup Language"(YAML不是一种标记语言)的递归缩写。YAML的意思其实是:“Yet Another Markup Language”(仍是一种标记语言)。主要强度这种语音是以数据为中心,而不是以标记语言为重心,例如像xml语言就会使用大量的标记。
YAML是一个可读性高,易于理解,用来表达数据序列化的格式。它的语法和其他高级语言类似,并且可以简单表达清单(数组)、散列表,标量等数据形态。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件等。
YAML的配置文件后缀为 .yml,例如Springboot项目中使用到的配置文件 application.yml 。
标量
标量是最基础的数据类型,不可再分的值,他们一般用于表示单个的变量,有以下七种:
这样,我们就可以在程序中引入了,如下:
Spring Boot 基础就不介绍了,推荐下这个实战教程:github.com/javastacks/…
对象
我们知道单个变量可以用键值对,使用冒号结构表示 key: value,注意冒号后面要加一个空格。可以使用缩进层级的键值对表示一个对象,如下所示:
然后在程序对这几个属性进行赋值到Person对象中,注意Person类要加get/set方法,不然属性会无法正确取到配置文件的值。使用@ConfigurationProperties注入对象,@value不能很好的解析复杂对象。
当然也可以使用 key:{key1: value1, key2: value2, ...}的形式,如下:
数组
可以用短横杆加空格 -开头的行组成数组的每一个元素,如下的address字段:Spring Boot 学习笔记分享给你。
也可以使用中括号进行行内显示形式,如下:
在代码中引入方式如下:
如果数组字段的成员也是一个数组,可以使用嵌套的形式,如下:
如果数组成员是一个对象,则用如下两种形式形式:
如果你想引入多行的文本块,可以使用|符号,注意在冒号:和 |符号之间要有空格。最新面试题整理好了,点击Java面试库小程序在线刷题。
它和加双引号的效果一样,双引号能转义特殊字符:
有时我们需要显示指定某些值的类型,可以使用 !(感叹号)显式指定类型。!单叹号通常是自定义类型,!!双叹号是内置类型,例如:
内置的类型如下:
引用会用到 锚点符合和 星号符号,用来建立锚点, 表示合并到当前数据, 用来引用锚点。最新面试题整理好了,点击Java面试库小程序在线刷题。
上面最终相当于如下:
还有一种文件内引用,引用已经定义好的变量,如下:
可以在同一个文件中,实现多文档分区,即多配置。在一个yml文件中,通过 — 分隔多个不同配置,根据spring.profiles.active 的值来决定启用哪个配置
yaml文件怎么实现java类转换
package com.ming.yaml.beans;
import java.util.ArrayList;
import java.util.List;
/**
* 学生类
* @author ming
*
*/
public class Student {
private int id;
private String name;
private int age;
//一个学生有多个电话号码
ListTel tels=new ArrayListTel();
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public ListTel getTels() {
return tels;
}
public void setTels(ListTel tels) {
this.tels = tels;
}
}
然后是联系人:
package com.ming.yaml.beans;
/**
* 联系人电话类
* @author ming
*
*/
public class Tel {
private String name;
private String tel;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
}
使用yaml文件管理测试数据
知道ddt的基本使用方法之后,练习把之前用excel文件来维护的接口测试用例改用unittest+ddt来实现。
这里我选用yaml文件来管理接口参数,开始本来想用json,但是json无法添加注释,可读性不好。
下面截图是接口文档中的各个接口,每个接口都有一个固定的序号,所以在设计每个接口的测试数据时,以序号来区分不同接口
yaml文件内容如下,需要注意的是yaml的语法:
(1)键值对用冒号分割,但是冒号后需要加一个空格
(2)禁止使用tab缩进,只能使用空格键;缩进长度没有限制,只要元素对齐就表示这些元素属于一个层级
(3)字符串可以不用引号标注,也可以加引号,如果想把数字变为字符串,加引号即可
(4)使用#表示注释
详情可以参考博客:
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.dumps(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 =''
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也加进去。
其实感觉如何设计测试用例,组织测试数据也是一件很有意思的事情,很多事情都必须先有一个良好的设计思路才会进行的更顺畅。总之勤于思考,多参考他人的思路。不是有句话吗,学而不思则罔,思而不学则殆。
超越XML和JSON:YAML,Java开发人员的新选择
为Java开发者对YAML文件格式做一个高级介绍 找出它与XML和JSON的不同之处 并检验它的优越性和缺陷
所有动态语言(如Ruby Groovy Python等)及其相关的框架(如Ruby on rails)百家争鸣 尽管阅读本文的大部分Java开发者每天的大多数工作都是处理纯粹的Java 且未来多年都将如此 但这并不意味着他们不能学习新的知识 在他们的兵器库中添加新的兵器 本文介绍YAML(YAML不是标记语言的简写)文件格式(使用Ruby on rails框架进行讲解 因为它所有的配置文件都是使用的YAML)以及它与XML和JSON的区别 最后讨论了YAML的优势和缺点
空格缩进和JSON选项
YAML文件格式主要集中于空格缩进的概念 它用于指出数据的层次结构 – 而不是使用XML嵌套标记或JSON的大括号({})和方括号([]) 实际上 它是JSON的一个超集 因此 在使用的时候 你可能需要采用JSON风格的语法来跳出空格流 它的创始人将其形容为 为所有编程语言提供人性化的数据序列化标准 以我的经验来看 其重点是人性化 下面是一个使用空格缩进的YAML样例 创建YAML文件时不宜使用固定宽度字体 因为空格是很关键的 (参考侧边栏 YAML和标签
JFrame: defaultCloseOperation: JFrame EXIT_ON_CLOSE title: Test Frame width: height: ponents: JTextArea: name: textArea text: | This is a really long text that spans multiple lines (but preserves new lines) It does not need to be escaped with special brackets CDATA tags or anything like that JButton: name: button text: Button
侧边栏 YAML和标签 基于空格缩进的任一文件格式最常见的问题之一是如何解释标签 在这个YAML例子中 答案相当简单 它不支持标签 使用标签字符缩进代替空格将会导致处理异常
随你喜欢 你可以在任何节点使用JSON风格语法或混合语法 例如 上面的例子可改为
JFrame: defaultCloseOperation: JFrame EXIT_ON_CLOSE title: Test Frame width: height: ponents: JTextArea: name: textArea text: | This is a really long text that spans multiple lines (but preserves new lines) It does not need to be escaped with special brackets CDATA tags or anything like that JButton: {name: button text: Button } #JSON风格语法
在底层节点(即它们没有子节点 正如你猜测的那样 井号键在YAML中是用来注释的)切换使用JSON风格语法显得特别有用
YAML结构组件
前面已经看了一个简单的YAML例子 下面让我们一起来了解一下YAML的结构 hash list 和block literal
hash(散列)
通过缩进子段和在关键字与值之间使用冒号(:)来分割实现hash的创建 如
JFrame: defaultCloseOperation: JFrame EXIT_ON_CLOSE title: Test Frame width: height:
还有一种方法就是使用与JSON兼容的大括号语法({})语法 每一对关键字/值使用逗号( )分割 如
JFrame: {defaultCloseOperation: JFrame EXIT_ON_CLOSE title: Test Frame
width: height: }
list(清单)
通过在每个list元素前放一个减号( )来创建list 与空格缩进一起构成了YAML的基石
ponents: JTextArea Jbutton
还有一种方法就是使用JSON兼容的方括号([])语法 如
ponents: [JTextArea JButton]
block literal(文字块)
这是YAML的亮点 特别是与XML相比 它的CDATA显得相当简陋 block literal可以将大块文本细致地插入文件中 你可以使用竖线(|)指令在你的文本中保留新行 如
text: | This is a really long text that spans multiple lines (but preserves new lines) It does not need to be escaped with special brackets CDATA tags or anything like that
YAML编译器将会从第一行的第一个文本字符开始编译(并丢掉所有的缩进空格) 但是会在你的文本中保留新行
另外 你还可以使用大于符号()告诉YAML编译器给所有新行加上条纹 并将输入的文本作为一个长行处理
text: This is a really long text that spans multiple lines (but preserves new lines) It does not need to be escaped with special brackets CDATA tags or anything like that
除了这两个指令之外 你还可以使用竖线和加号(|+) 它给位于前面的空格加上条纹 保留新行和末尾的空格 还可以使用大于号和减号( ) 它给所有的空格加上条纹
YAML VS XML和JSON
正如你从前面例子中清楚地看到那样 YAML没有XML那么啰嗦了 大部分YAML文件内容就是真实的数据 没有了无穷尽的打开和关闭标记列表 在XML中 这些标记往往比它们描述的数据还大 YAML更适合你需要手工维护的数据文件类型
YAML没有提供方案或DTD概念 因此无法验证文件格式是否符合你的预期 XML的啰嗦也有它的价值 但总的说来是因为XML的成熟使它具有大量额外的工具来验证它的格式 而YAML还没有
JSON也适合与任何数据 它主要面向提高性能和文件尺寸的大小 因为它几乎不使用空格和关闭标签 然而 JSON文件的内容增加了复杂性 它的关闭标识就象下地狱一样 这就是JavaFx代码(它基于JSON)中可见的最痛苦的了 在数据文件中 使用UI结构使结果更复杂 其复杂程度几乎使文件变得无法理解
查看的JavaFx示例代码(点击 Edit this page 链接) 请特别留心它是如何结束的
} } } } ] } } center: bookPanel }
掺和了{}结构和[]清单 使得手工维护大型的JSON风格的文件变得相当困难 YAML使用它的空格缩进方法巧妙地解决了这个问题 当然 无论何时 你都可以切换到JSON风格的语法(如在底层节点)
解析YAML文件最常用的Java库是JvYAML() JRuby(在Java VM上运行动态语言的Ruby版本)在它的Ruby on Rails框架中的进出口使用JvYAML JvYAML提供了文件一般处理的功能(在前面那个例子中 它返回了一个标准Java字符串 Long Map和List对象的嵌套体系结构) 使用静态dump()方法保存为文件 然后使用静态load()方法载入 例如
YAML dump(Object data Writer output); Object data = YAML load(Reader io);
参考侧边栏 基于YAML的开源项目了解关于基于YAML的开源项目信息 以及如何在Java中装入一个说明的UI
侧边栏 基于YAML的开源项目 请原谅我在这里厚脸皮地介绍我们自己的开源项目 当我真的不知道除了JRuby外其他的基于YAML的开源项目 JRuby的Ruby on Rails框架实现严重依赖YAML 而不是XML或JSON 看看我的Java Builder库吧() 它利用YAML文件提供了一种方法定义屏幕控制 布局 事件线路和数据绑定 以实现将说明UI装入Java
实际上 YAML文件真的非常简单 甚至你可以使用任何的文本编辑器都可以维护它 但有些专门的文本编辑器提供了语法加亮功能 这对维护工作很有帮助 对Eclipse而言 有Eclipse YAML editor() 对NetBeans而言 你可以使用来自Ruby包()的YAML编辑器 然而 在NetBeans 中的YAML编辑器并没有什么用处 它只支持YAML很小的一个子集(例如 它不支持block literal) 希望在NetBeans 中的YAML编辑器解决了这个问题
我没有机会测试IntelliJ IDEA 但我推测它的Ruby on Rails插件(+IDEA+Ruby+Plugin)附带了YAML编辑器
添加YAML工具
lishixinzhi/Article/program/Java/JSP/201311/19416
关于yaml接口java和yaml接口自动化测试的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。