setupteardown是用来处理用例的开始前工作和结束后的工作,pytest提供了多种类型的前置和后置,其中包括:

  • setup_module / teardown_module
  • setup_function / teardown_function
  • setup_class / teardown_class
  • setup_method / teardown_method
  • setup / teardown

    代码解析

    ```python import pytest

def setup(): print(“[->]setup 类外前置”) print(“类外的setup,在所有的类外函数执行前执行\n”)

def teardown(): print(“[->]teardown 类外后置”) print(“类外的teardown,在所有的类外函数执行后执行\n”)

def setup_function(): print(“[->]setup_function”) print(“只对函数用例(不在class里面的)生效,有多少条函数用例执行多少次前置\n”)

def teardown_function(): print(“[->]teardown_function”) print(“只对函数用例(不在class里面的)生效,有多少条函数用例执行多少次后置\n”)

def setup_module(): print(“[->]setup_module”) print(“最先执行的前置,且在整个 *.py 文件执行时只执行一次\n”)

def teardown_module(): print(“[->]teardown_module”) print(“最后执行的后置,且在整个 *.py 文件执行时只执行一次\n”)

def test_add_01(): print(“执行类外用例test_add_01”) assert 1+1 == 2

def test_add_02(): print(“执行类外用例test_add_02”) assert 2+2 == 4

class TestAdd(): def setup(self): print(“[->]setup 类中前置”) print(“类中的setup,在所有的类外函数执行前执行\n”)

  1. def teardown(self):
  2. print("[->]teardown 类中后置")
  3. print("类中的teardown,在所有的类外函数执行前执行\n")
  4. def setup_class(self):
  5. print("[->]setup_class")
  6. print("在类中运行的前置,只运行一次\n")
  7. def teardown_class(self):
  8. print("[->]teardown_class")
  9. print("在类中运行的后置,只运行一次\n")
  10. def setup_method(self):
  11. print("[->]setup_method")
  12. print("在类中每条case前运行的前置,每条case分别运行一次\n")
  13. def teardown_method(self):
  14. print("[->]teardown_method")
  15. print("在类中每条case后运行的后置,每条case分别运行一次\n")
  16. def test_add_03(self):
  17. print("执行类中用例test_add_03")
  18. assert 3+3 == 6
  19. def test_add_04(self):
  20. print("执行类中用例test_add_04")
  21. assert 4+4 == 8

if name == “main“: pytest.main([‘-s’, ‘MyPytest.py’])

  1. 运行结果:
  2. ```python
  3. collected 4 items
  4. MyPytest.py [->]setup_module
  5. 最先执行的前置,且在整个 *.py 文件执行时只执行一次
  6. [->]setup_function
  7. 只对函数用例(不在class里面的)生效,有多少条函数用例执行多少次前置
  8. [->]setup 类外前置
  9. 类外的setup,在所有的类外函数执行前执行
  10. 执行类外用例test_add_01
  11. .[->]teardown 类外后置
  12. 类外的teardown,在所有的类外函数执行后执行
  13. [->]teardown_function
  14. 只对函数用例(不在class里面的)生效,有多少条函数用例执行多少次后置
  15. [->]setup_function
  16. 只对函数用例(不在class里面的)生效,有多少条函数用例执行多少次前置
  17. [->]setup 类外前置
  18. 类外的setup,在所有的类外函数执行前执行
  19. 执行类外用例test_add_02
  20. .[->]teardown 类外后置
  21. 类外的teardown,在所有的类外函数执行后执行
  22. [->]teardown_function
  23. 只对函数用例(不在class里面的)生效,有多少条函数用例执行多少次后置
  24. [->]setup_class
  25. 在类中运行的前置,只运行一次
  26. [->]setup_method
  27. 在类中每条case前运行的前置,每条case分别运行一次
  28. [->]setup 类中前置
  29. 类中的setup,在所有的类外函数执行前执行
  30. 执行类中用例test_add_03
  31. .[->]teardown 类中后置
  32. 类中的teardown,在所有的类外函数执行前执行
  33. [->]teardown_method
  34. 在类中每条case后运行的后置,每条case分别运行一次
  35. [->]setup_method
  36. 在类中每条case前运行的前置,每条case分别运行一次
  37. [->]setup 类中前置
  38. 类中的setup,在所有的类外函数执行前执行
  39. 执行类中用例test_add_04
  40. .[->]teardown 类中后置
  41. 类中的teardown,在所有的类外函数执行前执行
  42. [->]teardown_method
  43. 在类中每条case后运行的后置,每条case分别运行一次
  44. [->]teardown_class
  45. 在类中运行的后置,只运行一次
  46. [->]teardown_module
  47. 最后执行的后置,且在整个 *.py 文件执行时只执行一次
  48. ============================== 4 passed in 0.08s ==============================
  49. ***Repl Closed***

执行顺序

通过上述执行发现类中的执行顺序优先级:

setup_class > setup_method > setup

类外的执行顺序:

setup_module > setup_function > setup

对应的teardown反之,遵循先进后出的原则

前置\后置执行结论

前置 后置 作用
setup_module teardown_module 最先执行的前置或者后置,且在整个 *.py 文件执行时只执行一次
setup_function teardown_function 只对函数用例(不在class里面的)生效,有多少条函数用例执行多少次
setup_class teardown_class 在类中运行的前置或者后置,只运行一次
setup_method teardown_method 在类中每条用例前后运行的前置或后置,每条case分别运行一次
setup teardown 既可以在类中运行,也可以在类外运行,每条用例前后分别执行一次