pytest之setup teardown前后置方法和 fixture部分前后置方法

Pytest框架实现的一些前后置(也叫做 固件,或者 夹具)的处理,常用的有三种。

一,setup / teardown,    setup_class / teardown_class

为什么需要这些功能呢?

比如:web自动化执行用例之前,统一打开浏览器。在自动化用例执行后,统一关闭浏览器。

 

setup方法,teardown方法:是在每个测试用例前 和 每个用例后 都会被自动执行的方法。

setup_class方法,teardown_class方法:是在某个模块py文件中所有用例 执行前 / 执行后都会被执行的方法。

注意:和unitest不一样,全是小写

 

ps:上面4个方法执行的优先级是:

所有用例执行前 先执行setup_class-> 每条用例执行前 先执行setup ->。。。(执行每条testcase)。。。-> 每条用例执行后 执行teardown-> 所有用例执行后 执行teardown_class

 具体的我参考了一篇文章,写得很好:  https://blog.csdn.net/Faith_Lzt/article/details/125750455

 借鉴了这篇文档,写的很详细: https://blog.csdn.net/Faith_Lzt/article/details/125750455

 

二.使用@pytest.fixture()装饰器 来实现部分用例得前后置


装饰器 @pytest.fixture(scope="",params="",autouse="",ids="",name="")

解释下每个参数得意思:

  • scope: 表示的是被@pytest.fixture()标记得方法的作用域,作用域的value有4种,分别是作用域:function函数(默认),class ,module ,package/session
  • params:参数化,支持列表[],元组(),字典列表[{},{}],字典元组({},{})
  • autouse=True: 自动执行,默认False。为True表示给全部的用例 自动设置 前后置
  • ids:当使用params参数时,给每个值设置一个变量名。此参数的 意义不大
  • name:表示的是 给被@pytest.fixture标记的方法 取的一个别名  (当取了别名后,那么原来的名字就用户了啦)

ps:

params: 这里装饰器中的params是参数,有s

request.param :这里是属性名,是没有s的。

 

添加参数params的案例:

params有多少个,引用fixture前后置的 这个方法 就会被执行几次:

import pytest

@pytest.fixture(scope="module",params=["张三","李四"])
def my_fixture(request):
    print("这里是前置的方法,可以实现部分以及全部用例的前置")
    # yield  #yield关键字用来区分前置 和 后置
    # print("这里是后置的方法,可以实现部分以及全部用例的后置")
    return request.param


class TestDemo2:
    def testee01(self):
        print("this is test_01--")

    def test_ee02(self,my_fixture):
        print("test02--")
        print("--"+str(my_fixture))

    def testee03(self):
        print("test03--")

    def test_ee04(self):
        print("test04--")


class TestDemo3:
    def testee_05(self):
        print("this is testee_01--")

if __name__ == "__main__":
    pytest.main(['-vs', '.\\Demo2_test.py::TestDemo2'])

例如:使用yield去做返回:

import pytest

@pytest.fixture(scope="module",params=["张三","李四"])
def my_fixture(request):
    print("这里是前置的方法,可以实现部分以及全部用例的前置")
    yield  request.param #yield关键字用来区分前置 和 后置
    print("这里是后置的方法,可以实现部分以及全部用例的后置")



class TestDemo2:
    def testee01(self):
        print("this is test_01--")

    def test_ee02(self,my_fixture):
        print("test02--")
        print("--"+str(my_fixture))

    def testee03(self):
        print("test03--")

    def test_ee04(self):
        print("test04--")


class TestDemo3:
    def testee_05(self):
        print("this is testee_01--")

if __name__ == "__main__":
    pytest.main(['-vs', '.\\Demo2_test.py::TestDemo2'])

 

 

例如:实现部分用例的前后置:

import pytest

@pytest.fixture(scope="function")
def my_fixture():
    print("这里是前置的方法,可以实现部分以及全部用例的前置")
    yield  #yield关键字用来区分前置 和 后置
    print("这里是后置的方法,可以实现部分以及全部用例的后置")

class TestDemo2:
    def testee01(self):
        print("this is test_01--")

    def test_ee02(self,my_fixture):
        print("test02--")

    def testee03(self,my_fixture):
        print("test03--")

    def test_ee04(self):
        print("test04--")

if __name__ == "__main__":
    pytest.main(['-vs', '.\\Demo2_test.py::TestDemo2'])

 

例如:使用ids的案例:

import pytest

@pytest.fixture(scope="module",params=["张三","李四"],ids=["zhagnsan","lisi"])
def my_fixture(request):
    print("这里是前置的方法,可以实现部分以及全部用例的前置")
    yield  request.param #yield关键字用来区分前置 和 后置
    print("这里是后置的方法,可以实现部分以及全部用例的后置")



class TestDemo2:
    def testee01(self):
        print("this is test_01--")

    def test_ee02(self,my_fixture):
        print("test02--")
        print("--"+str(my_fixture))

    def testee03(self):
        print("test03--")

    def test_ee04(self):
        print("test04--")


class TestDemo3:
    def testee_05(self):
        print("this is testee_01--")

if __name__ == "__main__":
    pytest.main(['-vs', '.\\Demo2_test.py::TestDemo2'])

 

例如:实现所有用例的前后置:增加参数autouse=True

import pytest

@pytest.fixture(scope="function",autouse=True)
def my_fixture():
    print("这里是前置的方法,可以实现部分以及全部用例的前置")
    yield  #yield关键字用来区分前置 和 后置
    print("这里是后置的方法,可以实现部分以及全部用例的后置")

class TestDemo2:
    def testee01(self):
        print("this is test_01--")

    def test_ee02(self):
        print("test02--")

    def testee03(self):
        print("test03--")

    def test_ee04(self):
        print("test04--")

if __name__ == "__main__":
    pytest.main(['-vs', '.\\Demo2_test.py::TestDemo2'])

例如:一个模块中有多个类,可以采用模块的作用域:

import pytest

@pytest.fixture(scope="module",autouse=True)
def my_fixture():
    print("这里是前置的方法,可以实现部分以及全部用例的前置")
    yield  #yield关键字用来区分前置 和 后置
    print("这里是后置的方法,可以实现部分以及全部用例的后置")

class TestDemo2:
    def testee01(self):
        print("this is test_01--")

    def test_ee02(self,my_fixture):
        print("test02--")

    def testee03(self):
        print("test03--")

    def test_ee04(self):
        print("test04--")


class TestDemo3:
    def testee_05(self):
        print("this is testee_01--")

if __name__ == "__main__":
    pytest.main(['-vs', '.\\Demo2_test.py'])

案例: 使用了别名后,原来的参数就用不了啦

import pytest

@pytest.fixture(scope="module",params=["张三","李四"],ids=["zhagnsan","lisi"],name="myfix")
def my_fixture(request):
    print("这里是前置的方法,可以实现部分以及全部用例的前置")
    yield  request.param #yield关键字用来区分前置 和 后置
    print("这里是后置的方法,可以实现部分以及全部用例的后置")



class TestDemo2:
    def testee01(self):
        print("this is test_01--")

    def test_ee02(self,myfix):
        print("test02--")
        print("--"+str(myfix))

    def testee03(self):
        print("test03--")

    def test_ee04(self):
        print("test04--")


class TestDemo3:
    def testee_05(self):
        print("this is testee_01--")

if __name__ == "__main__":
    pytest.main(['-vs', '.\\Demo2_test.py::TestDemo2'])

 

posted @ 2023-03-17 15:14  苹果芒  阅读(122)  评论(0编辑  收藏  举报