这是由于具有多个输出流而在执行具有多个独立故障模式的单个测试时出现的问题.我还想展示在所有这些模式上断言数据的结果,无论哪个模式先失败.Python的unittest除了使用Suite代表单个测试之外没有这样的功能,这是不可接受的,因为我的单个测试总是需要作为一个单元运行; 它只是没有捕捉到事物的本质.
一个实际的例子是测试一个也生成日志的对象.您想断言它的方法的输出,但您也想要断言日志输出.这两个输出需要不同的测试,这些测试可以巧妙地表达为两个股票断言表达式,但您也不希望一个失败,以隐藏另一个在测试中的可能失败.所以你真的需要同时测试两者.
我拼凑了这个有用的小部件来解决我的问题.
def logFailures(fnList):
failurelog = []
for fn in fnList:
try:
fn()
except AssertionError as e:
failurelog.append("\nFailure %d: %s" % (len(failurelog)+1,str(e)))
if len(failurelog) != 0:
raise AssertionError(
"%d failures within test.\n %s" % (len(failurelog),"\n".join(failurelog))
)
Run Code Online (Sandbox Code Playgroud)
使用方式如下:
def test__myTest():
# do some work here
logFailures([
lambda: assert_(False,"This test failed."),
lambda: assert_(False,"This test also failed."),
])
Run Code Online (Sandbox Code Playgroud)
结果是logFailures()将引发一个异常,该异常包含列表中方法中引发的所有断言的日志.
问题:虽然这样做了,但是我想知道是否有更好的方法来处理这个问题,除了必须要创建嵌套的测试套件等等?