Om eerlijk te zijn heb ik altijd assertDictEqual
gebruikt, 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 assertDictEqual
nodig?
Antwoord 1, autoriteit 100%
Kortom, unittest
kan 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 assertEqual
kunt 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 unittest
alle speciale beweringen?
Het antwoord is dat de primaire taak van de unittest
assert*
-methoden is om u zinvolle output te geven wanneer een test mislukt. Kijk eens naar de code van de unittest
module — 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 unittest
werd 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
. nose
kan 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 pytest
en 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 dict
s en evalueert ze naar True
of False
, maar kan u ook aanvullende informatie geven , zoals de exacte verschillen tussen de twee dict
s.
Bovendien zullen de unit-tests in een goede IDE goed integreren. Je kunt gewoon een TestCase
toevoegen, assertDictEqual
gebruiken 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 dict
s niet gelijk zijn in vergelijking met ==
.