setup和teardown是测试脚本中非常常见的预配置和清理配置,即在执行用例之前做一些预置处理和当用例执行完成之后做一些环境恢复的清理配置,因为用例所处的层级不一样,因此setup和teardown也对应的分为若干类型,在 Pytest----Pytest自动化测试框架快速入门中提到pytest功能非常的强大,同时又非常的简单,其实简单的的一个重要原因就是当使用好这些setup和teardown,则几乎不用去关注pytest的其他的高级功能,就已经可以做到和类似unittest框架差不多的功能,即运用好这些setup和teardown已经可以为一个中小型项目做自动化测试框架了。换句话说如果在开发团队部署单元测试或者功能测试的自动化,则无需去关注其他pytest的高级功能,因为任何事物都是有两面性的,去使用高级功能确实是显得非常专业非常的高大上,但同时运维的成本也无形的增加了许多。
一、模块级的setup和teardown
编写如下测试脚本
# test_module.py
import pytest
def setup_module():
print("\nin setup_module......")
def teardown_module():
print("\nin teardown_module......")
def test_func1():
print("\nin test_func1......")
assert 1 == 1
def test_func2():
print("\nin test_func2......")
assert 1 == 1
执行结果如下,可以看出setup_module会在执行当前模块中所有测试用例之前执行,而teardown_module会在当前模块的所有用例执行完成之后再执行
$ pytest -s test_module.py
========================================================================= test session starts ==========================================================================
platform win32 -- Python 3.9.7, pytest-6.2.5, py-1.10.0, pluggy-1.0.0
rootdir: D:\src\blog\tests
plugins: allure-pytest-2.9.43, caterpillar-pytest-0.0.2, forked-1.3.0, rerunfailures-10.1, xdist-2.3.0
collected 2 items
test_module.py
in setup_module......
in test_func1......
.
in test_func2......
.
in teardown_module......
========================================================================== 2 passed in 0.02s ===========================================================================
$
二、函数级的setup和teardown
编写如下测试脚本
# test_module.py
import pytest
def setup_module():
print("\nin setup_module......")
def teardown_module():
print("\nin teardown_module......")
def setup_function():
print("\nin setup_function......")
def teardown_function():
print("\nin teardown_function......")
def test_func1():
print("\nin test_func1......")
assert 1 == 1
def test_func2():
print("\nin test_func2......")
assert 1 == 1
执行结果如下,可以看出,setup_function是在每个测试函数执行之前都会执行,而teardown_funciton则会在每个测试函数执行完成之后执行一次
$ pytest -s
========================================================================= test session starts ==========================================================================
platform win32 -- Python 3.9.7, pytest-6.2.5, py-1.10.0, pluggy-1.0.0
rootdir: D:\src\blog\tests
plugins: allure-pytest-2.9.43, caterpillar-pytest-0.0.2, forked-1.3.0, rerunfailures-10.1, xdist-2.3.0
collected 2 items
test_module.py
in setup_module......
in setup_function......
in test_func1......
.
in teardown_function......
in setup_function......
in test_func2......
.
in teardown_function......
in teardown_module......
========================================================================== 2 passed in 0.03s ===========================================================================
$
三、模块中的setup和teardown
编写如下测试脚本:
# test_module.py
import pytest
def setup_module():
print("\nin setup_module......")
def teardown_module():
print("\nin teardown_module......")
def setup_function():
print("\nin setup_function......")
def teardown_function():
print("\nin teardown_function......")
def setup():
print("\nin setup......")
def teardown():
print("\nin teardown......")
def test_func1():
print("\nin test_func1......")
assert 1 == 1
def test_func2():
print("\nin test_func2......")
assert 1 == 1
执行结果如下,setup和teardown与函数级的setup_function和teardown_function功能是完全一样的,即setup在每个测试函数执行之前执行一次,teardown在每个测试函数执行完成之后执行一次,只不过他们的优先级不一样,在每个测试函数执行执行,先执行setup_function,然后再执行setup。在每个测试函数执行完成之后,先执行teardown,在执行teardown_function
$ pytest -s
========================================================================= test session starts ==========================================================================
platform win32 -- Python 3.9.7, pytest-6.2.5, py-1.10.0, pluggy-1.0.0
rootdir: D:\src\blog\tests
plugins: allure-pytest-2.9.43, caterpillar-pytest-0.0.2, forked-1.3.0, rerunfailures-10.1, xdist-2.3.0
collected 2 items
test_module.py
in setup_module......
in setup_function......
in setup......
in test_func1......
.
in teardown......
in teardown_function......
in setup_function......
in setup......
in test_func2......
.
in teardown......
in teardown_function......
in teardown_module......
========================================================================== 2 passed in 0.02s ===========================================================================
$
四、类级的setup和teardown
编写如下测试脚本
# test_module.py
import pytest
class TestClass(object):
def setup_class(self):
print("\nin TestClass.setup_class......")
def teardown_class(self):
print("\nin TestClass.teardown_class......")
def test_method1(self):
print("\nin TestClass.test_method1......")
assert 1==1
def test_method2(self):
print("\nin TestClass.test_method2......")
assert 1==1
执行结果如下,可以看出setup_class会在测试类的所有用例之前执行,teardown_class会在测试类的所有测试用例之后执行
$ pytest -s
========================================================================= test session starts ==========================================================================
platform win32 -- Python 3.9.7, pytest-6.2.5, py-1.10.0, pluggy-1.0.0
rootdir: D:\src\blog\tests
plugins: allure-pytest-2.9.43, caterpillar-pytest-0.0.2, forked-1.3.0, rerunfailures-10.1, xdist-2.3.0
collected 2 items
test_module.py
in TestClass.setup_class......
in TestClass.test_method1......
.
in TestClass.test_method2......
.
in TestClass.teardown_class......
========================================================================== 2 passed in 0.03s ===========================================================================
$
五、类中的方法级的setup和teardown
编写如下测试脚本;
# test_module.py
import pytest
class TestClass(object):
def setup_class(self):
print("\nin TestClass.setup_class......")
def teardown_class(self):
print("\nin TestClass.teardown_class......")
def setup_method(self):
print("\nin TestClass.setup_method......")
def teardown_method(self):
print("\nin TestClass.teardown_method......")
def test_method1(self):
print("\nin TestClass.test_method1......")
assert 1==1
def test_method2(self):
print("\nin TestClass.test_method2......")
assert 1==1
执行结果如下,可以看出,setup_method会在测试类中的每个测试方法执行之前执行,teardown_method则会在测试类中的每个测试方法执行完成之后执行
$ pytest -s
========================================================================= test session starts ==========================================================================
platform win32 -- Python 3.9.7, pytest-6.2.5, py-1.10.0, pluggy-1.0.0
rootdir: D:\src\blog\tests
plugins: allure-pytest-2.9.43, caterpillar-pytest-0.0.2, forked-1.3.0, rerunfailures-10.1, xdist-2.3.0
collected 2 items
test_module.py
in TestClass.setup_class......
in TestClass.setup_method......
in TestClass.test_method1......
.
in TestClass.teardown_method......
in TestClass.setup_method......
in TestClass.test_method2......
.
in TestClass.teardown_method......
in TestClass.teardown_class......
========================================================================== 2 passed in 0.03s ===========================================================================
$
六、类中的setup和teardown
编写测试脚本如下:
# test_module.py
import pytest
class TestClass(object):
def setup_class(self):
print("\nin TestClass.setup_class......")
def teardown_class(self):
print("\nin TestClass.teardown_class......")
def setup_method(self):
print("\nin TestClass.setup_method......")
def teardown_method(self):
print("\nin TestClass.teardown_method......")
def setup(self):
print("\nin TestClass.setup......")
def teardown(self):
print("\nin TestClass.teardown......")
def test_method1(self):
print("\nin TestClass.test_method1......")
assert 1==1
def test_method2(self):
print("\nin TestClass.test_method2......")
assert 1==1
执行结果如下,setup和teardown与方法级的setup和teardown功能完全一样,即setup在类的每个测试方法执行之前执行,teardown在类的每个测试方法执行完成之后执行,不同点就是setup在setup_method之后执行,teardown在teardown_method之前执行,即他们的优先级不一样
$ pytest -s
========================================================================= test session starts ==========================================================================
platform win32 -- Python 3.9.7, pytest-6.2.5, py-1.10.0, pluggy-1.0.0
rootdir: D:\src\blog\tests
plugins: allure-pytest-2.9.43, caterpillar-pytest-0.0.2, forked-1.3.0, rerunfailures-10.1, xdist-2.3.0
collected 2 items
test_module.py
in TestClass.setup_class......
in TestClass.setup_method......
in TestClass.setup......
in TestClass.test_method1......
.
in TestClass.teardown......
in TestClass.teardown_method......
in TestClass.setup_method......
in TestClass.setup......
in TestClass.test_method2......
.
in TestClass.teardown......
in TestClass.teardown_method......
in TestClass.teardown_class......
========================================================================== 2 passed in 0.03s ===========================================================================
$
七、模块和类同时存在setup和teardown
当测试脚本中同时存在模块的setup与teardown以及类的setup与teardown,其实同时存在时不会冲突的,编写测试脚本如下:
# test_module.py
import pytest
class TestClass(object):
def setup_class(self):
print("\nin TestClass.setup_class......")
def teardown_class(self):
print("\nin TestClass.teardown_class......")
def setup_method(self):
print("\nin TestClass.setup_method......")
def teardown_method(self):
print("\nin TestClass.teardown_method......")
def setup(self):
print("\nin TestClass.setup......")
def teardown(self):
print("\nin TestClass.teardown......")
def test_method1(self):
print("\nin TestClass.test_method1......")
assert 1==1
def test_method2(self):
print("\nin TestClass.test_method2......")
assert 1==1
def setup_module():
print("\nin setup_module......")
def teardown_module():
print("\nin teardown_module......")
def setup_function():
print("\nin setup_function......")
def teardown_function():
print("\nin teardown_function......")
def setup():
print("\nin setup......")
def teardown():
print("\nin teardown......")
def test_func1():
print("\nin test_func1......")
assert 1 == 1
def test_func2():
print("\nin test_func2......")
assert 1 == 1
执行结果如下,可以看出,模块中的setup、teardown与类中的setup、teardown是没有冲突的,唯一一点需要注意就是模块级的setup_module是在整个模块之前执行,而teardown_module是在整个文件执行完成之后再执行,至于是模块中的测试函数和类中的测试函数执行顺序是按照从前到后的顺序执行的。
$ >pytest -s
========================================================================= test session starts ==========================================================================
platform win32 -- Python 3.9.7, pytest-6.2.5, py-1.10.0, pluggy-1.0.0
rootdir: D:\src\blog\tests
plugins: allure-pytest-2.9.43, caterpillar-pytest-0.0.2, forked-1.3.0, rerunfailures-10.1, xdist-2.3.0
collected 4 items
test_module.py
in setup_module......
in TestClass.setup_class......
in TestClass.setup_method......
in TestClass.setup......
in TestClass.test_method1......
.
in TestClass.teardown......
in TestClass.teardown_method......
in TestClass.setup_method......
in TestClass.setup......
in TestClass.test_method2......
.
in TestClass.teardown......
in TestClass.teardown_method......
in TestClass.teardown_class......
in setup_function......
in setup......
in test_func1......
.
in teardown......
in teardown_function......
in setup_function......
in setup......
in test_func2......
.
in teardown......
in teardown_function......
in teardown_module......
========================================================================== 4 passed in 0.03s ===========================================================================
$