pytest高阶用法一
程序员文章站
2022-03-11 16:16:49
...
1、pytest.ini (添加于项目根目录下)
pyetst.ini配置文件内容:
[pytest]
# 命令行参数
addopts = -s
# 搜索文件名
python_files = test_*.py
# 搜索的类名
python_classes = Test_*
# 搜索的函数名
python_functions = test_*
2、fixture
fixture修饰器来标记固定的工厂函数,在其他函数,模块,类或整个工程调用它时会被**并优先执行,
通常会被用于完成预置处理和重复操作。
方法:fixture(scope="function", params=None, autouse=False, ids=None, name=None)
常用参数:
scope:被标记方法的作用域
"function" (default):作用于每个测试方法,每个test都运行一次
"class":作用于整个类,每个class的所有test只运行一次
"module":作用于整个模块,每个module的所有test只运行一次
"session:作用于整个session(慎用),每个session只运行一次
params:(list类型)提供参数数据,供调用标记方法的函数使用
autouse:是否自动运行,默认为False不运行,设置为True自动运行
fixture第一个例子(通过参数引用):
import pytest
@pytest.fixture()
def init_func():
print("this is init_func")
class Test_04:
def test_01(self):
print("this is test01")
def test_02(self, init_func):
print("this is test02")
def test_03(self):
print("this is test03")
if __name__ == '__main__':
pytest.main(['test_04.py'])
执行结果:
this is test01
.this is init_func
this is test02
.this is test03
总结:
test_02方法传入了被fixture标识的函数,以变量的形式,且会优先于测试函数运行
fixture第二个例子(通过函数引用) :
import pytest
@pytest.fixture()
def init_func():
print("this is init_func")
@pytest.mark.usefixtures("init_func")
class Test_04:
def test_01(self):
print("this is test01")
def test_02(self):
print("this is test02")
def test_03(self):
print("this is test03")
if __name__ == '__main__':
pytest.main(['test_04.py'])
执行结果:
this is init_func
this is test01
.this is init_func
this is test02
.this is init_func
this is test03
总结:
@pytest.mark.usefixtures(“init_func”)可以放在类前面,则该类中的每个test执行前都会执行一次init_func;若将该语句放在某test前面,则只在执行该test前执行一次init_func
fixture第三个例子(默认设置为运行)
import pytest
@pytest.fixture(autouse=True)
def init_func():
print("this is init_func")
class Test_04:
def test_01(self):
print("this is test01")
def test_02(self):
print("this is test02")
def test_03(self):
print("this is test03")
if __name__ == '__main__':
pytest.main(['test_04.py'])
执行结果:
this is init_func
this is test01
.this is init_func
this is test02
.this is init_func
this is test03
.
结论:autouse默认为False,若改为True,则表示无需引用就会在执行每一个test前自动执行该工厂函数
fixture第四个例子(设置作用域为function):
示例:
import pytest
@pytest.fixture(scope="function", autouse=True)
def init_func():
print("this is init_func")
class Test_04:
def test_01(self):
print("this is test01")
def test_02(self):
print("this is test02")
def test_03(self):
print("this is test03")
if __name__ == '__main__':
pytest.main(['test_04.py'])
执行结果:
this is init_func
this is test01
.this is init_func
this is test02
.this is init_func
this is test03
结论:
fixture参数scope的默认值为“function”,即作用于每个测试方法,每个test都运行一次
fixture第五个例子(设置作用域为class)
import pytest
@pytest.fixture(scope="class", autouse=True)
def init_func():
print("this is init_func")
class Test_04:
def test_01(self):
print("this is test01")
def test_02(self):
print("this is test02")
def test_03(self):
print("this is test03")
if __name__ == '__main__':
pytest.main(['test_04.py'])
结果:
this is init_func
this is test01
.this is test02
.this is test03
结论:
“class”:作用于整个类,每个class的所有test只运行一次
fixture第六个例子(返回值)
import pytest
@pytest.fixture()
def init_func():
return 8
class Test_04:
def test_01(self):
print("this is test01")
def test_02(self, init_func):
print("this is test02")
c = init_func
print(c)
def test_03(self):
print("this is test03")
if __name__ == '__main__':
pytest.main(['test_04.py'])
执行结果:
this is test01
.this is test02
8
.this is test03
示例二:
import pytest
@pytest.fixture(params=[1, 2, 3])
def init_func(request):
return request.param
class Test_04:
def test_01(self):
print("this is test01")
def test_02(self, init_func):
print("this is test02")
c = init_func
print(c)
def test_03(self):
print("this is test03")
if __name__ == '__main__':
pytest.main(['test_04.py'])
执行结果:
# 可以发现结果运行了三次
this is test01
.this is test02
1
.this is test02
2
.this is test02
3
.this is test03
结论:request.param可以当循环参数使用