これは、複数の出力ストリームがあるために、複数の独立した障害モードを持つ単一のテストを実行したときに発生した問題です。また、どのモードが最初に失敗したかに関係なく、これらすべてのモードでデータをアサートした結果も示したいと思いました。Python の unittest には、Suite を使用して単一のテストを表す以外にそのような機能はありません。物事の性質を捉えていないだけです。
実際の例は、ログも生成するオブジェクトのテストです。そのメソッドの出力をアサートしたいが、ログ出力もアサートしたい。2 つの出力には異なるテストが必要です。これは、2 つのストック アサーション式として適切に表現できますが、テスト内で一方の失敗が他方の失敗の可能性を隠してしまうことも望ましくありません。したがって、両方を同時にテストする必要があります。
この便利な小さなウィジェットを組み合わせて問題を解決しました。
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))
)
次のように使用されます。
def test__myTest():
# do some work here
logFailures([
lambda: assert_(False,"This test failed."),
lambda: assert_(False,"This test also failed."),
])
その結果、logFailures() は、リスト内のメソッドで発生したすべてのアサーションのログを含む例外を発生させます。
質問:これでうまくいきますが、ネストされた一連のテストなどを作成する必要がある以外に、これを処理するためのより良い方法があるかどうか疑問に思っています。