断言某个错误发生
Asserting that a certain error occurs
给定以下代码:
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?我需要为此尝试捕获还是有更优雅的方法?
您可以为此使用 pytest
:
import pytest
...
with pytest.raises(AssertionError):
fun('a')
如果fun('a')
不引发断言错误,这将引发错误。
或者,如果您正在使用 unittest
,并且您在 TestCase
内,则可以使用 assert
Raises
:
self.assertRaises(AssertionError, fun, 'a')
此外,正如其他答案所提到的,与断言 False
相比,raise
出错会更好。如果你确实提出了一个错误,你可以提出一个告诉用户更多关于错误的信息,或者提出你自己的自定义异常:
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')
抛出断言可能是更好的方法。例如:
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'.
给定以下代码:
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?我需要为此尝试捕获还是有更优雅的方法?
您可以为此使用 pytest
:
import pytest
...
with pytest.raises(AssertionError):
fun('a')
如果fun('a')
不引发断言错误,这将引发错误。
或者,如果您正在使用 unittest
,并且您在 TestCase
内,则可以使用 assert
Raises
:
self.assertRaises(AssertionError, fun, 'a')
此外,正如其他答案所提到的,与断言 False
相比,raise
出错会更好。如果你确实提出了一个错误,你可以提出一个告诉用户更多关于错误的信息,或者提出你自己的自定义异常:
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')
抛出断言可能是更好的方法。例如:
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'.