Waarom is assertDictEqual nodig als dictaten kunnen worden vergeleken met `==`?

Om eerlijk te zijn heb ik altijd assertDictEqualgebruikt, omdat ik soms, als ik het niet gebruikte, informatie kreeg dat gelijke dictees niet hetzelfde zijn.

Maar… ik weet dat dictaten kunnen worden vergeleken door de ==operator:

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

Waar heb ik misschien assertDictEqualnodig?


Antwoord 1, autoriteit 100%

Kortom, unittestkan u meer informatie geven over waaromde test is mislukt. Vergelijk deze twee tests:

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)

En hun output:

Failure
Traceback (most recent call last):
  File "...x.py", line 86, in test_not_so_useful
    assert self.D1 == self.D2
AssertionError

tegen.

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]}

In dat laatste kun je precies zien wat het verschil was, je hoeft het niet zelf uit te zoeken. Merk op dat je gewoon de standaard assertEqualkunt gebruiken in plaats van assertDictEqual, met hetzelfde resultaat; per de documenten

…het is meestal niet nodig om deze methoden rechtstreeks aan te roepen.


Antwoord 2, autoriteit 7%

Dit maakt deel uit van een bredere vraag:

Waarom heeft unittestalle speciale beweringen?

Het antwoord is dat de primaire taak van de unittestassert*-methoden is om u zinvolle output te geven wanneer een test mislukt. Kijk eens naar de code van de unittestmodule — dat is eigenlijk grotendeels wat ze doen (alleen wat ze doen?)

Aangezien Python een dynamische taal is met gemakkelijke introspectie, waarom zou je je daar druk over maken? En het antwoord is “omdat unittestwerd geporteerd vanuit het Java junit-pakket, en dat is hoe ze het in Java deden” (en waarschijnlijk moesten, gezien hoeveel moeilijker of onmogelijk het is introspectie tijdens runtime).

Dus mijn aanbeveling: tenzij je tests schrijft voor de standaardbibliotheek, gebruik unittest dan helemaal niet — het staat alleen maar in de weg. Ik gebruik pytest. nosekan ook een goede optie zijn. Het maakt het sneller en gemakkelijker om tests te schrijven, en je krijgt uitstekende rapportage wanneer je fouten krijgt.

Het bevat ook tal van handige functies voor geparametriseerd testen, armaturen, testconfiguratie, mocking, enz…

Als je aan een project werkt dat al gebruikmaakt van unittest— je kunt nog steeds je tests uitvoeren met pytesten profiteer van veel van de voordelen ervan.


Antwoord 3

Ik neem aan dat dit in de context van unit testing is. De assertDictEqual-methode vergelijkt niet alleen de dicts en evalueert ze naar Trueof False, maar kan u ook aanvullende informatie geven , zoals de exacte verschillen tussen de twee dicts.

Bovendien zullen de unit-tests in een goede IDE goed integreren. Je kunt gewoon een TestCasetoevoegen, assertDictEqualgebruiken en de IDE zal de test voor je vinden en uitvoeren. De uitvoer wordt vervolgens weergegeven in een gemakkelijk te lezen formaat. Dit kan je veel standaardcode besparen.

Ik zou erg geïnteresseerd zijn in een geval waarin twee gelijke dicts niet gelijk zijn in vergelijking met ==.

Other episodes