-
Notifications
You must be signed in to change notification settings - Fork 2
Testare în Django
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.
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.
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 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.
>>> 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.