2015-01-12 2 views
2

Есть ли хороший способ сделать это.py.test несколько тестов для разных результатов

@pytest.fixture(params=[ 
    "web01-east.domain.com", 
    "web01-master-east.domain.com", 
    "web01.domain.com", 
]) 
def patch_socket(request, monkeypatch): 
    def gethostname(): 
     return request.param 

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


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

Прямо сейчас, что будет работать, но я хочу, чтобы последнее испытание, но не в состоянии быть в порядке, так как если нет в-востока имени хоста функция __get_pod() возвращает неизвестно.

Есть ли способ сказать py.test, что я хочу передать в списке парам о том, что тесты должны быть равны, как

[ 
('web01-east.domain.com', 'web') 
('redis01-master-east.domain.com', 'redis-master') 
('web01.domain.com', 'Unknown') 
] 

ответ

3

Вместо обезьяны заплат socket.gethostname, сделать __get_pod принять параметр. Это сделает код более проверяемым:

Вот пример с pytest.mark.parametrize:

import re 

import pytest 


def __get_pod(hostname): # dummy impl. 
    hostname = hostname.split('.', 1)[0] 
    if '-' not in hostname: 
     return 'Unknown' 
    hostname = re.sub(r'\d+', '', hostname) 
    return hostname.rsplit('-', 1)[0] 


@pytest.mark.parametrize(['hostname', 'expected'], [ 
    ["web01-east.domain.com", 'web'], 
    ["redis01-master-east.domain.com", 'redis-master'], 
    ["web01.domain.com", 'Unknown'], 
]) 
def test__get_pod(hostname, expected): 
    assert __get_pod(hostname) == expected 

Если вы хотите сделать это с mockey-заплат (или, вы не можете изменить __get_pod подпись)

import re 
import socket 

import pytest 


def __get_pod(): 
    hostname = socket.gethostname() 
    hostname = hostname.split('.', 1)[0] 
    if '-' not in hostname: 
     return 'Unknown' 
    hostname = re.sub(r'\d+', '', hostname) 
    return hostname.rsplit('-', 1)[0] 


@pytest.mark.parametrize(['hostname', 'expected'], [ 
    ["web01-east.domain.com", 'web'], 
    ["redis01-master-east.domain.com", 'redis-master'], 
    ["web01.domain.com", 'Unknown'], 
]) 
def test__get_pod(monkeypatch, hostname, expected): 
    monkeypatch.setattr(socket, 'gethostname', lambda: hostname) 
    assert __get_pod() == expected 
1

Альтернатива ответам falsetru, которая больше похожа на то, что вы начали, это использовать возвращаемое значение из прибора. Учитывая, что __get_pod выглядит примерно так (измененную от манекена falsetru в):

def __get_pod(): 
    hostname = socket.gethostname().split('.', 1)[0] 
    if '-' not in hostname: 
     return 'Unknown' 
    hostname = re.sub(r'\d+', '', hostname) 
    return hostname.rsplit('-', 1)[0] 

Вы можете проверить это нравится:

@pytest.fixture(params=[ 
    ('web01-east.domain.com', 'web'), 
    ('redis01-master-east.domain.com', 'redis-master'), 
    ('web01.domain.com', 'Unknown') 
]) 
def patch_socket(request, monkeypatch): 
    def gethostname(): 
     return request.param[0] 

    monkeypatch.setattr(socket, 'gethostname', gethostname) 
    return request.param[1] 

def test__get_pod(patch_socket): 
    assert __get_pod() == patch_socket 

Это требует меньше изменений от исходного кода.

Смежные вопросы