pytest框架笔记
说明,只是在b站看了学习视频,参考:Python接口自动化测试零基础入门到精通,记录的一些笔记
- python已提供requests库,支持http协议不同类型的接口(session.request),并封装统一的类供调用
- 使用不同的库,可以ctrl并点击对应方法,跳转到库内的原始函数查看相关信息
- 自动导包快捷键:Alt + Enter
- 新增requirements.txt文件,执行pip install -r requirements.txt安装插件
- pytest框架,执行方式
- 命令行,直接输入pytest并回车
- pytest -v 输出更详细的信息
- pytest -s 输出调试信息
- pytest -v 输出更详细的信息
- 主函数,新建run.py文件
- 新建pytest.ini文件
- 命令行,直接输入pytest并回车
- fixtures固件
可以放在测试文件里
也可以单独放一个文件
- 前置,分层级执行
- 通过中间文件存并读取数据
且在请求之前清空数据,效果是中间文件显示的为最新的值,方便排查
读取yaml文件的完整py文件
具体引用
提醒,是用字典,用:不是,yaml文件内容格式是aa:xx,bb:xxxx,所以取aa,用的是冒号
- 数据驱动,先把数据录入到yaml文件
尝试读取yaml文件
具体使用,方法前添加@pytest.mark.parametrize()
- 用yaml实现数据驱动后,怎么把中间文件的变量赋值
- 用yaml实现数据驱动后,怎么执行读取文件操作
- Cookie鉴权:当客户端第一次访问服务器时会产生cookie,客户端从第二次请求起(2-N次)会自动带上这些cookie,在实现自动化时,需要手工处理,让第二个发起的请求带上cookie
class Cookie_test(unittest.TestCase): csrf_token = "" csrf_cookie = "" def test_01_get_cookie(self): url ='http://www.baidu.com/xxxxx' res = requests.get(url = url) # 通过正则表达式取得csrf_token value = re.search('name="csrf_token" value="(.+?)"',res.text) # csrf_token设置为全局变量,供其它方法使用cookie Cookie_test.csrf_token = value.group(1) # 获取cookie并设置为全局变量 Cookie_text.csrf_cookie = res.cookies def test_02_login(self): url = "http://www.baidu.com/xxxxx" data = { "username":"admin", "password":"password", "csrf_token":Cookie_test.csrf_token } headers = { "Accept":"aplication/json, text/javascript", } # 后续发起的请求,需要带上cookie信息 res = requests.post(url, data=data, headers=headers, cookies = Cookie_text.csrf_cookie) print(res.text)
弊端:cookie保存在客户端是不安全的,容易泄露信息(用户名、密码等)
- session鉴权:用户第一次访问服务器时,会在服务器端保存sessionid(经过加密),通过cookie把sessionid保存到客户端,然后请求服务器时只发送sessionid。在自动化实现时,理解为是同一个用户在发送请求
class Cookie_test(unittest.TestCase): csrf_token = "" session = requests.seesion() def test_01_get_cookie(self): url ='http://www.baidu.com/xxxxx' res = Cookie_test.session.get(url = url) # 通过正则表达式取得csrf_token value = re.search('name="csrf_token" value="(.+?)"',res.text) # csrf_token设置为全局变量,供其它方法使用cookie Cookie_test.csrf_token = value.group(1) def test_02_login(self): url = "http://www.baidu.com/xxxxx" data = { "username":"admin", "password":"password", "csrf_token":Cookie_test.csrf_token } headers = { "Accept":"aplication/json, text/javascript", } # 使用session调用 res = Cookie_test.session.post(url, data=data, headers=headers) print(res.text)
弊端:由于sessionid保存在服务器端,并发多的时候容易造成服务器崩溃
接口自动化中实现接口关联的三种方法
- 接口自动化怎实现接口关联的三种方法
- 通过类变量保存
- 通过文件保存
- 封装成方法
- 接口自动化中,提取变量的两种方式
1、正则表达式:
参考代码:
class Cookie_test(unittest.TestCase):
csrf_token = ""
csrf_cookie = ""
def test_01_get_cookie(self):
# 第一个接口获取值,并设置为全局变量
url ='http://www.baidu.com/xxxxx'
res = requests.get(url = url)
#print(res.text)
# 通过正则表达式取得csrf_token
value = re.search('name="csrf_token" value="(.+?)"',res.text)
# 打印出一个re.Merch 对象值
print(value)
# 打印csrf_token
#print(value.group(1))
# csrf_token设置为全局变量,供其它方法使用cookie
Cookie_test.csrf_token = value.group(1)
def test_02_login(self):
url = "http://www.baidu.com/xxxxx"
data = {
"username":"admin",
"password":"password",
# 依赖第一个接口的值,引用全局变量
"csrf_token":Cookie_test.csrf_token
}
headers = {
"Accept":"aplication/json, text/javascript",
}
res = requests.post(url, data=data, headers=headers)
print(res.text)
print(value)的结果,是个re.Match对象
print(value.group(1))的结果,通过下标取预期的值
2、Jsonpath提取:返回的是一个列表
unittest框架笔记
单元测试框架对比
基于Python:unittest、pytest(python的第三方测试框架,需另外下载)
基于Java:junit、testing
编写规则
unittest:提供testcases(测试用例)、testsuites(测试套件——
(1)测试文件必须先导入unittest:import unittest
(2)测试类必须继承unittest.TestCase
(3)测试方法必须以test开头
pytest:python的第三方测试框架。基于unittest的扩展框架,必须遵守以下规则:
(1)测试文件名必须以test_开头或者_test结尾
(2)测试类命名必须以Test开头
(3)测试方法必须test开头
用例的前后置
unittest
setUp/tearDown | 在每个用例之前/之后执行一次 | 常用于:打开浏览器,加载或关闭网页 |
setUpClass/tearDownClass | 在每个类之前/之后运行一次 | 常用于:创建/关闭数据库链接,创建/关闭日志对象 |
setUpModule/tearDownModule | 在每个模块之前/之后执行一次 |
pytest
方法类:参考代码位置,在类里面
class test():
def setup_mothod(self):
// 在方法之前使用
pass
def test_function(self):
// 类里面是方法
pass
def tear_mothod(self):
// 在方法之后使用
pass
函数类:参考代码位置,在类外面
def setup_function(self):
// 在函数之前使用
pass
def fun_sum(self):
//类外面是函数
pass
def setup_function(self):
// 在函数之后使用
pass
class test():
def hello(self):
pass
方法级 | setup_mothod/teardown_mothod | 在方法之前/之后 |
setup/teardown | ||
函数级 | setup_function/teardown_function | 在函数之前/之后 |
类级 | setup_class/teardown_class | |
模块级 | setup_module/teardown_module |
断言
unitest: assertTure/assertEqual/assertIn
pytest: assert
报告
unittest: htmltestrunner
pytest: 插件: pytest-HTML, allure
失败重跑
unittest: 没有
pytest: pytest-rerunfailures插件
数据驱动
unittest: ddt
pytest: @pytest.mark.parametrize装饰器
用例分类执行
unittest: 默认执行所有,也可以通过testsuite来执行部分用例,或者-k参数
pytest: @pytest.mark