来自另一个文件的py.test fixture

时间:2015-01-11 15:09:47

标签: python unit-testing pytest

我有以下要测试的文件

manage.py

import socket
def __get_pod():
    try:
        pod = socket.gethostname().split("-")[-1].split(".")[0]
    except:
        pod = "Unknown"

    return pod

这是我的测试脚本 测试/ test_manage.py

import sys
import pytest

sys.path.append('../')

from manage import __get_pod

#
# create a fixture for a softlayer IP stack
@pytest.fixture
def patch_socket(monkeypatch):

    class my_gethostname:
        @classmethod
        def gethostname(cls):
            return 'web01-east.domain.com'

    monkeypatch.setattr(socket, 'socket', my_gethostname)


def test__get_pod_single_dash():
    assert __get_pod() == 'east'

因此,当我尝试测试它时,我希望它使用夹具来托管我的笔记本电脑主机名..是否可以在另一个文件中使用夹具?

$ py.test -v
======================================================================= test session starts ========================================================================
platform darwin -- Python 2.7.8 -- py-1.4.26 -- pytest-2.6.4 -- /usr/local/opt/python/bin/python2.7
collected 1 items

test_manage.py::test__get_pod_single_dash FAILED

============================================================================= FAILURES =============================================================================
____________________________________________________________________ test__get_pod_single_dash _____________________________________________________________________

    def test__get_pod_single_dash():
>       assert __get_pod() == 'east'
E       assert '2' == 'east'
E         - 2
E         + east

1 个答案:

答案 0 :(得分:4)

您需要做的第一件事是修改您的测试函数,以便它采用名为patch_socket的参数:

def test__get_pod_single_dash(patch_socket):
    assert __get_pod() == 'east'

这意味着py.test将调用您的fixture,并将结果传递给您的函数。这里最重要的是它会被调用。

第二件事是,monkeypatch调用会将名为socket.socket的变量设置为my_gethostname,这不会影响您的功能。将patch_socket简化为:

import socket

@pytest.fixture
def patch_socket(monkeypatch):
    def gethostname():
        return 'web01-east.domain.com'

    monkeypatch.setattr(socket, 'gethostname', gethostname)

然后允许测试通过。