断言发生了某种错误

时间:2017-01-09 13:24:06

标签: python testing try-catch throw assertion

给出以下代码:

def fun(param):
    if param == 'a':
        assert False
    else:
        return None

# fun('a') THIS THROWS AN AssertionError
# PSEUDOCODE FOR WHAT I WANT TO DO:
# assert (fun('a') throws an AssertionError)
assert fun('b') == None

如何断言第一个函数调用(fun('a'))会给我一个AssertionError?我是否需要尝试一下这个或者是否有更优雅的方式?

2 个答案:

答案 0 :(得分:3)

您可以使用pytest

import pytest
...
with pytest.raises(AssertionError):
    fun('a')

如果fun('a') 没有引发AssertionError,则会引发错误。

或者,如果您使用的是unittest,而且只有TestCase,则可以使用assert Raises

self.assertRaises(AssertionError, fun, 'a')

另外,正如其他答案所提到的那样,raise错误比断言False更好。如果你确实提出错误,你可以提出一个告诉用户更多错误的方法,或者提出你自己的自定义异常:

import pytest

class AError(Exception):
    pass

def fun(param):
    if param == 'a':
        raise AError("You passed 'a'; don't do that!")
    else:
        return None

with pytest.raises(AError):
    fun('a')

答案 1 :(得分:1)

投掷断言可能是一种更好的方法。举个例子:

def fun(param):
    if param == 'a':
        raise AssertionError('Param is equal to \'a\'.')
    else:
        return None

try:
    fun('b')
    print('Equalling \'b\' worked fine.')
    fun('a')
    print('This line is not printed...')
except AssertionError as err:
    print('An assertion error has been raised:')
    print(err)

给出:

Equalling 'b' worked fine.
An assertion error has been raised:
Param is equal to 'a'.