Il modulo unittest fornisce un ricco insieme di strumenti per costruire ed eseguire dei test. Questa sezione mostra come un piccolo sotto insieme di tali strumenti sia sufficiente a venire incontro alle necessit� della maggior parte degli utenti.
Ecco un breve script per testare tre funzioni del modulo random:
import random
import unittest
class TestSequenceFunctions(unittest.TestCase):
def setUp(self):
self.seq = range(10)
def testshuffle(self):
# assicura che la sequenza rimescolata non perda degli elementi
random.shuffle(self.seq)
self.seq.sort()
self.assertEqual(self.seq, range(10))
def testchoice(self):
element = random.choice(self.seq)
self.assert_(element in self.seq)
def testsample(self):
self.assertRaises(ValueError, random.sample, self.seq, 20)
for element in random.sample(self.seq, 5):
self.assert_(element in self.seq)
if __name__ == '__main__':
unittest.main()
Una testcase viene creata derivandola da una classe unittest.TestCase. I tre test singoli sono definiti tramite dei metodi il cui nome inizia con le lettere "test". Questa convenzione sul nome informa il test runner di quali sono i metodi che rappresentano dei test.
Il punto cruciale di ogni test � una chiamata ad assertEqual() per controllare l'esattezza del risultato; al metodo assert_() per verificare una condizione, oppure ad assertRaises() per verificare che un'eccezione venga sollevata come ci si aspetta. Questi metodi sono usati in luogo di un'istruzione assert cos� che il test runner possa accumulare tutti i risultati dei vari metodi e produrre un resoconto finale.
Quando viene definito un metodo setUp(), il test runner avvier� questo metodo prima di ogni test. Allo stesso modo, se viene definito un metodo tearDown(), il test runner invocher� tale metodo dopo l'esecuzione di ogni test. Nell'esempio precedente, setUp() veniva usato per creare, per ogni test, una nuova sequenza.
Il blocco finale mostra un modo semplice per eseguire i test. unittest.main() mette a disposizione un'interfaccia a riga di comando per testare lo script. Quando viene eseguito da riga di comando, lo script precedente produce un output di questo tipo:
... ---------------------------------------------------------------------- Ran 3 tests in 0.000s OK
Invece di unittest.main(), esistono altri modi per eseguire i test con un livello di controllo pi� raffinato, un output meno conciso e senza la necessit� di eseguirli da riga di comando. Per esempio, le ultime due righe possono essere sostituite con:
suite = unittest.makeSuite(TestSequenceFunctions) unittest.TextTestRunner(verbosity=2).run(suite)
Eseguendo il nuovo script dall'interprete o da un altro script, si ottiene il seguente output:
testchoice (__main__.TestSequenceFunctions) ... ok testsample (__main__.TestSequenceFunctions) ... ok testshuffle (__main__.TestSequenceFunctions) ... ok ---------------------------------------------------------------------- Ran 3 tests in 0.110s OK
Gli esempi precedenti mostrano le funzionalit� pi� comunemente usate di unittest, sufficienti ai bisogni di tutti i giorni. Il resto della documentazione approfondisce l'insieme completo delle funzionalit� a partire dai principi di base.
Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.