zoukankan      html  css  js  c++  java
  • pytest_04_测试用例setup和teardown

    学过unittest的都知道里面用前置和后置setup和teardown非常好用,在每次用例开始前和结束后都去执行一次。
    当然还有更高级一点的setupClass和teardownClass,需配合@classmethod装饰器一起使用,在做selenium自动化的时候,它的效率尤为突然,可以只启动一次浏览器执行多个用例。
    pytest框架也有类似于setup和teardown的语法,并且还不止这四个

    用例运行级别

    • 模块级(setup_module/teardown_module)开始于模块始末,全局的

    • 函数级(setup_function/teardown_function)只对函数用例生效(不在类中)

    • 类级(setup_class/teardown_class)只在类中前后运行一次(在类中)

    • 方法级(setup_method/teardown_method)开始于方法始末(在类中)

    • 类里面的(setup/teardown)运行在调用方法的前后

    函数式

    setup_function/teardown_function

    1.pytest框架支持函数和类两种用例方式,先看函数里面的前置与后置用法:

    setup_function/teardown_function 每个用例开始和结束调用一次

    import pytest
    # 函数式
    def setup_function():   # 相当于unittest里的 setUp()
        print("setup_function: 每个用例开始前都会执行")
    
    def teardown_function():      # 相当于unittest里的 teardown()
        print("teardown_function: 每个用例结束前都会执行")
    
    def test_one():
        print("正在执行---test_one")
    
    def test_two():
        print("正在执行---test_two")
    
    def test_there():
        print("正在执行---test_there")
    
    if __name__ == '__main__':
        pytest.main(["-s", "pytest_01.py"])

    运行结果:

    D:Users18630AppDataLocalProgramsPythonPython36python3.exe E:/Programs/ke4/pytest/learn_01.py
    ============================= test session starts =============================
    platform win32 -- Python 3.6.4, pytest-3.8.0, py-1.6.0, pluggy-0.7.1
    rootdir: E:Programske4pytest, inifile:
    collected 3 items
    
    learn_01.py setup_function: 每个用例开始前都会执行
    正在执行---test_one
    .teardown_function: 每个用例结束前都会执行
    setup_function: 每个用例开始前都会执行
    正在执行---test_two
    .teardown_function: 每个用例结束前都会执行
    setup_function: 每个用例开始前都会执行
    正在执行---test_there
    .teardown_function: 每个用例结束前都会执行
    ========================== 3 passed in 0.08 seconds =========================== Process finished with exit code 0

    2.从结果可以看出用例执行顺序:setup_function》用例1》teardown_function, setup_function》用例2》teardown_function, setup_function》用例3》teardown_function

    备注:-s参数是为了显示用例的打印信息。 -q参数只显示结果,不显示过程

    setup_function/teardown_function

    1.setup_module是所有用例开始前只执行一次,teardown_module是所有用例结束后只执行一次

    import pytest
    # 函数式
    
    def setup_module():  # 相当于unittest里的 setUpClass()
        print("setup_module: 整个.py模块只运行一次")
        print("比如:所有用例开始前只打开一次浏览器")
    
    def teardown_module():   # 相当于unittest里的 tearDownClass()
        print("teardown_module: 整个.py模块只运行一次")
        print("比如:所有用例结束只最后关闭浏览器")
    
    def setup_function():   # 相当于unittest里的 setUp()
        print("setup_function: 每个用例开始前都会执行")
    
    def teardown_function():      # 相当于unittest里的 teardown()
        print("teardown_function: 每个用例结束前都会执行")
    
    def test_one():
        print("正在执行---test_one")
    
    def test_two():
        print("正在执行---test_two")
    
    def test_there():
        print("正在执行---test_there")
    
    if __name__ == '__main__':
        pytest.main(["-s", "learn_01.py"])

    2.从运行结果可以看到setup_module和teardown_module只执行了一次

    D:Users18630AppDataLocalProgramsPythonPython36python3.exe E:/Programs/ke4/pytest/learn_01.py
    ============================= test session starts =============================
    platform win32 -- Python 3.6.4, pytest-3.8.0, py-1.6.0, pluggy-0.7.1
    rootdir: E:Programske4pytest, inifile:
    collected 3 items
    
    learn_01.py setup_module: 整个.py模块只运行一次
    比如:所有用例开始前只打开一次浏览器
    setup_function: 每个用例开始前都会执行
    正在执行---test_one
    .teardown_function: 每个用例结束前都会执行
    setup_function: 每个用例开始前都会执行
    正在执行---test_two
    .teardown_function: 每个用例结束前都会执行
    setup_function: 每个用例开始前都会执行
    正在执行---test_there
    .teardown_function: 每个用例结束前都会执行
    teardown_module: 整个.py模块只运行一次
    比如:所有用例结束只最后关闭浏览器
    
    
    ========================== 3 passed in 0.08 seconds ===========================
    
    Process finished with exit code 0

    备注:setup_function/teardown_function和setup_module/teardown_module这四种方法是可以任意组合的,用一个和多个都可以

    类和方法

    1.setup/teardown和unittest里面的setup/teardown是一样的功能,setup_class和teardown_class等价于unittest里面的setupClass和teardownClass

    import pytest
    # 函数式
    
    '''
    运行优先级:
    setup_class -> setup_method -> setup -> 用例 -> teardown -> teardown_method -> teardown_class
    '''
    
    class TestCase():
    
        def setup(self):
            print("setup: 每个用例开始前执行")
    
        def teardown(self):
            print("teardown: 每个用例结束前执行")
    
        def setup_class(self):
            print("setup_class: 所有用例开始前执行")
    
        def teardown_class(self):
            print("teardown_class: 所有用例结束前执行")
    
        def setup_method(self):  # 相当于unittest里的 setUpClass()
            print("setup_method: 每个用例开始前都会执行")
    
        def teardown_method(self):   # 相当于unittest里的 tearDownClass()
            print("teardown_method: 每个用例结束前都会执行")
    
        def test_one(self):
            print("正在执行---test_one")
    
        def test_two(self):
            print("正在执行---test_two")
    
        def test_there(self):
            print("正在执行---test_there")
    
    if __name__ == '__main__':
        pytest.main(["-s", "pytest_02.py"])

    运行结果

    D:Users18630AppDataLocalProgramsPythonPython36python3.exe E:/Programs/ke4/pytest/learn_02.py
    ============================= test session starts =============================
    platform win32 -- Python 3.6.4, pytest-3.8.0, py-1.6.0, pluggy-0.7.1
    rootdir: E:Programske4pytest, inifile:
    collected 3 items
    
    learn_02.py setup_class: 所有用例开始前执行
    setup_method: 每个用例开始前都会执行
    setup: 每个用例开始前执行
    正在执行---test_one
    .teardown: 每个用例结束前执行
    teardown_method: 每个用例结束前都会执行
    setup_method: 每个用例开始前都会执行
    setup: 每个用例开始前执行
    正在执行---test_two
    .teardown: 每个用例结束前执行
    teardown_method: 每个用例结束前都会执行
    setup_method: 每个用例开始前都会执行
    setup: 每个用例开始前执行
    正在执行---test_there
    .teardown: 每个用例结束前执行
    teardown_method: 每个用例结束前都会执行
    teardown_class: 所有用例结束前执行
    
    
    ========================== 3 passed in 0.09 seconds ===========================
    
    Process finished with exit code 0

    2.从结果看出,运行的优先级:setup_class》setup_method》setup 》用例》teardown》teardown_method》teardown_class
    备注:这里setup_method和teardown_method的功能和setup/teardown功能是一样的,一般二者用其中一个即可

    函数和类混合

    1.如果一个.py的文件里面既有函数用例又有类和方法用例,运行顺序又是怎样的呢?

    # coding:utf-8
    import pytest
    # 类和方法
    
    def setup_module():
        print("setup_module:整个.py模块只执行一次")
        print("比如:所有用例开始前只打开一次浏览器")
    
    def teardown_module():
        print("teardown_module:整个.py模块只执行一次")
        print("比如:所有用例结束只最后关闭浏览器")
    
    def setup_function():
        print("setup_function:每个用例开始前都会执行")
    
    def teardown_function():
        print("teardown_function:每个用例结束前都会执行")
    
    def test_one():
        print("正在执行----test_one")
        x = "this"
        assert 'h' in x
    
    def test_two():
        print("正在执行----test_two")
        x = "hello"
        assert hasattr(x, 'check')
    
    class TestCase():
    
        def setup_class(self):
            print("setup_class:所有用例执行之前")
    
        def teardown_class(self):
            print("teardown_class:所有用例执行之前")
    
        def test_three(self):
            print("正在执行----test_three")
            x = "this"
            assert 'h' in x
    
        def test_four(self):
            print("正在执行----test_four")
            x = "hello"
            assert hasattr(x, 'check')
    
    if __name__ == "__main__":
        pytest.main(["-s", "learn_03.py"])

    运行结果:

    D:Users18630AppDataLocalProgramsPythonPython36python3.exe E:/Programs/ke4/pytest/learn_03.py
    ============================= test session starts =============================
    platform win32 -- Python 3.6.4, pytest-3.8.0, py-1.6.0, pluggy-0.7.1
    rootdir: E:Programske4pytest, inifile:
    collected 4 items
    
    learn_03.py setup_module:整个.py模块只执行一次
    比如:所有用例开始前只打开一次浏览器
    setup_function:每个用例开始前都会执行
    正在执行----test_one
    .teardown_function:每个用例结束前都会执行
    setup_function:每个用例开始前都会执行
    正在执行----test_two
    Fteardown_function:每个用例结束前都会执行
    setup_class:所有用例执行之前
    正在执行----test_three
    .正在执行----test_four
    Fteardown_class:所有用例执行之前
    teardown_module:整个.py模块只执行一次
    比如:所有用例结束只最后关闭浏览器
    
    
    ================================== FAILURES ===================================
    __________________________________ test_two ___________________________________
    
        def test_two():
            print("正在执行----test_two")
            x = "hello"
    >       assert hasattr(x, 'check')
    E       AssertionError: assert False
    E        +  where False = hasattr('hello', 'check')
    
    learn_03.py:27: AssertionError
    _____________________________ TestCase.test_four ______________________________
    
    self = <learn_03.TestCase object at 0x0000020E1FC6C748>
    
        def test_four(self):
            print("正在执行----test_four")
            x = "hello"
    >       assert hasattr(x, 'check')
    E       AssertionError: assert False
    E        +  where False = hasattr('hello', 'check')
    
    learn_03.py:45: AssertionError
    ===================== 2 failed, 2 passed in 1.98 seconds ======================
    
    Process finished with exit code 0
     

    2.从运行结果看出,setup_module/teardown_module的优先级是最大的,然后函数里面用到的setup_function/teardown_function与类里面的setup_class/teardown_class互不干涉

    作者:含笑半步颠√

    博客链接:https://www.cnblogs.com/lixy-88428977

    声明:本文为博主学习感悟总结,水平有限,如果不当,欢迎指正。如果您认为还不错,欢迎转载。转载与引用请注明作者及出处。

  • 相关阅读:
    085 Maximal Rectangle 最大矩形
    084 Largest Rectangle in Histogram 柱状图中最大的矩形
    083 Remove Duplicates from Sorted List 有序链表中删除重复的结点
    082 Remove Duplicates from Sorted List II 有序的链表删除重复的结点 II
    081 Search in Rotated Sorted Array II 搜索旋转排序数组 ||
    080 Remove Duplicates from Sorted Array II 从排序阵列中删除重复 II
    079 Word Search 单词搜索
    078 Subsets 子集
    bzoj2326: [HNOI2011]数学作业
    bzoj2152: 聪聪可可
  • 原文地址:https://www.cnblogs.com/lixy-88428977/p/9613777.html
Copyright © 2011-2022 走看看