編集:より良い例に切り替え、これが本当の問題である理由を明らかにしました。
1回のテストで複数の失敗を確認できるように、アサーションが失敗しても実行を継続する単体テストをPythonで記述したいと思います。例えば:
class Car(object):
def __init__(self, make, model):
self.make = make
self.model = make # Copy and paste error: should be model.
self.has_seats = True
self.wheel_count = 3 # Typo: should be 4.
class CarTest(unittest.TestCase):
def test_init(self):
make = "Ford"
model = "Model T"
car = Car(make=make, model=model)
self.assertEqual(car.make, make)
self.assertEqual(car.model, model) # Failure!
self.assertTrue(car.has_seats)
self.assertEqual(car.wheel_count, 4) # Failure!
ここで、テストの目的は、Car's__init__
がフィールドを正しく設定していることを確認することです。私はそれを4つのメソッドに分割することができます(そしてそれはしばしば素晴らしいアイデアです)が、この場合、単一の概念をテストする単一のメソッドとして保持する方が読みやすいと思います(「オブジェクトは正しく初期化されます」)。
ここでメソッドを分割しないことが最善であると仮定すると、新しい問題が発生します。すべてのエラーを一度に確認することはできません。model
エラーを修正してテストを再実行すると、wheel_count
エラーが表示されます。最初にテストを実行したときに両方のエラーを確認する時間を節約できます。
比較のために、GoogleのC ++ユニットテストフレームワークは、致命的でないEXPECT_*
アサーションと致命的なアサーションを区別しますASSERT_*
。
アサーションはペアで提供され、同じことをテストしますが、現在の機能に異なる影響を及ぼします。ASSERT_ *バージョンは、失敗すると致命的な失敗を生成し、現在の機能を中止します。EXPECT_ *バージョンは致命的ではない障害を生成し、現在の機能を中止しません。通常、EXPECT_ *が推奨されます。これは、テストで複数の障害を報告できるためです。ただし、問題のアサーションが失敗したときに続行しても意味がない場合は、ASSERT_ *を使用する必要があります。
EXPECT_*
Pythonで同様の動作を取得する方法はありunittest
ますか?にない場合unittest
、この動作をサポートする別のPythonユニットテストフレームワークはありますか?
ちなみに、致命的ではないアサーションから実際のテストがいくつ役立つか知りたいので、いくつかのコード例を調べました(Google Code Search、RIPの代わりにsearchcodeを使用するように2014-08-19を編集)。最初のページからランダムに選択された10個の結果のうち、すべてに同じテスト方法で複数の独立したアサーションを作成したテストが含まれていました。すべての人が致命的ではない主張から利益を得るでしょう。