django: unittest

Django jest pisane w pythonie, python jak każdy porządny język obsługuje testy jednostkowe. A więc Django również. Dzisiaj przedstawię po krótce jak wygląda sprawa z testami w Django. Rozprawkę oprę o unittesty z tego prostego powodu, że podobają mi się bardziej niż doctesty. Nie znaczy to, że są lepsze po prostu służą do testowania innych przypadków, nie są pythonic ale ładnie obiektowe i ja je wolę po prostu.

Załóżmy, że masz model reprezentujący wyniki rzutów kostką do gry, do modelu jest dodana metoda sprawdzająca czy wynik jest parzysty czy nie.

from django.db import models

class Kostka(models.Model):
    wynik = models.IntegerField()
    osoba = models.CharField(max_length = 10, default = 'Anonim')

    def _sprawdz_liczbe(self):
        if (wynik % 2):
            return 'Parzysta'
        else:
            return 'Nieparzysta'

    test_wyniku = property(_sprawdz_liczbe)

Na tym modelu chcemy wykonać następujące testy:

  • Tworzenie obiektu (pole ‘wynik’ nie posiada wartości domyślnych)
  • Tworzenie obiektu z wartością domyślną
  • Test parzystości wyniku

Wszystkie testy dobrze trzymać w osobnym pliku, który nota bene jest tworzony wraz z projektem, plik tests.py znajduje się w katalogu aplikacji. Jest to wygodne i pozwala w łatwy sposób odnaleźć wszystkie testy w danej aplikacji. Zaczynamy od importów oraz stworzenia klasy testu.

import unittest
from aplikacja.app.models import Kostka

class KostkaTestCase(unittest.TestCase):

Następnym krokiem jest przeładowanie metody setUp() w celu stworzenia zmiennych lub obiektów odpowiadających naszym wymaganiom. Jak w pythonie i tutaj możliwe jest przeładowanie metod tearDown(), runTest() i suite() ale nie jest to konieczne. W opisywanym przypadku tworzone są trzy właściwości które posłużą później do tworzenia obiektów; rzutu parzystego, nieparzystego, zwykłego rzutu oraz anonimowego rzutu testującego wartość domyślną.

class KostkaTestCase(unittest.TestCase):
    def setUp(self):
        self.osoba = 'Michal'
        self.liczba_parzysta = 4
        self.liczba_nieparzysta = 5

Teraz czas na przygotowanie testów. Na pierwszy ogień idzie test tworzenia obiektu z podanymi obiema wartościami: osoba i wynik. Test powinien przejść bez żadnych problemów.

class KostkaTestCase(unittest.TestCase):
...
    def test_tworzenie_obiektu(self):
        rzut = Kostka.objects.create(self.liczba_parzysta, self.osoba)
        self.assertTrue(rzut)
        self.assertEqual(rzut.wynik, 4)
        self.assertEqual(rzut.osoba, 'Michal')

Następny test to sprawdzenie czy pole osoba przyjmuje wartość domyślną.

class KostkaTestCase(unittest.TestCase):
...
    def test_wartosci_domyslnej(self):
        rzut_anonim = Kostka.objects.create(self.liczba_parzysta)
        self.assertTrue(rzut_anonim)
        self.assertEqual(rzut_anonim.osoba, 'Anonim')

Kolejny test i ostatni, którego kod zaprezentuję to test parzystości. Drugi test jest analogiczny i nie widzę potrzeby umieszczania kodu. W tym przypadku nie testujemy czy obiekt został stworzony ponieważ jest to w poprzednich testach.

class KostkaTestCase(unittest.TestCase):
...
    def test_parzystosci(self):
        rzut_parzysty = Kostka.objects.create(self.liczba_parzysta)
        self.assertEqual(rzut_parzysty.test_wyniku, 'Parzysty')

To wszystkie potrzebne testy, w tym momencie można je uruchomić i sprawdzić czy nasze testy lub model są poprawne. Do wykonania tego służy znany wszystkim manage.py.

./manage.py test app

Jeśli wszystko pójdzie dobrze to powinien ukazać się następujący listing, jeśli nie to opis błędu jest na tyle jasny (czasem stworzony przez nas), że szybko można poprawić test lub model.

----------------------------------------------------------------------
Ran 4 tests in 0.009s

OK
Destroying test database 'default'...

Jak widać jest to łatwe i przyjemne oraz w pełni zgodne z Pythonem. Koniec, wszystkim życzę 100% skuteczności wykonywanych testów.

0 Responses to “django: unittest”


  • No Comments

Leave a Reply




Performance Optimization WordPress Plugins by W3 EDGE