• unittest的前置后置,pytest的fixture和共享机制conftest.py


    Unittest

    setUp/tearDown

        setUp当中得到的变量,用self.xxx = value传递给测试用例

    setUpClass/tearDownClass

     setupClass当中得到的变量,用cls.xxx = value传递给测试用例

    pytest

    pytest有两种前置后置,一种是沿用unittest风格setup/teardown, setup_class/teardown_class

    另一种测试fixture

    定义fixture

        @pytest.fixture    #定义fixture必须用这个装饰器

        def fix():
            print(“前置代码”)

            yield                # yield为前置后置的分割线

            print(“后置代码”)

    fixture有4个作用域。

      测试函数(function)、测试类(class)、测试模块文件(module)、测试会话(session)

        @pytest.fixture(scope="function"(默认值)/"class"/"module"/"session")

        def xxxx():

            pass

    设置fixture的返回值

    @pytest.fixture
    def init():
    print("测试函数的前置")
    yield "test","abc" #fixture的返回值放在yield旁
    print("测试函数的后置")

    调用fixture返回值

    @pytest.mark.usefixtures("init")  #调用函数名为init的fixture
    def test_bbb(init): #把函数名为init的fixture的返回值作为参数传入这个测试函数里
    print(init)

     如果fixture有返回值,那么,将它作为测试函数的参数时,可以不用装饰器,如下图

    fixture的共享机制conftest.py

    1.放的都是fixture
    2.文件名不能更改。不同包下,可以创建多个
    3.对外共享
    4.共享范围:
    同级共享
    向下共享
    5.优先级:就近原则。如调用fixture后如何知道定义在哪个文件,查找路线:自己模块 > 同级 > 往上
    都找不到,报错

    共享是定义好fixture后,被测试函数调用
    就近原则,是测试用例调用的fixture,向上查找放在哪个conftest文件里

    6.嵌套 
      如下代码,init2里嵌套这init的代码
    @pytest.fixture
    def init():
    print("* init before *")
    yield "i am init"
    print("* init after *")

    @pytest.fixture
    def init2(init): # 继承init的前置后置,再它的基础上增加一些内容
    print("* init2 before *")
    yield init # 继承init的返回值
    print("* init2 after *")

       测试函数调用init2

    @pytest.mark.usefixtures("init2")
    def test_data1():
    assert True

    运行结果:先运行init前置,再运行init2的前置,接着运行init2的后置,最后运行init的后置
    什么时候嵌套? 一个fixture想完全使用另一个fixture,并在人家的基础上新增一些代码

    当测试过程需要连接DB时,可以在conftest.py定义好如下代码,在需要用的测试函数调用这个fixture就好。

    这个fixture定义scope为session,是一旦运行main模块,就立即启动db,运行完后则关闭db,autouse是自动使用这个fixture的开关,module、class、function的不建议开启autouse

    @pytest.fixture(scope="session",autouse=True)
    def db_fixture():
    db = HandleDB() # 实例化DB
    yield db
    db.close() # 关闭连接
    
    
    
  • 相关阅读:
    Model I/O
    How to create realistic .scn files?
    3ds Max 教程
    ELK Stack企业日志平台文档
    源码搭建Zabbix4.0.23LTS监控系统
    Ansible自动化运维应用实战
    网站架构部署
    MySQL数据库性能优化与监控实战(阶段四)
    MySQL数据库企业集群项目实战(阶段三)
    基于xtrabackup的主从同步
  • 原文地址:https://www.cnblogs.com/sue2015/p/14755345.html
Copyright © 2020-2023  润新知