Pytest学习笔记1——传统前后置处理

  引言

  在《Python 自动化测试框架unittest与pytest的区别》这篇文章中,已经介绍了pytest的前后置,现在单独拿出来,再来复习一次。

  文中unittest是有三个处理前后置的函数:

  setUp()&tearDown() < setUpClass()&tearDownClass() < setUpModule()&tearDownModule(),而pytest相对比unittest多了2个,函数级和方法级。

  逻辑优先级:

  • 模块级(setup_module/teardown_module)开始于模块始末,全局的
  • 函数级(setup_function/teardown_function)只对函数用例生效(不在类中)
  • 类级(setup_class/teardown_class)只在类中前后运行一次(在类中)
  • 方法级(setup_method/teardown_method)开始于方法始末(在类中)
  • 类里面的(setup/teardown)运行在调用方法的前后

  实例

import pytest


# setup_function&teardown_function 不在类中使用
def setup_function():
    print("这是函数级setup>>>>>每条用例执行前执行")
def teardown_function():
    print("这是函数级teardown>>>>>每条用例执行后执行")

# setup_module&teardown_module 全局
def setup_module():
    print("这是模块级setup>>>>>所有用例执行前执行")
def teardown_module():
    print("这是模块级teardown>>>>>所有用例执行后执行")

# 测试用例
def test_001():
    print("用例001")
def test_002():
    print("用例002")

# 测试类
class Test_Api:
    def setup(self):
        print("这是方法setup>>>>>每条用例执行前执行")
    def teardown(self):
        print("这是方法teardown>>>>>每条用例执行后执行")

    def setup_class(cls):
        print("这是类方法setup_class>>>>>所有用例执行前执行")
    def teardown_class(self):
        print("这是类方法teardown_class>>>>>所有用例执行后执行")

    def setup_method(self):
        print("这是setup_method方法>>>>>每个用例开始前执行")

    def teardown_method(self):
        print("这是teardown_method方法>>>>>每个用例结束后执行")

    def test_003(self):
        print("用例003")

    def test_004(self):
        print("用例004")

if __name__ == '__main__':
    pytest.main('-s','test2.py')

  

运行结果:

test2.py::test_001 
这是模块级setup>>>>>所有用例执行前执行
这是函数级setup>>>>>每条用例执行前执行
PASSED                                                [ 25%]用例001
这是函数级teardown>>>>>每条用例执行后执行

test2.py::test_002 这是函数级setup>>>>>每条用例执行前执行
PASSED                                                [ 50%]用例002
这是函数级teardown>>>>>每条用例执行后执行

test2.py::Test_Api::test_003 
test2.py::Test_Api::test_004 

============================== 4 passed in 0.05s ==============================

Process finished with exit code 0
这是类方法setup_class>>>>>所有用例执行前执行
这是setup_method方法>>>>>每个用例开始前执行
这是方法setup>>>>>每条用例执行前执行
PASSED                                      [ 75%]用例003
这是方法teardown>>>>>每条用例执行后执行
这是teardown_method方法>>>>>每个用例结束后执行
这是setup_method方法>>>>>每个用例开始前执行
这是方法setup>>>>>每条用例执行前执行
PASSED                                      [100%]用例004
这是方法teardown>>>>>每条用例执行后执行
这是teardown_method方法>>>>>每个用例结束后执行
这是类方法teardown_class>>>>>所有用例执行后执行
这是模块级teardown>>>>>所有用例执行后执行

  

从结果上看,逻辑优先级:

对于类外:模块级是最大的,全局的,针对.py模块的,你可以认为(setup_module/teardown_module)是global,针对整个py文件,你可以将测试数据初始化和清理数据放到这里。

对于类中:setup_class>setup_method>setup

对于整个py文件(模块):首先setup_module/teardown_module永远是最先执行的,然后识别函数和类的位置,按从上到下来执行,也是python程序执行规则。

可以试试,将类和外面的函数换一下位置:

 

执行结果:

 

执行顺序:

 

  总结

  pytest的前后置处理函数实例已经讲完,这是传统的处理方法,如果像一些场景,比如说登录,在测试业务接口的时候,我们有些接口是不需要登录,但是有些是需要登录,前置条件是登录,如果说用这种传统的函数处理,肯定不适应了,于是有大神开发的了一个fixtrue函数,它其实是setup/teardown的升级版,设计思想是由它而来。我会在下篇进行分享,请尽情期待。

 

posted @ 2020-05-13 21:36  全栈测试开发日记  阅读(1193)  评论(0编辑  收藏  举报