2015-07-30 15 views
10

Il problema:nose.tools.eq_ vs assertEqual

Abbiamo utilizzato nose prova corridore per un bel po '.

Di tanto in tanto, vedo i nostri test hanno eq_() chiamate:

eq_(actual, expected) 

al posto del comune:

self.assertEqual(actual, expected) 

La domanda:

Quali sono i vantaggi di utilizzando nose.tools.eq_ in contrasto con il framework di unittest standard assertEqual()? Sono effettivamente equivalenti?


Pensieri:

Beh, per esempio, eq_ è più breve, ma deve essere importati da nose.tools che rende i test dipendenti dalla libreria di test runner che può rendere più difficile l'interruttore a un altro test runner, ad esempio py.test. D'altra parte, stiamo usando anche @istest, @nottest e @attr decoratori di naso molto.

risposta

5

Non sono equivalenti a unittest.TestCase.assertEqual.

nose.tools.ok_ (espressione, msg = None)

Stenografia per assert. Salva 3 personaggi interi!

nose.tools.eq_ (a, b, msg = None)

Stenografia per 'affermare una == b, ‘% r! =% R’% (a, b)

https://nose.readthedocs.org/en/latest/testing_tools.html#nose.tools.ok_

Questi documenti sono tuttavia leggermente fuorviante. Se si seleziona la fonte vedrete eq_ in realtà è:

def eq_(a, b, msg=None): 
    if not a == b: 
     raise AssertionError(msg or "%r != %r" % (a, b)) 

https://github.com/nose-devs/nose/blob/master/nose/tools/trivial.py#L25

questo è abbastanza vicino al caso base di assertEqual:

def _baseAssertEqual(self, first, second, msg=None): 
    """The default assertEqual implementation, not type specific.""" 
    if not first == second: 
     standardMsg = '%s != %s' % _common_shorten_repr(first, second) 
     msg = self._formatMessage(msg, standardMsg) 
     raise self.failureException(msg) # default: AssertionError 

https://github.com/python/cpython/blob/9b5ef19c937bf9414e0239f82aceb78a26915215/Lib/unittest/case.py#L805

Tuttavia, come suggerito dal nome della docstring e della funzione, assertEqual ha il potenziale di essere g tipo specifico. Questo è qualcosa che si perde con eq_ (o assert a == b, per quella materia).unittest.TestCase ha casi speciali per dict s, list s, tuple s, set s, frozenset s e str s. Questi sembrano per lo più facilitare la stampa più carina dei messaggi di errore.

Ma assertEqual è un membro di classe TestCase, quindi può essere utilizzato solo in TestCase s. nose.tools.eq_ può essere utilizzato ovunque, come un semplice assert.

+0

Ottima spiegazione, grazie! – alecxe