Testiamo i modelli

Testare la nostra applicazione è necessario per avere una applicazione funzionante adesso quando la scriviamo e nel futuro.

Per prima cosa quindi andiamo a creare la directory che ospiterà i file dei nostri test e creiamo il file per contenere i test per i modelli:

mkdir corsi/tests
touch corsi/tests/__init__.py
git mv corsi/tests.py corsi/tests/test_models.py

Apriamo il file corsi/tests/test_models.py con il nostro editor e cominciamo a scrivere dei test per il modello Categoria:

from django.test import TestCase

from corsi.models import Categoria


class CategoriaTestCase(TestCase):
    def test_posso_creare_categoria(self):
        categoria = Categoria.objects.create(titolo="titolo")
        self.assertTrue(categoria)

    def test_posso_stampare_categoria(self):
        categoria = Categoria.objects.create(titolo="titolo")
        self.assertEqual(str(categoria), "titolo")

    def test_categoria_mantiene_la_data_di_creazione(self):
        categoria = Categoria.objects.create(titolo="titolo")
        self.assertTrue(categoria.creato)
        data_creazione = categoria.creato
        categoria.save()
        self.assertEqual(categoria.creato, data_creazione)

    def test_categoria_aggiorna_la_data_di_aggiornamento(self):
        categoria = Categoria.objects.create(titolo="titolo")
        self.assertTrue(categoria.aggiornato)
        data_aggiornamento = categoria.aggiornato
        categoria.save()
        self.assertGreater(categoria.aggiornato, data_aggiornamento)

Il sistema di testing di Django estende quello della libreria standard di Python chiamato unittest. Il runner dei test di Django esegue i test presenti nella directory tests della nostra applicazione presenti in file il cui nome inizia per test.

I test vengono raggruppati in classi che ereditano da TestCase, i singoli test sono implementati come metodi di questa classe ed il loro nome deve cominciare con test_. Ogni test viene eseguito in una transazione del database che poi viene annullata, quindi le query fatte durante ogni test non inficiano gli altri. I test usano un database diverso rispetto a quello usato dal progetto, per default viene usato come nome quello configurato in settings.py prefissato da test_.

Facciamo girare i test con il comando:

python3 manage.py test

Quindi salviamo i nostri progressi:

git add corsi/tests
git commit -m "Aggiungiamo test per il modello Categoria"
git push origin main

Esercizi

Scrivi dei test analoghi per il modello Corso, salvali su git e pubblicali su GitHub.

Leggi l'overview sui test di Django.

Scopri nella documentazione come puoi far eseguire un singolo test.

Consulta la lista degli assert del modulo unittest di Python.