目录:导读
前言
1、yaml(专门用来做配置文件的)
1)yaml格式简介(yaml文件非常简洁)
yaml的意思是:yet anoter markup language(仍是一种置标语言)的缩写
yaml是专门用来写配置文件的语言,非常简洁强大,远比json格式方便
可以用yaml做自动化测试框架的配置文件或者用例文件
yaml作配置文件config file 比如说运行版本参数或者设置on和off都可以使用yaml来做
2)python搭建yaml环境
pyyaml是python的一个专门针对yaml文件操作的模块,
pip install PyYaml
3)python操作yaml库
操作yaml文件主要两大步:读和写
pyyaml 5.1之后,通过禁止默认加载程序(FullLoader)执行任意功能,该load函数也变得更加安全
import yaml
yaml_str = """
name: xintian
age: 20
ob: Tester
"""
res_dict1 = yaml.load(yaml_str,Loader=yaml.FullLoader)
print(res_dict1)
print(type(res_dict1))
#控制台----输出
{'name': 'xintian', 'age': 20, 'job': 'Tester'}
<class 'dict'>
4、yaml实际操作
项目工程里面创建一个config文件夹
config文件夹:(配置参数文件 普通文件夹)python文件放包里面,其他文件放文件夹里面(一个有init一个没有)
teach_sq
config
test.yaml yaml配置文件
5、yaml格式语法
基本规则:
大小写敏感
使用缩进表示层级关系(没有大括号或者小括号)
缩进时不允许使用Tab,只允许使用空格
缩进的空格数目不重要,只要相同层级的元素对齐即可
#表示注释,从它开始到行尾都被忽略
yaml中的值有以下基本类型
字符串
整形
浮点数
布尔型
null
时间
日期
6)yaml文件读取操作
#井号表示注释
#1:字典类型::表示字典:冒号后面必须加空格,通过键去取值(字典类型) {'name': 'tom', 'age': 20}
name: tom
age: 20
#2:列表类型 列表加 -横杠 [10, 20, 30]
- 10
- 20
- 30
#3:复杂的(嵌套的) [{'info': [10, 20, 30]}] 列表嵌套字典,字典再嵌套列表
- info :
- 10
- 20
- 30
info : #{'info': [10, 20, 30]}字 典嵌套列表
- 10
- 20
- 30
#4:模式选择,on代表代码执行某个逻辑,off代表代码不执行某个逻辑,数据代码分离(配置参数修改)
#{'mode': True, 'mode2': False} yaml里面on表示ture,off表示false
mode: on
mode2: off
#5:设置变量,(某些数据过长,又想一直再yaml里面用,可以这样定义,)
#&var表示定义一个变量var,把‘我是变量 ’的值定义成var变量,变量var一直要用,而且很长的话可以定义成变量,后面可以使用变量名var
#name也是一个值,把name的值定义成变量var,可以改名字
name: &var 我是变量
mode: on
mode2: off
data: *var #*var 表示使用变量var *代表取变量名 *var表示使用变量var &var表示定义变量var
yaml文件的读取
test.yaml
#井号表示注释
#1:字典类型::表示字典:冒号后面必须加空格,通过键去取值(字典类型) {'name': 'tom', 'age': 20}
name: tom
age: 20
#2:列表类型 列表加 -横杠 [10, 20, 30]
- 10
- 20
- 30
#3:复杂的(嵌套的) [{'info': [10, 20, 30]}] 列表嵌套字典,字典再嵌套列表
- info :
- 10
- 20
- 30
info : #{'info': [10, 20, 30]}字 典嵌套列表
- 10
- 20
- 30
#4:模式选择,on代表代码执行某个逻辑,off代表代码不执行某个逻辑,数据代码分离(配置参数修改)
#{'mode': True, 'mode2': False} yaml里面on表示ture,off表示false
mode: on
mode2: off
#5:设置变量,(某些数据过长,又想一直再yaml里面用,可以这样定义,)
#&var表示定义一个变量var,把‘我是变量 ’的值定义成var变量,变量var一直要用,而且很长的话可以定义成变量,后面可以使用变量名var
#name也是一个值,把name的值定义成变量var,可以改名字
name: &var 我是变量
mode: on
mode2: off
data: *var #*var 表示使用变量var *代表取变量名 *var表示使用变量var &var表示定义变量var
yaml文件的读取
import yaml #导入yaml库
yamlDir="./config/test.yaml" #对文件操作都需要写路径
#1:打开操作,不管什么文件都需要一个open打开操作
fo=open(yamlDir,"r",encoding="utf-8") #以文件对象打开,r以字符串读取,打开的编码格式encoding="utf-8"(可以打开中文)
#fo返回文件对象
#2:使用yaml库操作(加载使用yaml库)load--加载--读取
res=yaml.load(fo,Loader=yaml.FullLoader) #yaml库.load方法(加载读取)-----加载文件对象
#Loader=yaml.FullLoader---加载方式,安全全部加载,yaml 5.1后面的版本必须写加载方式,不然警告
print(res)
8)yaml文件写入操作:dump去写
有些项目运行时候会把数据写到一个文件里面去
启动参数,运行参数,什么模式,什么状态写到一个文件,运行信息,运行日志—写入
写入会覆盖了前面写的内容,
python操作yaml库写入文件:字典–转换–字符串
写个简单的字典:python_obj = {“name”: u"灰蓝",“age”: 0,“job”: “Tester”},然后dump写进去就行
import yaml
python_obj = {"name": u"灰蓝","age": 0,"job": "Tester"}
f=open(yamlDir, 'w',encoding='utf-8')
y = yaml.dump(python_obj,f, default_flow_style=False) #default_flow_style 写的风格模式
print(y)
print(type(y))
def set_yaml(): #yaml文件的写入操作函数
python_obj = {"name": u"灰蓝", "age": 0, "job": "Tester"}
yamlDir='./test02.yaml'
with open(yamlDir, 'w',encoding='utf-8') as f:
yaml.safe_dump(python_obj, f)
open(yamlDir, 'w',encoding='utf-8') #换成a模式打开写入文件,不能出现同名的,w每次清空文件再写
9)多组yaml数据
yaml做配参和简单的用例如下:
#登录操作 下面每一个用例是列表 -是列表
- #test_01
url: /api/mgr/loginReq #路径
method: POST # 请求方法
detail: 正常登录
header:
content-Type: application/x-www-form-urlencoded
data:
username: auto
password: sdfsdfsdf
reps:
retcode: 0
- #test_02
url: /api/mgr/loginReq #路径
method: POST # 请求方法
detail: 没有账号,有密码
header:
content-Type: application/x-www-form-urlencoded
data:
username: ""
password: sdfsdfsdf
reps:
retcode: 1
reason: 账号密码错误
- #test_03
url: /api/mgr/loginReq #路径
method: POST # 请求方法
detail: 有账号,没有密码
header:
content-Type: application/x-www-form-urlencoded
data:
username: auto
password: ""
reps:
retcode: 1
reason: 账号密码错误
- #test_04
url: /api/mgr/loginReq #路径
method: POST # 请求方法
detail: 账号密码都没有
header:
content-Type: application/x-www-form-urlencoded
data:
username: ""
password: ""
reps:
retcode: 1
reason: 账号密码错误
读取上面这种yaml多个用例:
import yaml
import json
def get_yaml_data():#[(),()]
yamlDir = './config/test02.yaml' #路径
#1- 打开操作
fo = open(yamlDir,'r',encoding='utf-8')
#2- 使用库操作--load--加载--读取的概念
res = yaml.load(fo,Loader=yaml.FullLoader)
resList = [] #存放结果---[(),()]
for one in res:
resList.append((json.dumps(one['data']),json.dumps(one['reps'])))
return resList
print(get_yaml_data())
yaml文件:特殊字符\n,\t需要加引号,反斜杠,转义符什么的需要加引号,其他的不用
yaml文件,代码后面跟的注释需要加空格 如:xxxxxx #这是注释 不然会报错
10)读取多个yaml数据使用yaml.load_all,如果yaml文件里只有一个数据使用yaml.load
def get_yamls(): #读取多个yaml数据,可以读很多组数据,用---分隔的yaml数据
fileobject = open(YamlDir, 'r', encoding='utf-8')
res = yaml.load_all(fileobject.read(),Loader=yaml.FullLoader) #返回迭代器:<generator object load_all at 0x000001F38C51BE08>
for one in res: #返回的这个代器可以使用list转成列表
print(one)
2、项目总结
test_case
里面有两个测试模块:test_login.py登录 test_lesson.py课程
整个test_case 跑起来有两种方法:
一般我们不会在pycham里面跑整个项目
方案一:pytest命令行去跑,cmd切到test_case目录里面:
输入pytest -sq (不打报告不干其他,只运行,运行所有的,运行cmd当前目录文件下的所有的测试用例,自动识别带test开头的模块)
方案二:ywt_api_run_浏览器模式.bat.bat批处理文件运行
ywt_api_run_浏览器模式.bat 文件
bat批处理文件(可以一键打开浏览器的)
@echo off
echo ywt自动化运行准备开始...... #基本的输出描述
@echo on
del /f /s /q G:\xxx\Python\Demo\teach_sq\report\tmp\*.json #删除项目中不需要的数据
del /f /s /q G:\xxx\Python\Demo\teach_sq\report\tmp\*.jpg
del /f /s /q G:\xxx\Python\Demo\teach_sq\report\report
@echo off
echo 环境文件删除工作完成,开始运行脚本......
@echo on
G:
cd G:/SongQin/Python/Demo/teach_sq/test_case #切换到testcase路径,理解里面pytest执行代码,生成allure报告
pytest -sq --alluredir=../report/tmp
allure serve ../report/tmp
@echo off
echo 接口自动化运行成功
pause
通过:ywt_api_run_浏览器模式.bat 文件一键执行脚本,生成报告(真正意义的自动化,本机执行)
3、allure报告优化
allure报告优化,按模块做个分层
报告做漂亮需要做allure标签:报告分层(引入allure标签,allure标签分层)
1)每个接口方法都加个注释(描述) —报告里面都会体现
‘’‘登录接口’‘’,报告里面会看到这个注释(描述)
方法一:函数注释
方法二:写一个描述的单词:@allure.description(“爱看书的急啊卡的金克拉”) #接口信息描述
2)登录做成一个模块,大的标签—大的层
1层标签:@allure.feature(“登录模块”) ,大标签,对类来操作
2层标签:@allure.story(“登录接口”) , 对接口方法操作
3层标签:@allure.title(“登录接口用例”) ,对接口用例操作,针对每个用例
3)allure报告一些其他的描述
allure报告上展示环境等属性,allure报告运行环境(报告怎么测试的,环境怎么样,报告描述,概要,描述整个项目的基本情况)
在report的tmp文件夹加一个environment.properties文件
teach_sq
report
tmp
environment.properties ----环境属性文件,配置文件,给报告用的,一般自己手写
tem文件夹里面放个:environment.properties文件,文件里面可以写这个项目环境的基本描述:如下写
python.version=3.6.5
projectUrl=127.0.0.1/login
Browser=FireFox_77.6
environment.properties 配置文件
那么版本运行的时候allure报告首页的:ENVIRONMENT栏会有相应的描述如下:
ENVIRONMENT
projectUrl
127.0.0.1/login
python.version
3.6.5
Browser
FireFox_77.6
allure报告的趋势,本地是没有的,pytest里面做history是有的,以前临时文件的都不能删除,留着
一般需要和jinkins结合来做的,jinkins自己会做,会有构建历史的,jikins有个插件allure,里面构建完了后会把allure每次运行结果放到趋势里面去
本地的:localhistory(tmp文件不能删除,移动到history里面去然后导入进来)自己学习
4、接口自动化代码写道后期需要加的三个步骤
1)yaml设计登录,
2)allure报告优化,做标签
3)xxx.bat批处理文件一键执行跑起来(windows是bat mac是:sh)
jinkins最终用的就是命令行,怎么命令行启动,起各种服务,都是.命令行运行(需要掌握)
批处理文件执行整个自动化:环境清除+执行代码+生成allure报告
不是点run跑
最全Python自动化测试进阶之路视频教学 (全集)
下面是我整理的2025年最全的软件测试工程师学习知识架构体系图 |
一、Python编程入门到精通
二、接口自动化项目实战
三、Web自动化项目实战
四、App自动化项目实战
五、一线大厂简历
六、测试开发DevOps体系
七、常用自动化测试工具
八、JMeter性能测试
九、总结(尾部小惊喜)
人生最动人的风景,往往藏在最难攀爬的高处。当你觉得力竭时,请记住:每一次坚持都在雕刻更强大的自己。别问路有多远,只管迈步向前;别怕山有多高,向上攀登就是答案!
你体内沉睡着改变世界的力量!每个清晨都是改写命运的新机会,每次挫折都是精心包装的礼物。当全世界都在说"不可能"时,正是你证明"可能"的最好时机!