py.test断言可能会升高,如果它升起则会__

时间:2017-03-06 10:42:53

标签: python pytest

是否存在类似于pytest.raises的pytest功能,如果块引发指定的异常,根本不会引发?类似的东西:

def test_encode_err(ulist):
    with pytest.maybe_raises_but_only(UnicodeEncodeError):  # <== ?
        assert encode_list(ulist, 'ascii') == map(lambda x:x.encode('ascii'), ulist)

这个问题出现在以下情况中。

要测试的功能:

def encode_list(lst, enc):
    "Encode all unicode values in ``lst`` using ``enc``."
    return [(x.encode(enc) if isinstance(x, unicode) else x) for x in lst]

一些简单的测试(下面的装置):

def test_encode_err(ulist):
    with pytest.raises(UnicodeEncodeError):
        assert encode_list(ulist, 'ascii')

def test_encode_u8(ulist, u8list):
    assert encode_list(ulist, 'u8') == u8list

灯具:

@pytest.fixture(
    scope='module',
    params=[
        u'blåbærsyltetøy',
        u'',                # <==== problem
    ]
)
def ustr(request):
    print 'testing with:', `request.param`
    return request.param

@pytest.fixture
def u8str(ustr):
    return ustr.encode('u8')

@pytest.fixture
def ulist(ustr):
    return [ustr, ustr]

@pytest.fixture
def u8list(u8str):
    return [u8str, u8str]

指示的<== problem只是test_encode_err()(而不是test_encode_u8())的问题,因为u''.encode('ascii')没有提出UnicodeEncodeError (没有不包含代码点127上方字符的unicode字符串将会引发)。

是否有覆盖此用例的py.test函数?

1 个答案:

答案 0 :(得分:3)

如果您不关心何时抛出异常,只需正常编写代码,但在其周围放置一个try...except块以忽略错误。

def test_encode_err(ulist):
    try:
        assert encode_list(ulist, 'ascii') == map(lambda x:x.encode('ascii'), ulist)
    except UnicodeDecodeError:
        pass

如果您不知道代码是否会抛出异常,请考虑是否应该编写测试。尝试将数据固定一点并进行两次测试,一次提出异常,一次不提出。