正直に言うと、私はいつもassertDictEqual
を使用しています。それを使用しなかったときに情報が得られたため、等しい辞書は同じではないからです。
しかし... dictは==
演算子で比較できることを知っています:
>>> {'a':1, 'b':2, 'c': [1,2]} == {'b':2, 'a':1, 'c': [1,2]}
True
assertDictEqual
が実際に必要な場所
基本的に、unittest
は、テストが失敗したwhyに関する詳細情報を提供します。これら2つのテストを比較します。
class DemoTest(unittest.TestCase):
D1 = {'a': 1, 'b': 2, 'c': [1, 2]}
D2 = {'a': 1, 'b': 2, 'c': [1]}
def test_not_so_useful(self):
assert self.D1 == self.D2
def test_useful(self):
self.assertDictEqual(self.D1, self.D2)
そしてその出力:
Failure
Traceback (most recent call last):
File "...x.py", line 86, in test_not_so_useful
assert self.D1 == self.D2
AssertionError
vs.
Failure
Traceback (most recent call last):
File "...x.py", line 80, in test_useful
self.assertDictEqual(self.D1, self.D2)
AssertionError: {'a': 1, 'c': [1, 2], 'b': 2} != {'a': 1, 'c': [1], 'b': 2}
- {'a': 1, 'b': 2, 'c': [1, 2]}
? ---
+ {'a': 1, 'b': 2, 'c': [1]}
後者では、違いが何であったかを正確に確認できます。自分で解決する必要はありません。 assertEqual
の代わりに標準のassertDictEqual
を使用するだけで、同じ結果が得られることに注意してください。 ドキュメント
...通常、これらのメソッドを直接呼び出す必要はありません。
これは、より広範な質問の一部です。
Unittestに特別なアサートがすべてあるのはなぜですか?
答えは、UnitTest assert *メソッドの主な仕事は、テストが失敗したときに意味のある出力を提供することです。 unittestモジュールのコードを見てください-それは本当に彼らがすることのほとんどです(彼らがすることだけですか??)
Pythonは内省が簡単な動的言語であるため、なぜそれだけで面倒なのでしょうか。答えは、「unitestがJava junitパッケージから移植されたためです。そして、それがJavaで行われた方法です(おそらく、それがどれほど難しい/不可能なのかを考えなければなりませんでした)実行時のイントロスペクト)。
したがって、私の推奨事項:標準ライブラリのテストを作成している場合を除き、unittestを使用しないでください。私はpytestを使用していますが、鼻も良い選択肢かもしれません。テストの作成がより迅速かつ簡単になり、エラーが発生したときに優れたレポートを取得できます。
また、パラメータ化されたテスト、フィクスチャ、テスト構成、モックなどのための多くの気の利いた機能が含まれています...
既にunitestを使用しているプロジェクトを使用している場合は、pytestを使用してテストを実行でき、多くの利点を得ることができます。
これはユニットテストのコンテキストにあると思います。 assertDictEqualメソッドは、辞書を比較してTrueまたはFalseに評価するだけでなく、追加情報を提供できます。 2つの辞書の正確な違いなど。
さらに、良いIDEでは、ユニットテストがうまく統合されます。 TestCaseを追加し、assertDictEqualを使用すると、IDEがテストを見つけて実行します。出力は読みやすい形式で表示されます。これにより、多くの定型コードを節約できます。
「==」と比較すると、2つの等しい辞書が等しくない場合に非常に興味があります。