pytest-前置函数和后置函数的使用
使用unittest时,setup和teardown是用来处理用例的开始前工作和结束后的工作,其中还有setupclass和teardownclass(需要配合@classmethod装饰器一起使用)是保证执行所有的用例都只执行1次前置和后置,使用起来非常方便,接下来介绍pytest框架的使用。
pytest的前置和后置
pytest比较强大,提供了不仅仅一种方法的前置和后置:
- setup_class、teardown_class
- setup_method、teardown_method
- setup_module、teardown_module
- setup_function、teardown_function
- setup、teardown
setup_class和teardown_class
该方法表示在类中执行测试用例前,只执行1次测试前置和测试后置
""" 类级的(setup_class、teardown_class)在类中使用类执行之前运行一次,类执行之后运行一次 在类之前和之后执行一次 setup_class teardown_class """ class TestClass: def setup_class(self): print('setup_class(self):每个类之前执行一次') def teardown_class(self): print('teardown_class(self):每个类之后执行一次') def add(self, a, b): print('这是加法运算') return a+b def test_01(self): print("正在执行test1") x = 'this' assert 'h' in x def test_02(self): print("正在执行test2") print('this is test02 result') def test_add(self): print("正在执行用例test_add") assert self.add(3,4) == 7 if __name__ == "__main__": pytest.main(["-s", "start_and_end.py"])
setup_method和teardown_method
该方法表示在类中每次执行测试用例前,测试前置和测试后置都会执行一次
''' 类中方法级的(setup_method、teardown_method)在每一个方法之前执行一次,在每一个方法之后执行一次 开始于方法始末(在类中) setup_method teardown_method ''' class TestMethod(object): def setup_class(self): print("setup_class(self):每个类之前执行一次") def teardown_class(self): print("teardown_class(self):每个类之后执行一次") def setup_method(self): print("setup_method(self):在每个方法之前执行") def teardown_method(self): print("teardown_method(self):在每个方法之后执行") def add(self,a,b): print("这是加法运算") return a+b def test_01(self): print("正在执行test1") x = "this" assert 'h' in x def test_add(self): print("正在执行test_add()") assert self.add(3, 4) == 7 if __name__ == "__main__": pytest.main(["-s", "start_and_end.py"])
setup_module和teardown_module
该方法表示只能类外面执行用例过程中,只执行1次。相当于unittest中的setupclass和teardownclass方法
''' 模块级的(setup_module、teardown_module)全局的,在模块执行前运行一遍,在模块执行后运行一遍 开始于模块始末,全局的 setup_module teardown_module ''' def setup_module(): print("setup_module(self):每个模块之前执行一次") def teardown_module(): print("teardown_module(self):每个模块之后执行一次") def setup_function(): print("setup_function(self):在每个方法之前执行") def teardown_function(): print("teardown_function(self):在每个方法之后执行") def add(a,b): print("这是加法运算") return a+b def test_01(): print("正在执行test1") x = "this" assert 'h' in x def test_add(): print("正在执行test_add()") assert add(3, 4) == 7 if __name__ == "__main__": pytest.main(["-s", "start_and_end.py"])
setup_function和teardown_function
该方法表示在类外面执行用例过程中,每次都会执行前置和后置
''' 函数级的(setup_function、teardown_function)只对函数用例生效,而且不在类中使用 只对函数用例生效,不在类中 setup_function teardown_function ''' def setup_function(): print("setup_function():每个方法之前执行") def teardown_function(): print("teardown_function():每个方法之后执行") def test_01(): print("正在执行test1") x = "this" assert 'h' in x def test_02(): print("正在执行test2") print('this is test02 result') def add(a,b): return a+b def test_add(): print ("正在执行test_add()") assert add(3,4) == 7 if __name__ == "__main__": pytest.main(["-s","start_and_end.py"])
setup和teardown
与unittest中的书写一致,这个可以在类中使用,也可以在类外进行使用
''' 类外使用setup和teardown函数 ''' def setup(): print('我是类外的小小setup函数,你猜我能否被执行。 当前能') def teardown(): print('我是类外的teardown函数,你猜我能否被执行。 当前能') def test_01(): print("正在执行test1") x = "this" assert 'h' in x def add(a,b): return a+b def test_add(): print ("正在执行test_add()") assert add(3,4) == 7 if __name__ == "__main__": pytest.main(['-s', 'start_and_end.py'])
''' 类中使用setup和teardown函数 ''' class TestSet: def setup(self): print('我是类中的小小setup函数,你猜我能否被执行。 当前能') def teardown(self): print('我是类中的teardown函数,你猜我能否被执行。 当前能') def test_01(self): print("正在执行test1") x = "this" assert 'h' in x def add(self, a, b): return a+b def test_add(self): print ("正在执行test_add()") assert self.add(3, 4) == 7 if __name__ == "__main__": pytest.main(['-s', 'start_and_end.py'])
组合混用
setup_module、setup_function、setup_class、setup_method混用
def setup_module():
print("setup_module():在模块最之前执行")
def teardown_module():
print("teardown_module:在模块之后执行")
def setup_function():
print("setup_function():每个方法之前执行")
def teardown_function():
print("teardown_function():每个方法之后执行")
def test_10():
print("正在执行test1")
x = "this"
assert 'h' in x
def add0(a,b):
return a+b
def test_add():
print("正在执行test_add()")
assert add0(3,4) == 7
class TestClass(object):
def setup(self):
print('setup(self):每个用例前执行')
def teardown(self):
print("teardown(self):每个用例后执行")
def setup_class(self):
print("setup_class(self):每个类之前执行一次")
def teardown_class(self):
print("teardown_class(self):每个类之后执行一次")
def setup_method(self):
print("setup_method(self):在每个类中方法之前执行")
def teardown_method(self):
print("teardown_method(self):每个类中方法之后执行")
def add(self,a,b):
print("这是加法运算")
return a+b
def test_01(self):
print("正在执行test1")
x = "this"
assert 'h' in x
def test_add(self):
print("正在执行test_add()")
assert self.add(3, 4) == 7
if __name__=="__main__":
pytest.main(["-s","start_and_end.py"])
由此可见,其中执行顺序是:setup_class > setup_method > setup,其中setup_method和setup都是表示执行每条用例前都需要进行执行前置内容
set_module、set_function、setup混用
def setup(): print('这是setup测试用例前置内容') def teardown(): print('这是teardown测试用例后置内容') def setup_function(): print('这是setup_function测试用例前置内容') def teardown_function(): print('这是teardown_function测试用例后置内容') def setup_module(): print('这是setup_module测试用例前置内容') def teardown_module(): print('这是teardown_module测试用例后置内容') def test_01(): print('开始执行用例01') if __name__ == "__main__": pytest.main(['-s', 'start_and_end.py'])
由此可见,其中的执行顺序是:setup_module > setup_function > setup ,其中,setup_module表示执行用例只执行一次前置
总结
1、setup_class和setup_module执行用例时,只执行一次前置和后置
2、setup_class、setup_method、setup是在类中执行的
3、setup_module、setup_function、setup是在类外执行的
4、其中setup类中、类外都可以执行