Python 断言发生了某种错误

Python 断言发生了某种错误,python,testing,try-catch,throw,assertion,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 我如何断言第

给定以下代码:

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?我需要试一试,还是有更优雅的方式?

您可以使用:

import pytest
...
with pytest.raises(AssertionError):
    fun('a')
如果
fun('a')
未引发断言错误,则会引发错误

或者,如果您使用的是
unittest
,并且您在
TestCase
中,则可以使用:

另外,正如其他答案所提到的,你最好是
提出一个错误,而不是断言
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')

抛出断言可能是更好的方法。例如:

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'.

这很好地回答了我的问题。因为我很忙,所以不能马上回复。谢谢!
Equalling 'b' worked fine.
An assertion error has been raised:
Param is equal to 'a'.