web-dev-qa-db-ja.com

dictを `==`で比較できる場合、assertDictEqualが必要なのはなぜですか?

正直に言うと、私はいつもassertDictEqualを使用しています。それを使用しなかったときに情報が得られたため、等しい辞書は同じではないからです。

しかし... dictは==演算子で比較できることを知っています:

>>> {'a':1, 'b':2, 'c': [1,2]} == {'b':2, 'a':1, 'c': [1,2]}
True

assertDictEqualが実際に必要な場所

42
trikoder_beta

基本的に、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を使用するだけで、同じ結果が得られることに注意してください。 ドキュメント

...通常、これらのメソッドを直接呼び出す必要はありません。

67
jonrsharpe

これは、より広範な質問の一部です。

Unittestに特別なアサートがすべてあるのはなぜですか?

答えは、UnitTest assert *メソッドの主な仕事は、テストが失敗したときに意味のある出力を提供することです。 unittestモジュールのコードを見てください-それは本当に彼らがすることのほとんどです(彼らがすることだけですか??)

Pythonは内省が簡単な動的言語であるため、なぜそれだけで面倒なのでしょうか。答えは、「unitestがJava junitパッケージから移植されたためです。そして、それがJavaで行われた方法です(おそらく、それがどれほど難しい/不可能なのかを考えなければなりませんでした)実行時のイントロスペクト)。

したがって、私の推奨事項:標準ライブラリのテストを作成している場合を除き、unittestを使用しないでください。私はpytestを使用していますが、鼻も良い選択肢かもしれません。テストの作成がより迅速かつ簡単になり、エラーが発生したときに優れたレポートを取得できます。

また、パラメータ化されたテスト、フィクスチャ、テスト構成、モックなどのための多くの気の利いた機能が含まれています...

既にunitestを使用しているプロジェクトを使用している場合は、pytestを使用してテストを実行でき、多くの利点を得ることができます。

1
Chris Barker

これはユニットテストのコンテキストにあると思います。 assertDictEqualメソッドは、辞書を比較してTrueまたはFalseに評価するだけでなく、追加情報を提供できます。 2つの辞書の正確な違いなど。

さらに、良いIDEでは、ユニットテストがうまく統合されます。 TestCaseを追加し、assertDictEqualを使用すると、IDEがテストを見つけて実行します。出力は読みやすい形式で表示されます。これにより、多くの定型コードを節約できます。

「==」と比較すると、2つの等しい辞書が等しくない場合に非常に興味があります。

1
lhk