2009-09-02 3 views
9

Chcę rozpocząć integrację testów jednostkowych w moich projektach Django i odkryłem, że testowanie jednostkowe widoku jest trudne, ze względu na sposób, w jaki Django implementuje widoki z funkcjami.W jaki sposób mogę testować widoki Django w jednostce?

Na przykład, każda funkcja jest widokiem/stroną w Django, jeśli funkcja ma adres URL.

Jak mogę sprawdzić widoki Django w jednostce?

Odpowiedz

10

Nie jestem pewien, jak testowanie widoku jest trudne.

Po prostu używasz test client.

Kod zasięgu jest łatwy. Wyjaśniasz, w jaki sposób żądanie adresu URL odwzorowuje ścieżkę kodu i tworzy odpowiednie żądania URL.

Możesz, jeśli chcesz, wywołać funkcje widoku "ręcznie", tworząc obiekt żądania i badając obiekt odpowiedzi, ale to za dużo pracy.

Jeśli masz wątpliwości co do zasięgu swojego kodu, to dobrze. Oznacza to, że masz kod, którego nie możesz łatwo zmapować do adresu URL (który jest wszystkim, co może zobaczyć użytkownik aplikacji internetowej). Jeśli masz kod, który nie jest mapowany na adres URL, prawdopodobnie powinieneś (a) usunąć kod lub (b) przekształcić go w osobny moduł.

Mamy wiele modułów poza naszymi funkcjami widoku. Nasze funkcje widoku importują te moduły. Testujemy te moduły "poza funkcją widoku" zwykłymi unittestami.


Oto typowa struktura.

some_big_product/ 
|-- __init__.py 
|-- settings.py 
|-- urls.py 
|-- logging.ini 
|-- other_global_files.py 
|-- an_app_1/ 
| |-- __init__.py 
| |-- urls.py 
| |-- models.py 
| |-- views.py 
| |-- tests.py <-- the generic Django testing 
| |-- app_specific_module.py 
| |-- app_specific_package/ 
| | |-- __init__.py 
| |-- test_app_specific_module.py <-- unittest 
| |-- test_app_specific_package.py 
|-- generic_module.py 
|-- generic_package/ 
| |-- __init__.py 
|-- tests/ 
| |-- test_this.py 
| |-- test_that.py 
| |-- test_all.py <-- not always practical 
|-- scripts/ 
    |-- run_tests.sh 
+0

Hmm, to może odpowiedzieć na inne pytanie, które mam. Jak zarządzać strukturą katalogów podczas dodawania innych modułów w hierarchii projektu/aplikacji django? –

+0

Dzięki! To bardzo pomaga. –

+0

Jak działa test_all.py? Zakładam, że chciałbym umieścić wszystko w jednym dużym TestCase.TestSuite, a następnie uruchomić. W ten sposób wszystkie statystyki testów (podania i niepowodzenia) są agregowane na końcu na końcu. Nie mogę się zdecydować, czy powinienem dostosować program Django do "testu manage.py", aby uruchomić dodatkowe unittests, czy też napisać swój własny tester najwyższego poziomu, który zawiera testy jednostkowe Django. –

2

django.test.client powinien mieć wszystko, czego potrzeba do podstawowych testów jednostkowych widoku. Bardzo lubię też twill i selenium do testowania pełnego stosu.

0

Możesz wypróbować tddspry - zbiór pomocników do testowania Django z testami ukośnymi i skośnymi. Nos ma również wtyczkę zasięgu, która generuje ładne raporty zasięgu.