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.failureException
classe base per tutte le eccezioni lanciate apposta per segnalare il fallimento di un test