py.test来自另一个文件的装置

Mik*_*ike 3 python unit-testing pytest

我有以下文件要测试

manage.py

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

    return pod
Run Code Online (Sandbox Code Playgroud)

这是我的测试脚本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'
Run Code Online (Sandbox Code Playgroud)

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

$ 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
Run Code Online (Sandbox Code Playgroud)

mat*_*yce 5

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

def test__get_pod_single_dash(patch_socket):
    assert __get_pod() == 'east'
Run Code Online (Sandbox Code Playgroud)

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

第二件事情它,你的monkeypatch通话将设置一个叫做可变socket.socketmy_gethostname,然后不影响你的函数。简化patch_socket为:

import socket

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

    monkeypatch.setattr(socket, 'gethostname', gethostname)
Run Code Online (Sandbox Code Playgroud)

然后允许测试通过。