上一小节,我们学习了pytest跳过测试用例的方法,本小节我们讲解一下pytest用例的前后置方法。
在unittest中就有前置setup和后置teardown来处理测试用例执行前的准备工作(浏览器驱动实例化,数据库连接等)以及执行后的处理工作(清理数据,关闭浏览器驱动,关闭数据库连接等),那么pytest同样也提供了前置后置的方法来满足这个需求。
pytest提供了以下5个前置后置方法:
- setup_module、teardown_module(模块级别):整个py文件,测试用例执行前后只执行一次
- setup_class、teardown_class:(类级别):整个测试类中,测试用例执行前后只执行一次
- setup、teardown(函数级别):每条用例执行前后都会执行一次,既可以作用于类中测试函数,也可以作用于类外测试函数
- setup_method、teardown_method(方法级别):每条用例执行前后都会执行一次,只作用于类中测试函数
- setup_function、teardown_function(函数级别):每条用例执行前后都会执行一次,只作用于类外测试函数使用
1、setup_module、teardown_module(模块级别)示例
#test_demo.pyimport pytestclass Test_04:def test_01(self):print('用例01执行')def test_02(self):print('用例02执行')def test_03():print('类外用例03执行')def setup_module():print('\n我是setup_module前置执行\n')def teardown_module():print('\n我是teardown_module后置执行')def test_04():print('类外用例04执行')if __name__ == '__main__':pytest.main()
运行结果如下:整个py文件,测试用例执行前后只执行了一次
Launching pytest with arguments D:\PycharmProjects\Source_Code\pytest_demo\test_demo.py --no-header --no-summary -q in D:\PycharmProjects\Source_Code\pytest_demo============================= test session starts =============================
collecting ... collected 4 itemstest_demo.py::Test_04::test_01
我是setup_module前置执行PASSED [ 25%]用例01执行test_demo.py::Test_04::test_02 PASSED [ 50%]用例02执行test_demo.py::test_03 PASSED [ 75%]类外用例03执行test_demo.py::test_04 PASSED [100%]类外用例04执行我是teardown_module后置执行============================== 4 passed in 0.03s ==============================
2、setup_class、teardown_class:(类级别)示例
import pytestclass Test_04:def test_01(self):print('用例01执行')def setup_class(self):print('\n我是setup_class前置执行\n')def teardown_class(self):print('\n我是teardown_class后置执行')def test_02(self):print('用例02执行')def test_03():print('类外用例03执行')def test_04():print('类外用例04执行')if __name__ == '__main__':pytest.main()
运行结果如下:整个测试类中,测试用例执行前后只执行了一次
============================= test session starts =============================
collecting ... collected 4 itemstest_demo.py::Test_04::test_01
我是setup_class前置执行PASSED [ 25%]用例01执行test_demo.py::Test_04::test_02 PASSED [ 50%]用例02执行我是teardown_class后置执行test_demo.py::test_03 PASSED [ 75%]类外用例03执行test_demo.py::test_04 PASSED [100%]类外用例04执行============================== 4 passed in 0.02s ==============================
3.1、setup、teardown(函数级别) 作用于类中测试函数 示例
import pytestclass Test_04:def setup(self):print('\nsetup前置执行\n')def teardown(self):print('\nteardown后置执行\n')def test_01(self):print('用例01执行')def test_02(self):print('用例02执行')if __name__ == '__main__':pytest.main()
运行结果如下:每条用例执行前后都会执行一次,既可以作用于类中测试函数
============================= test session starts =============================
collecting ... collected 2 itemstest_demo.py::Test_04::test_01
setup前置执行PASSED [ 50%]用例01执行teardown后置执行test_demo.py::Test_04::test_02
setup前置执行PASSED [100%]用例02执行teardown后置执行======================== 2 passed, 4 warnings in 0.03s ========================
3.2、setup、teardown(函数级别) 作用于类外测试函数 示例
import pytestdef setup():print('\n类外setup前置执行\n')def teardown():print('\n类外teardown后置执行\n')def test_03():print('类外用例03执行')def test_04():print('类外用例04执行')if __name__ == '__main__':pytest.main()
运行结果如下:每条用例执行前后都会执行一次,也可以作用于类外测试函数
test_demo.py::test_03
类外setup前置执行PASSED [ 50%]类外用例03执行类外teardown后置执行test_demo.py::test_04
类外setup前置执行PASSED [100%]类外用例04执行类外teardown后置执行============================== 2 passed in 0.03s ==============================
4、setup_method、teardown_method(方法级别)示例
import pytestclass Test_04:def setup_method(self):print('\nsetup_method前置执行\n')def teardown_method(self):print('\nteardown_method后置执行\n')def test_01(self):print('用例01执行')def test_02(self):print('用例02执行')if __name__ == '__main__':pytest.main()
运行结果如下:每条用例执行前后都会执行一次,只作用于类中测试函数
============================= test session starts =============================
collecting ... collected 2 itemstest_demo.py::Test_04::test_01
setup_method前置执行PASSED [ 50%]用例01执行teardown_method后置执行test_demo.py::Test_04::test_02
setup_method前置执行PASSED [100%]用例02执行teardown_method后置执行============================== 2 passed in 0.02s ==============================
5、setup_function、teardown_function(函数级别)示例
import pytestclass Test_04:def test_01(self):print('用例01执行')def test_02(self):print('用例02执行')def setup_function():print('\nsetup_function前置执行\n')
def teardown_function():print('\nteardown_function后置执行\n')def test_03():print('类外用例03执行')
def test_04():print('类外用例04执行')if __name__ == '__main__':pytest.main()
运行结果如下:每条用例执行前后都会执行一次,只作用于类外测试函数使用
============================= test session starts =============================
collecting ... collected 4 itemstest_demo.py::Test_04::test_01 PASSED [ 25%]用例01执行test_demo.py::Test_04::test_02 PASSED [ 50%]用例02执行test_demo.py::test_03
setup_function前置执行PASSED [ 75%]类外用例03执行teardown_function后置执行test_demo.py::test_04
setup_function前置执行PASSED [100%]类外用例04执行teardown_function后置执行============================== 4 passed in 0.03s ==============================
前、后置执行顺序
1、测试类中前、后置执行顺序 示例
import pytestclass Test_04:def setup(self):print('setup前置执行')def teardown(self):print('teardown后置执行')def setup_class(self):print('\nsetup_class前置执行\n')def teardown_class(self):print('\nteardown_class后置执行\n')def setup_method(self):print('setup_method前置执行')def teardown_method(self):print('teardown_method后置执行')def test_01(self):print('用例01执行')def test_02(self):print('用例02执行')if __name__ == '__main__':pytest.main()
运行结果如下:前置执行顺序:setup_class > setup_method > setup (后置执行顺序则相反)
============================= test session starts =============================
collecting ... collected 2 itemstest_demo.py::Test_04::test_01
setup_class前置执行setup_method前置执行
PASSED [ 50%]用例01执行
teardown_method后置执行test_demo.py::Test_04::test_02 setup_method前置执行
PASSED [100%]用例02执行
teardown_method后置执行teardown_class后置执行============================== 2 passed in 0.02s ==============================
2、测试类外前、后置执行顺序 示例
import pytestdef setup():print('类外setup前置执行')def teardown():print('类外teardown后置执行')def setup_function():print('\nsetup_function前置执行\n')def teardown_function():print('\nteardown_function后置执行\n')def setup_module():print('\nsetup_module前置执行\n')def teardown_module():print('teardown_module后置执行')def test_03():print('类外用例03执行')def test_04():print('类外用例04执行')if __name__ == '__main__':pytest.main()
运行结果如下:前置执行顺序:setup_module > setup_function > setup (后置执行顺序则相反)
test_demo.py::test_03
setup_module前置执行setup_function前置执行类外setup前置执行
PASSED [ 50%]类外用例03执行
类外teardown后置执行teardown_function后置执行test_demo.py::test_04
setup_function前置执行类外setup前置执行
PASSED [100%]类外用例04执行
类外teardown后置执行teardown_function后置执行teardown_module后置执行============================== 2 passed in 0.02s ==============================
总结:
1、测试类中:setup_class、teardown_class
setup_method、teardown_method
测试类外:setup_function、teardown_function
setup_module、teardown_module
测试类中、类外均可:setup、teardown
2、执行顺序:
类中前置执行顺序:setup_class > setup_method > setup (后置执行顺序则相反)
类外前置执行顺序:setup_module > setup_function > setup (后置执行顺序则相反)
最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走,希望可以帮助到大家!