Questo è un problema che si presentava quando si eseguiva un singolo test con più modalità di errore indipendenti, a causa della presenza di più flussi di uscita. Volevo anche mostrare i risultati dell'affermazione dei dati su tutte quelle modalità, indipendentemente da quale errore si sia verificato prima. L'unittest di Python non ha questa caratteristica al di fuori dell'uso di una Suite per rappresentare il singolo test, il che era inaccettabile dal momento che il mio singolo test aveva sempre bisogno di essere eseguito come una singola unità; semplicemente non cattura la natura della cosa.Come posso gestire più asserti all'interno di un singolo unipest di Python?
Un esempio pratico è la verifica di un oggetto che genera anche un registro. Vuoi dichiarare l'output dei suoi metodi, ma vuoi anche dichiarare l'output del registro. Le due uscite richiedono test diversi, che possono essere espressi in modo chiaro come due delle espressioni asserzioni azionarie, ma non si vuole anche che il fallimento di uno impedisca l'eventuale fallimento dell'altro all'interno del test. Quindi hai davvero bisogno di testare entrambi allo stesso tempo.
Ho messo insieme questo piccolo widget utile per risolvere il mio problema.
def logFailures(fnList):
failurelog = []
for fn in fnList:
try:
fn()
except AssertionError as e:
failurelog.append("\nFailure %d: %s" % (len(failurelog)+1,str(e)))
if len(failurelog) != 0:
raise AssertionError(
"%d failures within test.\n %s" % (len(failurelog),"\n".join(failurelog))
)
che viene usato in questo modo:
def test__myTest():
# do some work here
logFailures([
lambda: assert_(False,"This test failed."),
lambda: assert_(False,"This test also failed."),
])
Il risultato è che logFailures() solleverà un'eccezione che contiene un registro di tutte le affermazioni che sono state sollevate nei metodi all'interno della lista.
La domanda: Mentre questo fa il lavoro, mi chiedo se c'è un modo migliore per gestire questo, oltre a dover fare il tempo di creare suite di test nidificati e così via?
"anche tu non vuoi il fallimento di uno per nascondere il possibile fallimento dell'altro all'interno del test". Se vuoi testare due cose diverse, rendi due test differenti! –
"anche tu non vuoi il fallimento di uno per nascondere il possibile fallimento dell'altro all'interno del test". Sì, voglio: questi sono test unitari. Se un test fallisce, correggere l'errore e rieseguire i test. –