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类中、类外都可以执行

posted @ 2022-01-10 15:32  *无边落木萧萧下*  阅读(607)  评论(0编辑  收藏  举报