Python自动化测试学习3
文章目录
- 一、数据格式
- 1. yaml的简介
- 2. json的格式
- 3. yaml的读取方法
- 二、HttpRunner
- 2.1 什么是HttpRunner
- 2.2 HttpRunner 环境搭建与命令
- 2.3 建立HttpRunner测试项目
- 1. 创建一个httprunner的项目
- 2. httprunner_api
- 3. httprunner框架的一些参数配置
- 4. httprunner中extract响应数据提取
- 5. httprunner的三种参数化
一、数据格式
1. yaml的简介
yaml是一种数据格式,支持注释,通过#注释
- 语法规则:
区分大小写
使用缩进判断层级关系
# 注释
2. json的格式
map对象,又称:字典dist {name: 百里}
数组:又称:列表list [{name: 白里1},{name: 白里2},{name: 白里3} ]
- JSON和YAML是可以相互转换的
# MAP对象
# 两种格式
泡泡: {name: "泡泡"}可可: name: "可可"
# 数组
数组1: [{name: 可可1},{name: 可可2},{name: 可可3}]数组2:- name: "可可1"- name: "可可2"- name: "可可3"
3. yaml的读取方法
- 普通的读写方法
import yamlclass YamlUtil:def __init__(self,yaml_path):self.yaml_path = yaml_path# 读取 dist or listdef read_yaml(self):with open(self.yaml_path,"r",encoding="utf-8") as f:yaml_data = yaml.load(f,Loader=yaml.FullLoader)return yaml_dataif __name__ == '__main__':res = YamlUtil('test.yaml').read_yaml()print(res)# [{'name': '测试读取', 'request': {'method': 'GET', 'url': 'www.baidu.com', 'data': {'type': 'client'}}, 'validate': [{'equals': {'status': 200}}, {'contains': 'access_code'}]}]
- 使用ddt读取yaml
import unittest
from ddt import file_data, ddt@ddt
class GzhCase(unittest.TestCase):# 这个装饰器可以读取文件@file_data('test.yaml')def test_01_get_token(self, **kwargs):print(kwargs)print(kwargs['name'])print(kwargs['validate'])if __name__ == '__main__':unittest.main()
- bug: 当鼠标放在方法上执行时报错
AttributeError: type object 'GzhCase' has no attribute 'test_01_get_token'
原因:
加了ddt后,运行时要先识别装饰的类。若将光标放在某一个方法后面的话,测试用例只会执行当前的方法,ddt识别不到类,就会报错。
解决:
将光标放到外面或者通过main方法运行,就不会报错
二、HttpRunner
2.1 什么是HttpRunner
- HttpRunner简介
- 它是面向http协议的测试框架,只要去维护一份yaml/json文件就可以实现自动化测试、结合locust性能测试,线上性能监控,持续集成等多种需求
(junit,testing,unittest,pytest,httprunner,robotframework) - 有两个版本 2.x和3.x
- 设计思想和理念
- 重复复用优秀的开源项目(不追求重复造轮子,而是将轮子组装成战车)
- 约定大于配置(提升测试脚本的可维护性)
- 配置文件组织测试用例(yaml/json)
- 一次投入,多次复用
- 高度可扩展性
2.2 HttpRunner 环境搭建与命令
支持python2.7,推荐3.7
安装httprunner (pip install httprunner,pip install har2case)
验证环境(hrun -V,har2case -V)
建议使用低版本的httprunner进行联系,或者学习一些4.x的操作:httprunner4.x
五个命令
命令 | |
---|---|
httprunner | 主命令 |
hrun | httprunner的别名,用于运行yaml/json/pytest测试用例 |
hmake | httprunner make的别名,将yaml/json转化成pytest文件 |
har2case | httprunner har2case的别名,用于将har文件转化成yaml/json文件 |
locust | 用于性能测试 |
- 生成用例
- 使用fiddler抓包导出har文件 (结合postman请求)
- 打开pycharm将har文件转换为yaml文件
- 运行yml文件
- 生成文件
命令 | |
---|---|
har2case xxx.har | py文件的测试用例 |
har2case xxx.har -2y | yaml文件的测试用例 |
har2case xxx.har -2j | json文件的测试用例 |
- 生成yaml文件
D:\PyCharm\Code\demo3\httprunner>har2case getTianqi.har -2y
- 生成py文件
D:\PyCharm\Code\demo3\httprunner>hrun getTianqi.yml
- 踩坑:
这里执行hrun的时候一直报错:Hint: make sure your test modules/packages have valid Python names.
这是一个循环引用报错,原因是我将文件夹的名称设置为httprunner,与它本身的包文件起了冲突,_init_方法错误,后续更改文件夹名称即解决
- 执行py文件
可以在执行结果中看到一些详细信息,包括请求信息以及响应信息
2.3 建立HttpRunner测试项目
1. 创建一个httprunner的项目
这里我重新下载了hrun的版本 pip install httprunner==2.3.0
- 查看版本号报错:hrun -V
- 参考解决
- 检测版本
- 创建项目
2. httprunner_api
- 推荐一个免费的api接口网站
# demo_api.yml 写一条测试用例
name: 测试 api
variables:var1: value1var2: value2
request:url: https://eolink.o.apispace.com/xhdq/common/joke/getJokesByRandommethod: POSTheaders:X-APISpace-Token: "xxxxxxxxxxxxxxxxxxx"Authorization-Type: "apikey"Content-Type: "application/x-www-form-urlencoded"data:pageSize: 5
validate:- eq: ["status_code", 200]
- 执行完毕之后,会自动生成测试报告,存放在reports目录下
- request请求库api讲解
python 中非常流行的客户端请求模块,功能强大,api清晰明了
- 常用的api
request | |
---|---|
method | GET,OPTIONS,HEAD,POST,PUT,PATCH,DELETE |
url | 指定请求的url |
headers | 指定请求头参数 |
params | 指定查询字符串参数 |
json | 传json格式的参数 |
data | 传www-form表单参数 |
3. httprunner框架的一些参数配置
01 环境变量 |
- 在项目目录下的
.env
文件中存放环境变量,可以 通过${ENV(xxx)}
在yml文件中调用
request:url: https://eolink.o.apispace.com/456456/weather/v001/nowmethod: GETheaders:X-APISpace-Token: "xxxxxxxxxxxxxxxxxxxxxx"Authorization-Type: "apikey"params: # 指定查询的字符串areacode: ${ENV(AREACODE)} # 调用环境变量
validate:- eq: ["status_code", 200]
D:\PyCharm\Code\demo5_hrun>hrun api/demo_api.yml --log-level debug
INFO HttpRunner version: 2.3.0
INFO Loading environment variables from D:\PyCharm\Code\demo5_hrun\.env
# 这里创建了环境变量
DEBUG Set OS environment variable: AREACODE
...
================== request details ==================
# 可以看到查询的url中拼接了参数 areacode=101010100
url : 'https://eolink.o.apispace.com/456456/weather/v001/now?areacode=101010100'
02 全局变量 |
- 因为环境变量是所有接口都可以调用的,如果希望变量只在当前接口生效,则可以通过定义全局变量实现
- 通过
$xxx
调用全局变量
# birth_api.ymlname: 测试 api2
# 定义全局变量
variables:moon: "12"day: "15"
request:url: https://eolink.o.apispace.com/birthday-pwd/api/v1/xzw/birthday_pwd/method: GETheaders:xxxx: "xxxxx"params:moon: $moonday: $day
validate:- eq: ["status_code", 200]
03 httprunner_debugtalk.py |
- 如果需要动态地调用一些参数,可以通过在debugtalk.py文件中添加方法来实现
- 在yml文件中通过
${函数名()}
调用
# debugtalk.py
import randomdef get_moon():moon = ["1","2","3","4","5","6","7","8","9","10","11","12"]return random.choice(moon)
# birth_api.ymlparams:moon: ${get_moon()}
04 httprunner_baseurl |
# base_url提取url中公共的域名部分
base_url: https://eolink.o.apispace.com
request:url: /birthday-pwd/api/v1/xzw/birthday_pwd/
05 断言 |
validate:- eq: ["status_code", 201]
# 断言失败,实际与期望结果不符
DEBUG start to validate.
DEBUG extract: status_code => 200
ERROR
validate: status_code equals 201(int) ==> fail
200(int) equals 201(int)
- 断言的另一种写法,可以在package中查看更多种类
D:\Python39-32\Lib\site-packages\httprunner\validator.py
validate:#- eq: ["status_code", 200]- {"check": "status_code", "comparator": "eq", "expect": 200}- {"check": "content", "comparator": "contains", "expect": "message"}- {"check": "content.message", "comparator": "eq", "expect": "OK"}
4. httprunner中extract响应数据提取
- 接口间存在依赖关系,则可以在
testcase
目录下定义接口依赖关系
config:name: "获取项目列表信息配置"base_url: https://eolink.o.apispace.com# 测试步骤
teststeps:
-name: 登录api: api/login.ymlextract:# 把响应报文中的 token 取出来- # 创建一个token的变量- token: content.token
-name: 获取项目列表信息# 在api/get_list.yml可以调用token ($token)api: api/get_list.yml
5. httprunner的三种参数化
- 方式一: 直接在当前文件下,添加用例信息
- 登录接口 api/login.yml
name: 测试login
variables:username: "kk"password: "pwd"
base_url: https://eolink.o.apispace.com
request:url: /api/login/method: POSTheaders:Content-Type : "application/json"json:username: $usernamepassword: $password
validate:- {"check": "status_code", "comparator": "eq", "expect": 200}
- 登录接口配置 testcase/testcase_login.yml
config:name: "登录接口配置"base_url: https://eolink.o.apispace.comteststeps:
-name: $titleapi: api/login.ymlvalidate:- {"check": "status_code", "comparator": "eq", "expect": $status_code}- {"check": "content", "comparator": "contains", "expect": $contain_msg}
- 登录接口套件 testsuits/login_suit.yml
config:name: "接口套件"testcases:
-name: 登录接口套件testcase: testcases/login_testcase.ymlparameters:# 方式一: 直接在当前文件下,添加用例信息- title-username-password-status_code-contain_msg:- ["正常登陆","keyou1","123456",200,"token"]- ["密码错误","keyou1","111111",400,"non_field_errors"]- ["账号错误","keyou1111","123456",400,"non_field_errors"]- ["用户名为空","","123456",400,"username"]- ["密码为空","keyou1","",400,"password"]
- 参数较多,参数复杂
- 可以将测试用例信息存储在文件中
- 在login_suit.yml中调用,使用
${P(文件路径)}
,P代表获取参数
parameters:# 方式二:- title-username-password-status_code-contain_msg: ${P(datas/account.csv)}
- 注意:在csv读取出来的数字或其他值,默认是字符串类型,可以在debugtalk.py中进行类型转化
- 动态生成用例
- 在debugtalk.py中编写函数返回用例
def get_account():# 嵌套字典列表accounts = [{"title": "正常登陆", "username": "keyou1", "password": "123456", "status_code": 200, "contain_msg": "token"},{"title": "密码错误", "username": "keyou1", "password": "111111", "status_code": 400, "contain_msg": "non_field_errors"},{"title": "账号错误", "username": "keyou1111", "password": "123456", "status_code": 400, "contain_msg": "non_field_errors"},{"title": "用户名为空", "username": "", "password": "123456", "status_code": 400, "contain_msg": "username"},{"title": "密码为空", "username": "keyou1", "password": "", "status_code": 400, "contain_msg": "password"}]return accounts
- 在login_suit.yml中调用,使用
${函数名()}
parameters:# 方式三:- title-username-password-status_code-contain_msg: ${get_account()}
- 使用py文件运行用例
# run.py
from httprunner.api import HttpRunnerhttprun = HttpRunner()
httprun.run(r"D:\PyCharm\Code\demo5_hrun\testsuites\login_suit.yml")
print(httprun.summary)
Python自动化测试学习3相关推荐
- 怎么自学python自动化测试-学习自动化测试,如何学习Python语言?
一.Python常用领域Python用于简单脚本编程,如编写2048小游戏或12306的自动抢票软件: Python用于系统编程,如开发系统应用: Python用于开发网络爬虫: 有资料奉上,可以看看 ...
- python自动化测试视频教程_精品系列-悠悠Python自动化测试学习视频,资源教程下载...
课程名称 精品系列-悠悠Python自动化测试学习视频,资源教程下载 课程目录 第1课-http协议上 .mp4 第1课-http协议下.mp4 第2课-fiddler抓包与测试上.mp4 第2课-f ...
- python123测试_【测码学院】python自动化测试学习-自动化测试模型
测码学院 python自动化测试学习 前言 自动化测试过程中,会通过模块的操作先后顺序进行代码编写,但对于整体性来说,需要先构建一个框架或者模型,便于后期对代码的维护,减少代码开发量以及维护成本.目 ...
- python自动化测试学习笔记合集
python自动化测试学习笔记-1 一.什么是自动化 自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程.直白的就是为了节省人力.时间或硬件资源,提高测试效率,便引入了通过软件或程序自动化执行 ...
- python自动化测试学习路线(从入门到精通)
目录:导读 一.Python的应用场景 二.自动化测试的那些事 三.主流自动化测试框架 三.Python自动化测试学习路线 写在最后 一.Python的应用场景 Python用于简单脚本编程,如编写2 ...
- 全栈Python自动化测试学习资料【付费资源、看到即赚到,】
在测试行业从业了十多年积累了很多优秀的资料和素材,并且已经分门别类的整理好(不定期更新),从从0基础入门到高级课程,包含测试工具.学习资料(功能/性能/接口/自动化/app/web/思维导图).笔试面 ...
- python自动化测试学习笔记合集二
python自动化测试学习笔记-4内置函数,处理json 函数.全局变量 写代码时注意的几点事项: 1.一般写代码的时候尽量少用或不用全局变量,首先全局变量不安全,大家协作的情况下,代码公用容易被篡改 ...
- python自动化测试学习笔记合集三
上次我们学到了redis的一些操作,下面来实际运用以下. 这里我们先来学习一下什么是cookie和session. 什么是Cookie 其实简单的说就是当用户通过http协议访问一个服务器的时候,这个 ...
- python自动化测试学习路线
一.Python的应用场景 Python用于简单脚本编程,如编写2048小游戏或12306的自动抢票软件: Python用于系统编程,如开发系统应用: Python用于开发网络爬虫: 网络爬虫的用途是 ...
- Python自动化测试学习哪些知识?
Python自动化测试学习哪些知识?先学习自动化测试基础,学习Appium操作,元素定位.操作.等待.滑动等,深入讲解PO.unittest.yaml.配置文件.测试报告等知识,基于关键字驱动.Pyt ...
最新文章
- windows链接Linux的pgsql,postgreSQL在CMD里怎么连接
- CCF发布2020-2021中国计算机科学技术发展报告
- 一些对制作网站有帮助的站点
- python的dll文件在哪_Python运行DLL文件的方法
- python学习笔记9-函数1
- java后端怎么返回音频流_Java语言中的IO流read()方法返回值为什么是int而不是byte?...
- 「HAOI2018」染色 解题报告
- 正弦函数_题型和解析 | 三角函数(补充)
- Rsyslog+LogAnalyzer+MySQL部署日志服务器
- 关于html5音频如何应用及解决方法?
- Spring-Boot 整合Dubbo 解决@Reference 注解为null情况
- 浅谈虚拟桌面上线推广的最佳时机
- MAC PS更换登记照背景颜色
- 救命稻草VirtualBox,失之交臂VMware—— 2者的guest OS对 恒通笔记本并口卡的支持
- 工业控制系统如何实现网络安全等级保护的相关要求
- caiguai docker-xware_黑科技——通过docker+xware在群辉DSM 6.0系统实现迅雷远程下载-Go语言中文社区...
- ps快捷键 拿走不谢*小Lemon送你们的
- QA:filter-自适应均衡器
- 徒手撸平台——基于Springboot+layui实现接口自动化平台
- Java基础学习笔记(十)——常用API(3)