zoukankan      html  css  js  c++  java
  • python之钩子函数及起始函数作用范围【后置固件yield和终结函数addfinalizer区别】

    # 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 ('h' in x)
    
    
    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 'h' in x
    
    
    @pytest.fixture(autouse=True)
    def show_request(request):
        print("\n=======================request start=================================")
        print("request.module==", request.module)
        print("request.function==", request.function)
        print("request.cls==", request.cls)
        print("request.fspath==", request.fspath)
        print("request.fixturenames==",request.fixturenames )
        print("request.fixturename==", request.fixturename)
        print("request.scope==", request.scope)
        print("\n=======================request end=================================")
    
    
    if __name__ == "__main__":
        pytest.main(["-s", "12.py"])
    

      

    二、【后置固件yield和终结函数addfinalizer区别】

    # 文件名是test_firstFile.py
    # coding=utf-8
    import pytest
    
    
    @pytest.fixture()
    def myfixture():
        print("执行myfixture前半部分")
        yield
        print("执行myfixture的后半部分")
    
    
    class Test_firstFile():
    
        def test_one(self, myfixture):
            print("执行test_one")
            assert 1 + 2 == 3
    
        def test_two(self):
            print("执行test_two")
            assert 1 == 1
    
        def test_three(self):
            print("执行test_three")
            assert 1 + 1 == 2
    
    
    if __name__ == "__main__":
        pytest.main(["-s", "12.py"])
    

     结果:测试代码的执行顺序是 固件中yield前的代码–测试用例中的代码–固件中yield后的;如果测试用例中的代码出现异常或者断言失败,并不会影响他的固件中yield后的代码执行;但是如果固件中的yield之前的代码也就是相当于setup部分的带代码,出现错误或断言失败,那么yield后的代码将不会再执行,当然测试用例中的代码也不会执行。 

    # test_Pytest.py文件
    # coding=utf-8
    
    import pytest
    
    
    @pytest.fixture()
    def myfixture(request):
        print("执行固件myfixture的前半部分")
    
        def myteardown():
            print("执行固件myfture的后半部分")
    
        request.addfinalizer(myteardown)
    
    
    class Test_Pytest():
    
        def test_one(self, myfixture):
            print("test_one方法执行")
            assert 1 == 1
    
        def test_two(self):
            print("test_two方法执行")
            assert "o" in "love"
    
        def test_three(self):
            print("test_three方法执行")
            assert 3 - 2 == 1
    
    
    if __name__ == "__main__":
        pytest.main(["-s", "12.py"])
    

      结果:

    12.py 执行固件myfixture的前半部分
    test_one方法执行
    .执行固件myfture的后半部分
    test_two方法执行
    .test_three方法执行
    

      注意:注释掉request.addfinalizer(myteardown)后myteardown()函数便不会执行;

    
    
  • 相关阅读:
    Scrapy选择器和持久化
    SQLAlchemy
    Python数据库连接池DBUtils
    flask应用上下文和g
    flask请求上下文源码解析
    flask的session源码流程和第三方组件
    430软狗不喂狗后系统起不来的问题
    VS2008 快捷键大全
    未能加载或程序集“XXXX,Version=0.0.0.0,Culter=neutral,PublicKeyToken=null”或它的某一个依赖项。试图加载格式不正确的程序。
    用vs2008打开vs2005项目
  • 原文地址:https://www.cnblogs.com/mumianhuasayyes/p/15849259.html
Copyright © 2011-2022 走看看