pytest测试框架1-强大的Fixture功能
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_30758629/article/details/95923286
1.fixture是 干什么用的??
fixture是在测试函数运行前后,由pytest执行的外壳函数;代码可以定制,满足多变的测试需求;
包括定义传入测试中的数据集,配置测试前系统的初始状态,为批量测试提供数据源等等...
fixture是pytest用于将测试前后进行预备,清理工作的代码分离出核心测试逻辑的一种机制!
2.举个例子
@pytest.fixture()
def some_data():
return 42
def test_some_data(some_data):
assert some_data == 42
#@pytest.fixture() 装饰器用于声明函数是一个fixture
如果测试函数的参数列表中包含fixture名字,那么pytest会检测到,
检测顺序是:优先搜索该测试所在的模块,然后搜索conftest.py
并在测试函数运行之前执行该fixture,
fixture可以完成测试任务,也可以返回数据给测试函数
pytest --setup-show test_example1.py
3.fixture函数放在哪里合适?
1.可以放在单独的测试文件里
2.如果希望多个测试文件共享fixture,可以放在某个公共目录下新建一个conftest文件,将fixture放在里面。
4.使用fixture传递测试数据
fixture非常适合存放测试数据,并且他可以返回任何数据
@pytest.fixture()
def a_list():
return [1,2,3,44,5]
def test_a_list(a_list):
assert a_list[2] == 3
5.指定fixture作用范围
fixture里面有个scope参数可以控制fixture的作用范围:session > module > class > function
1)function
每一个函数或方法都会调用
@ pytest.fixture()
def first():
print("
获取用户名")
a = "xiaoyulaoshi"
return a
@pytest.fixture(scope="function")
def sencond():
print("
获取密码")
b = "123456"
return b
def test_1(first):
'''用例传fixture'''
print("测试账号:%s" % first)
assert first == "xiaoyulaoshi"
def test_2(sencond):
'''用例传fixture'''
print("测试密码:%s" % sencond)
assert sencond == "123456"
2).class 每一个类调用一次,一个类可以有多个方法
@pytest.fixture(scope="class")
def first():
print("
获取用户名,scope为class级别只运行一次")
a = "xiaoyulaoshi"
return a
class TestCase():
def test_1(self, first):
'''用例传fixture'''
print("测试账号:%s" % first)
assert first == "xiaoyulaoshi"
def test_2(self, first):
'''用例传fixture'''
print("测试账号:%s" % first)
assert first == "xiaoyulaoshi"
3).module,每一个.py文件调用一次,该文件内又有多个function和class
import pytest
@pytest.fixture(scope="module")
def first():
print("
获取用户名,scope为module级别当前.py模块只运行一次")
a = "xiaoyulaoshi"
return a
def test_1(first):
'''用例传fixture'''
print("测试账号:%s" % first)
assert first == "xiaoyulaoshi"
class TestCase():
def test_2(self, first):
'''用例传fixture'''
print("测试账号:%s" % first)
assert first == "xiaoyulaoshi"
4).session
是多个文件调用一次,可以跨.py文件调用,每个.py文件就是module
当我们有多个.py文件的用例时候,如果多个用例只需调用一次fixture,那就可以设置为scope = "session",并且写到conftest.py文件里
conftest.py
import pytest
@pytest.fixture(scope="session")
def first():
print("
获取用户名,scope为session级别多个.py模块只运行一次")
a = "xiaoyulaoshi"
return a
test_fixture11.py
import pytest
def test_1(first):
'''用例传fixture'''
print("测试账号:%s" % first)
assert first == "xiaoyulaoshi"
import pytest
def test_2(first):
'''用例传fixture'''
print("测试账号:%s" % first)
assert first == "xiaoyulaoshi"
6.fixture的参数化
pytest支持在多个完整测试参数化方法:
1).pytest.fixture(): 在fixture级别的function处参数化
2).@pytest.mark.parametrize:允许在function或class级别的参数化,为特定的测试函数或类提供了多个argument/fixture设置。
3_.pytest_generate_tests:可以实现自己的自定义动态参数化方案或扩展。
import pytest
import requests
par_to_test=[{
"case": "serach a word :haha",
"headers": {},
"querystring": {
"wd":"hah"
},
"payload": {},
"expected": {
"status_code":200
}
},
{
"case": "serach a word2 :kuku",
"headers": {},
"querystring": {
"wd":"kuku"
},
"payload": {},
"expected": {
"status_code":200
} },
{
"case": "serach a word3 :xiaoyulaoshi",
"headers": {},
"querystring": {
"wd":"xiaoyulaoshi"
},
"payload": {},
"expected": {
"status_code":200
} }
]
@pytest.fixture(params = par_to_test)
def class_scope(request):
return request.param
def test_baidu_search(class_scope):
url = "https://www.baidu.com"
r = requests.request("GET", url, data=class_scope["payload"], headers=class_scope["headers"], params=class_scope["querystring"])
assert r.status_code == class_scope["expected"]["status_code"]