将动态对象从设置传递到py.test中的测试函数

在大型项目中,有时会发生这种情况,即在项目上已经进行了很多测试,并且与此同时,正在开发自己的高级框架。在这种情况下,该框架是对测试对象的功能以及项目中使用的各种工具的功能的包装。此外,所有文件夹中都装有夹具,其中许多夹具仅在一个测试文件中使用。



在这个美好的时刻,出现了一些问题。我已经写了其中的一篇,这是方便的参数化实现,例如从file我们将在本文中讨论下一个最不幸的问题。



“队长,我们有很多固定装置,全局球出现了。”



使用夹具重载测试目录是使用py.test中包含的概念的相当合乎逻辑的结果,但是有时这种方法超出了可接受的范围。此外,我们经常可以观察到测试中的结构,这些结构旨在确定在特定的特定情况下测试需要获取哪些信息,或者希望初步检查在准备环境阶段进一步通过测试的可能性。



在这些构造从某个setup固定装置传递并经过整个测试的情况下,最大的误解是使用global变量。我也遇到过类似的困难案例,这个想法是第一个想到的。



在这一点上值得一提的是,固定装置的概念避免了这种代码清洁性的污点,但还提供了更多的抽象级别和大量参考。作为最后的选择,您会养成拆开夹具结果的可怕习惯,但是在这种情况下,我们破坏了原木,因为 我们没有对Setup(设置),Run(运行)和Teardown(拆卸)的划分,并且在解压缩结果或产生多个快捷方式时还使代码复杂化。



让我们看一些例子,从最坏的例子开始:



“夹具与全球”



import pytest

@pytest.fixture(autouse=True)
def setup(create_human, goto_room, goto_default_position, choose_window, get_current_view):
    global human
    global window

    #   
    desired_room = 1 #    ,    
    human = create_human("John", "Doe") #          
  
    #  -    ,     
    assert goto_room(human, desired_room), "{}     {}".format(human.full_name, desired_room)
    
    #   
    window = choose_window(desired_room)
    view = get_current_view(window)
    assert view, "  {}  ".format (window)
    
    yield
    #  Teardown    
    goto_default_position(human)

@pytest.mark.parametrize(
    "city, expected_result",
    [
        ("New York", False), 
        ("Berlin", False),
        ("Unknown", True)
    ]
)
def test_city_in_window(city, expected_result):
    """       ."""
    window_view = human.look_into(window)
    recognized_city = human.recognize_city(window_view)
    assert (recognized_city == city) == expected_result, "    "


结果是:



  • 有初步检查
  • 命运多ill global


" "



import pytest

@pytest.fixture
def setup(create_human, goto_room, goto_default_position, choose_window, get_current_view):
    #   
    desired_room = 1 #    ,    
    human = create_human("John", "Doe") #          
  
    #  -    ,     
    assert goto_room(human, desired_room), "{}     {}".format(human.full_name, desired_room)
    
    #   
    window = choose_window(desired_room)
    view = get_current_view(window)
    assert view, "  {}  ".format (window)
    
    yield { "human": human, "window": window}

    #  Teardown    
    goto_default_position(human)

@pytest.mark.parametrize(
    "city, expected_result",
    [
        ("New York", False), 
        ("Berlin", False),
        ("Unknown", True)
    ]
)
def test_city_in_window(setup, city, expected_result):
    """       ."""
    data = setup

    window_view = data["human"].look_into(data["window"])
    recognized_city = data["human"].recognize_city(window_view)
    assert (recognized_city == city) == expected_result, "    "


:



  • setup
  • , ,


, 400+ , .





, 8 setup : , ?



. py.test, .



:



import pytest

class TestWindowView:
    @pytest.fixture
    def setup(self, create_human, goto_room, goto_default_position, choose_window, get_current_view):
        #   
        desired_room = 1 #    ,    
        self.human = create_human("John", "Doe") #          
  
        #  -    ,     
        assert goto_room(self.human, desired_room), "{}     {}".format(human.full_name, desired_room)
    
        #   
        self.window = choose_window(desired_room)
        view = get_current_view(self.window)
        assert view, "  {}  ".format (self.window)
    
        yield

        #  Teardown    
        goto_default_position(self.human)

    @pytest.mark.parametrize(
        "city, expected_result",
        [
            ("New York", False), 
            ("Berlin", False),
            ("Unknown", True)
        ]
    )
    def test_city_in_window(self, setup, city, expected_result):
        """       ."""
        window_view = self.human.look_into(self.window)
        recognized_city = self.human.recognize_city(window_view)
        assert (recognized_city == city) == expected_result, "    "


:



  • global




, .



, . , .



Android/iOS Appium IOT/Embedded .




All Articles