py.test 不同结果的多次测试
py.test multiple tests for different results
有什么好的方法吗?
@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'
现在这会起作用,但我想让最后一个测试失败但没关系,因为如果主机名中没有 -east,__get_pod() 函数 returns 未知。
有没有办法告诉 py.test 我想传入一个参数列表,其中包含哪些测试应该等于
[
('web01-east.domain.com', 'web')
('redis01-master-east.domain.com', 'redis-master')
('web01.domain.com', 'Unknown')
]
而不是猴子修补 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-patching 来做(或者,你不能改变 __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
faltru 答案的替代方法(更像是您开始时使用的方法)是使用夹具中的 return 值。鉴于 __get_pod
看起来像(从 faltru 的假人修改而来):
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
这需要对原始代码进行较少的更改。
有什么好的方法吗?
@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'
现在这会起作用,但我想让最后一个测试失败但没关系,因为如果主机名中没有 -east,__get_pod() 函数 returns 未知。
有没有办法告诉 py.test 我想传入一个参数列表,其中包含哪些测试应该等于
[
('web01-east.domain.com', 'web')
('redis01-master-east.domain.com', 'redis-master')
('web01.domain.com', 'Unknown')
]
而不是猴子修补 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-patching 来做(或者,你不能改变 __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
faltru 答案的替代方法(更像是您开始时使用的方法)是使用夹具中的 return 值。鉴于 __get_pod
看起来像(从 faltru 的假人修改而来):
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
这需要对原始代码进行较少的更改。