pytest中的前置和后置
pytest比较强大,提供了不仅仅一种方法的前置和后置: – 模块级(setup_module/teardown_module)开始于横块始末,全局的 – 函数级(setup_function/teardown_function)只对函数用例生效 – 类级(setup_class/teardown_class)只在类中前后运行一次 –方法级(setup_method/teardown_method)开始于方法始末 –(setup/teardown)运行在调用方法前后
类内外执行:方法细化级setup/teardown
setup/teardown:无论是类内还是类外,每个方法都会执行1次。
setup: 方法运行前执行
teardown:方法运行完才执行
import pytest
def setup():
print("...类外setup...")
def test_create():
print("类外test_create")
def test_view():
print("类外test_view")
class TestSetupClass:
def setup(self):
print("...类内setup...")
def test_create(self):
print("类内test_create")
def test_view(self):
print("类内test_view")
def teardown(self):
print("...类内teardown...")
def teardown():
print("...类外teardown...")
if __name__ == '__main__':
pytest.main(['-vs', 'test_setup.py'])
执行结果如下:类外类内方法的都有执行前置和后置,每个方法分别执行1次。
备注:也可以通过在fixture函数中通过yield实现setup和teardown功能
类外执行:模块级(setup_module/teardown_module)
setup_module/teardown_module:
只有前置后置方法在class外部时,才会被执行。整个.py文件只执行1次。
适合.py存在多个class时使用。
setup_module: 在.py文件的第一个class前执行。
teardown_module:在.py文件的最后一个class后执行。
测试代码如下:class内外同时存在模块级方法
import pytest
def setup_module():
print("...类外 setup_module...")
class TestModuleClass:
def setup_module(self):
print("...类内 setup_module...")
def test_create(self):
print("测试用例test_create")
def test_view(self):
print("测试用例test_view")
def teardown_module(self):
print("...类内 teardown_module...")
def teardown_module():
print("...类外 teardown_module...")
if __name__ == '__main__':
pytest.main(['-vs')
执行结果如下:只执行class外的前置后置方法,只执行1次。第1个class TestModuleClass1前执行前置,最后1个class TestModuleClass2之后执行后置。
类外执行:函数级(setup_function/teardown_function)
setup_function/teardown_function:
只有类外部的方法才会执行。每个方法执行一次。
setup_function: 类外部的方法前执行。
teardown_function: 类外部的方法后执行。
import pytest
def setup_function():
print("...类外setup_function...")
def test_create():
print("类外测试用例test_create")
def test_view():
print("类外测试用例test_view")
class TestFunctionClass:
def setup_function(self):
print("...类内setup_function...")
def test_create(self):
print("测试用例test_create")
def test_view(self):
print("测试用例test_view")
def teardown_function(self):
print("...类内teardown_function...")
def teardown_function():
print("...类外teardown_function...")
if __name__ == '__main__':
pytest.main(['-vs', 'test_setup_function.py'])
执行结果如下:只执行class外的方法,类外方法test_create/test_view分别执行1次:方法前执行setup_function,方法后执行teardown_function。
类内执行:类级(setup_class/teardown_class)
setup_class/teardown_class:
只有方法在class内部时,才可以执行。class内只运行1次。
setup_class:在第一个method运行前执行。
teardown_class:在最后一个method运行前执行。
import pytest
def setup_class():
print("...类外 setup_class...")
class TestClassClass:
def setup_class(self):
print("...类内 setup_class...")
def test_create(self):
print("测试用例test_create")
def test_view(self):
print("测试用例test_view")
def teardown_class(self):
print("...类内 teardown_class...")
def teardown_class():
print("...类外 teardown_class...")
if __name__ == '__main__':
pytest.main(['-vs', 'test_setup_class.py'])
执行结果如下:只执行class内的方法,第一个方法test_create前执行setup_class,最后一个方法test_view后执行teardown_class。
类内执行:方法级(setup_method/teardown_method)
setup_method/teardown_method:
只有方法在class内部时,才可以执行。class内运行多次。
setup_method: 每个method前执行一次。
teardown_method: 每个method后执行一次。
在method运行的前后执行。,每个method都会运行1次。
import pytest
def setup_method():
print("...类外 setup_method...")
class TestMethodClass:
def setup_method(self):
print("...类内 setup_method...")
def test_create(self):
print("测试用例test_create")
def test_view(self):
print("测试用例test_view")
def teardown_method(self):
print("...类内 teardown_method...")
def teardown_method():
print("...类外 teardown_method...")
if __name__ == '__main__':
pytest.main(['-vs', 'test_setup_method.py'])
执行结果如下:只执行class内的方法,执行了2次。test_create/test_view:方法前执行setup_method,方法执行setup_method,分别执行了1次。
组合使用
由于Python语法规范,.py文件的class可有可无,故分2种情况来演示说明。
有Class的执行顺序:
setup_module => setup_function => 类外setup => 类外测试用例
=> setup_class => setup_method => 类内setup => 类内测试用例
先执行class外部的方法,再按顺序执行class内方法。
import pytest
def setup_module():
print("类外setup_module")
def setup_function():
print("类外setup_function")
def setup():
print("类外setup")
def test_create():
print("类外测试用例test_create")
def test_view():
print("类外测试用例test_view")
class TestClass_1:
def setup_class(self):
print("类内setup_class")
def setup_method(self):
print("类内setup_method")
def test_create_1(self):
print("测试用例test_create_1")
def test_view_1(self):
print("测试用例test_view_1")
def teardown_method(self):
print("类内teardown_method")
def teardown_class(self):
print("类内teardown_class")
class TestClass_2:
def test_create_2(self):
print("测试用例test_create_2")
def test_view_2(self):
print("测试用例test_view_2")
def teardown():
print("类外teardown")
def teardown_function():
print("类外teardown_function")
def teardown_module():
print("类外teardown_module")
if __name__ == '__main__':
pytest.main(['-vs', 'test_all_setup_class.py'])
执行结果如下:
无Class的执行顺序:不执行适用于class内的前置和后置方法
setup_module => setup_function => setup => 测试用例
未执行:setup_class、setup_method
import pytest
def setup_module():
print("setup_module")
def setup_function():
print("setup_function")
def setup():
print("setup")
def setup_class():
print("setup_class")
def setup_method():
print("setup_method")
def test_create():
print("测试用例test_create")
def test_view():
print("测试用例test_view")
def teardown_method():
print("teardown_method")
def teardown_class():
print("teardown_class")
def teardown():
print("teardown")
def teardown_function():
print("teardown_function")
def teardown_module():
print("teardown_module")
if __name__ == '__main__':
pytest.main(['-vs', 'test_all_setup.py'])
执行结果如下:没有class时,默认不执行适用在class内的前置和后置方法
使用场景
-
若是.py文件中没有定义class,可以使用setup_module、setup_function、setup,它们的优先级别是:setup_module > setup_function > setup。 -
setup_function 与 setup_method 都是方法级前置,setup_method适用于class内。 -
setup_function 与 setup都会在每个方法前执行1次,所以只使用其中1个即可。 -
setup_function 优于setup,但是setup没有类内外的限制,建议方法级别使用setup。 -
setup_module: .py文件中只执行1次,最先执行的前置,适合统一登录、数据库连接等。 -
setup: 每个方法前执行,适合测试用例的数据准备、单独登录等。
|