Python versione Bignami - Scrivere test
doctest
Esegue gli esempi nelle docstring e controlla che siano corretti:
def somma(a, b):
"""
Somma due numeri.
Esempio:
>>> somma(3, 5)
8
"""
return a + b
if __name__ == "__main__":
import doctest
doctest.testmod()
Per controllare gli esempi in un file di testo esterno:
doctest.testfile("README.txt")
Scrivere test negli esempi
- Copia-incolla di sessioni interattive fatte lanciando
python(funziona con il risultato di funzioni, l'output delle print, i traceback delle eccezioni) - Il traceback delle eccezioni si può omettere o riscrivere abbreviato.
- Non c'è garanzia nell'ordine degli elementi di un set o di un dict: invece di:
>>> leggi_config()
{ "host": "www.example.com", "port": 8080 }
usare:
>>> leggi_config == { "host": "www.example.com", "port": 8080 }
True
unittest
if __name__ == '__main__':
import unittest
class PrimoGruppoDiTest(unittest.TestCase):
def setUp(self):
# (opzionale) Inizializza l'ambiente di ogni test
def tearDown(self):
# (opzionale, raro) Pulizia dopo i test
def testQuesto(self):
self.assertEqual(sqrt(4), 2)
# Conta solo fino alla quarta cifra decimale
self.assertAlmostEqual(sqrt(2), 1.4142, 4)
def testQuestaltro(self):
self.assertRaises(ValueError, sqrt, -1)
class SecondoGruppoDiTest(unittest.TestCase):
def testQuesto(self):
...
def testQuestaltro(self):
...
unittest.main()
- I nomi dei metodi coi test iniziano con "test"
- Ogni gruppo di test deve poter essere autoconsistente e indipendente dagli altri
- Se ci sono molti test, si possono mettere in un file separato
Funzioni di test
assert_(expr),failUnless(expr)testa che l'espressione sia verafailIf(expr)testa che l'espressione sia falsaassertEqual(a, b),failUnlessEqual(a, b)testa che i due valori siano ugualiassertNotEqual(a, b),failIfEqual(a, b)testa che i due valori siano diversiassertAlmostEqual(a, b, cifre),failUnlessAlmostEqual(a, b, cifre)testa che i due valori, arrotondati al dato numero di cifre decimali, siano ugualiassertNotAlmostEqual(a, b, cifre),failIfAlmostEqual(a, b, cifre)testa che i due valori, arrotondati al dato numero di cifre decimali, siano diversiassertRaises(eccezione, funzione, parametri...),failUnlessRaises(eccezione, funzione, parametri...)testa che la funzione, chiamata coi parametri dati, lanci l'eccezione data. Seeccezioneè una tupla di eccezioni, testa che almeno una di quelle sia lanciata.fail([msg])fallisce sempre.failureExceptionclasse base per tutte le eccezioni lanciate apposta per segnalare il fallimento di un test