【问题标题】:py.test assert may raise, and if it raises it will be __py.test assert 可能会引发,如果引发它将是 __
【发布时间】:2017-03-06 10:42:53
【问题描述】:

是否存在类似于 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]

指示的&lt;== problem 只是test_encode_err() 的问题(而不是test_encode_u8()),因为u''.encode('ascii') 不会引发UnicodeEncodeError (没有不包含代码以上字符的Unicode 字符串)第 127 点将提高)。

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

【问题讨论】:

    标签: python pytest


    【解决方案1】:

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

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

    如果您不知道代码是否会引发异常,请考虑是否应该编写测试。尝试进一步确定数据并进行两项测试,一项引发异常,另一项不引发异常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-29
      相关资源
      最近更新 更多