py.test 来自另一个文件的夹具

py.test fixture from another file

我有以下文件要测试

manage.py

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

    return pod

这是我的测试脚本 tests/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

你需要做的第一件事就是修改你的测试函数,让它接受一个名为 patch_socket:

的参数
def test__get_pod_single_dash(patch_socket):
    assert __get_pod() == 'east'

这意味着 py.test 将调用您的夹具,并将结果传递给您的函数。这里重要的是它确实被调用了。

第二件事是您的 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)

然后允许测试通过。