Testarea automată este extrem de utilă pentru indentificarea și rezolvarea bug-urilor apărute în cadrul dezvoltării Web. Aveți posibilitatea să utilizați o colecție de teste (denumită și suită de teste) pentru a rezolva, sau a evita, o serie de probleme:

  • Atunci când scrieți un nou cod, puteți utiliza teste pentru a valida funcționalitatea acestuia (se comportă cum era de așteptat).
  • Atunci când refactorizați sau modificați cod vechi, puteți utiliza teste pentru a vă asigura că modificările nu au afectat comportamentul aplicației în mod neașteptat.

Metoda preferată de a scrie teste în Django este folosind modulul unittest din librăria standard Python.

Scrierea și rularea testelor

Scrierea testelor

Exemplu:

from django.test import TestCase
from myapp.models import Animal

class AnimalTestCase(TestCase):
    def setUp(self):
        Animal.objects.create(name="lion", sound="roar")
        Animal.objects.create(name="cat", sound="meow")

    def test_animals_can_speak(self):
        """Animals that can speak are correctly identified"""
        lion = Animal.objects.get(name="lion")
        cat = Animal.objects.get(name="cat")
        self.assertEqual(lion.speak(), 'The lion says "roar"')
        self.assertEqual(cat.speak(), 'The cat says "meow"')

Când rulați testele, comportamentul implicit al utilitarului de test este să găsească toate test case-urile (care sunt o subclasa a unittest.TestCase) în orice fișier al cărui nume începe cu test, pentru a crea apoi o suită de teste din test case-urile găsite și a o rula.

Mai multe detalii despre unittest aici.

Rularea testelor

Odată ce ați scris testele, le puteți rula folosind următoarea comandă:

$ ./manage.py test

În mod implicit, această comandă va rula toate testele găsite în fișierele test*.py din directorul curent. Se poate să și specificați calea către directorul în care pot găsi aceste fișiere.

$ ./manage.py test animals/

Aveți posibilitatea să specificați anumite teste pentru a rula prin furnizarea oricâtor argumente (denumite “test labels”) comenzii ./manage.py test. Fiecare test label poate fi o cale spre un pachet, un modul, o subclasa TestCase sau o metodă. De exemplu:

# Run all the tests in the animals.tests module
$ ./manage.py test animals.tests

# Run all the tests found within the 'animals' package
$ ./manage.py test animals

# Run just one test case
$ ./manage.py test animals.tests.AnimalTestCase

# Run just one test method
$ ./manage.py test animals.tests.AnimalTestCase.test_animals_can_speak

Test Client

Test client este o clasă Python care se comportă ca un browser web fictiv, permițându-vă să vă testați view-urile și să interacționați cu aplicația voastră Django.

Unele dintre lucrurile pe care le puteți face cu test client sunt:

  • Simularea cererilor de tip GET și POST pe o adresă URL și observarea răspunsului - totul de la HTTP low-level (result headers și status codes) la conținutul paginii.
  • Observarea lanțului de redirecționări (dacă este cazul) și verificarea status code-ului și URL-ului la fiecare pas.

Prezentare generală și un exemplu rapid

>>> from django.test import Client
>>> c = Client()
>>> response = c.post('/login/', {'username': 'john', 'password': 'smith'})
>>> response.status_code
200
>>> response = c.get('/customer/details/')
>>> response.content
b'<!DOCTYPE html...'

Ce trebuie să țineți minte atunci cand lucrați cu test client:

  • Test client-ul nu are nevoie de un server Web ca să ruleze
  • Când faceți o cerere către un URL, trebuie să specificați path-ul URL-ului, nu tot domeniul.

Varianta corectă:

>>> c.get('/login/')

Varianta incorectă:

>>> c.get('https://www.example.com/login/')
  • În mod implicit, test client-ul va dezactiva orice verificare CSRF facută de site-ul vostru.