zoukankan      html  css  js  c++  java
  • pytest进阶之xunit fixture

    前言

    今天我们再说一下pytest框架和unittest框架相同的fixture的使用, 了解unittest的同学应该知道我们在初始化环境和销毁工作时,unittest使用的是setUp,tearDown方法,那么在pytest框架中同样存在类似的方法,今天我们就来具体说明。

    先附上官方文档的一段说明

    1.每个级别的setup/teardown都可以多次复用

    2.如果相应的初始化函数执行失败或者被跳过则不会执行teardown方法

    3.在pytest4.2之前,xunit fixture 不遵循fixture的作用规则的,因此可以在一个session级别且参数auto=True的fixture前执行setup_method方法

    但是到目前为止,所有的xunit fixture已经遵循了fixture执行的规则

    function级别

    实例

     1 def setup_function(function):
     2     print('
    --------------------')
     3     print('函数执行前所做的操作')
     4     print('
    --------------------')
     5 
     6 def teardown_function(function):
     7     print('
    --------------------')
     8     print('函数执行后所做的操作')
     9     print('
    --------------------')
    10 
    11 def test_function_1():
    12     print('
    测试函数1')
    13 
    14 def test_function_2():
    15     print('
    测试函数2')
    16 
    17 if __name__ == '__main__':
    18     import pytest
    19     pytest.main(['-sq', 'functionLevel.py'])

    输出结果

    functionLevel.py 
    --------------------
    函数执行前所做的操作
    --------------------
    测试函数1
    --------------------
    函数执行后所做的操作
    --------------------
    --------------------
    函数执行前所做的操作
    --------------------
    测试函数2
    --------------------
    函数执行后所做的操作
    --------------------
                                                          [100%]
    
    ========================== 2 passed in 0.03 seconds ===========================

    说明

    通过输出结果我们可以总结:setup_function会在每一个测试函数前执行初始化操作;teardown_function会在每一个测试函数执行后执行销毁工作

    method级别

    实例

     1 class TestMethod(object):
     2 
     3     def setup_method(self, method):
     4         print('
    --------------------')
     5         print('方法执行前所做的操作')
     6         print('
    --------------------')
     7 
     8     def teardown_method(self, method):
     9         print('
    --------------------')
    10         print('方法执行后所做的操作')
    11         print('
    --------------------')
    12 
    13     def test_method_1(self):
    14         print('
    测试方法1')
    15 
    16     def test_method_2(self):
    17         print('
    测试方法2')
    18 if __name__ == '__main__':
    19     import pytest
    20     pytest.main(['-sq', 'methodLevel.py'])

    输出结果

    methodLevel.py 
    --------------------
    方法执行前所做的操作
    --------------------
    测试方法1
    --------------------
    方法执行后所做的操作
    --------------------
    --------------------
    方法执行前所做的操作
    --------------------
    测试方法2
    --------------------
    方法执行后所做的操作
    --------------------
                                                            [100%]
    ========================== 2 passed in 0.03 seconds ===========================

    说明

    通过输出结果我们可以总结:setup_method会在每一个测试方法前执行初始化操作;teardown_method会在每一个测试方法执行后执行销毁工作,且方法级别的fixture是作用在测试类中的方法上的

    class级别

    实例

     1 class TestClass(object):
     2 
     3     @classmethod
     4     def setup_class(cls):
     5         print('
    setup_class() for {}'.format(cls.__name__))
     6 
     7     @classmethod
     8     def teardown_class(cls):
     9         print('
    teardown_class() for {}'.format(cls.__name__))
    10 
    11     def test_1(self):
    12         print('self.test_1()')
    13 
    14     def test_2(self):
    15         print('self.test_2()')
    16 
    17 if __name__ == '__main__':
    18     import pytest
    19     pytest.main(['-sq', 'classLevel.py'])

    输出结果

    classLevel.py 
    setup_class() for TestClass
    .self.test_1()
    .self.test_2()
    teardown_class() for TestClass
                                                             [100%]
    
    ========================== 2 passed in 0.06 seconds ===========================

    说明

    通过输出结果我们可以总结:setup_class会在测试类执行前执行一次初始化操作;teardown_class会在测试类执行后执行一次销毁工作,且class级别的fixture需要使用@classmethod装饰

    module级别

    实例

     1 def setup_module(module):
     2     print('
    setup_module() for {}'.format(module.__name__))
     3 
     4 def teardown_module(module):
     5     print('
    teardown_module() for {}'.format(module.__name__))
     6 
     7 def test_1():
     8     print('test_1()')
     9 
    10 def test_2():
    11     print('test_2()')
    12 
    13 class TestClass(object):
    14 
    15     def test_3(self):
    16         print('self.test_3()')
    17 
    18     def test_4(self):
    19         print('self.test_4()')
    20 
    21 if __name__ == '__main__':
    22     import pytest
    23     pytest.main(['-sq', 'moduleLevel.py'])

    输出结果

    moduleLevel.py 
    setup_module() for moduleLevel
    .test_1()
    .test_2()
    .self.test_3()
    .self.test_4()
    teardown_module() for moduleLevel
                                                          [100%]
    
    ========================== 4 passed in 0.04 seconds ===========================

    说明

    总结

    setup_module会在整个测试文件也就是模块中的测试类或者测试函数,测试方法执行前执行一次初始化操作;teardown_module会在整个测试文件也就是模块中的测试类或者测试函数,方法执行后执行一次销毁工作

    以上就是xunit fixture的4个级别,实际工作中该如何使用还需多练习,深入理解才能得心应手!

    附上官方文档做参考虽是英文但是很详细 https://buildmedia.readthedocs.org/media/pdf/pytest/latest/pytest.pdf 

    最后呢,我计划后期结尾时会出个pytest框架编写的实战项目,关注我不迷路,敬请期待!

  • 相关阅读:
    idea 管理java 多module的工程
    协程与函数线程异步的关系
    HDU 5640 King's Cake【模拟】
    逻辑运算
    Silverlight 学习笔记——布局 Evil 域 博客园
    ExtJS 日期格式问题
    偏方收藏(此信息为本人收藏,安全性无法验证,使用后产生的一些后果自负)
    form和column:extJS的布局
    Sqlserver 通用存储过程分页
    Ext中TreePanel控件和TabPanel控件搭配测试
  • 原文地址:https://www.cnblogs.com/linuxchao/p/linuxchao-pytest-xunit-fixture.html
Copyright © 2011-2022 走看看