Witaj,
Testy nie są trudne, ale IMO lepiej je zrozumiesz na czystym języku.
Spróbuje ci to wytłumaczyć.
Dla przykładu stwórzmy sobie funkcję liczącą średnią.
def arithmetic_mean(*args):
return sum(args) / len(args)
Myślę że jej działanie jest oczywiste. Teraz chcemy sprawdzić czy aby na pewno działa. Więc tak na początku sprawdźmy sobie czy zadziała w standardowym przypadku - czyli z liczbami naturalnymi. Aby to zrobić użyjmy konsoli Pythona.
>>> arithmetic_mean(1, 2, 3, 4)
>>> 2.5
Ok działa mamy to co chcieliśmy. Teraz spróbujmy z liczbami ujemnymi.
>>> arithmetic_mean(-8, -1, -19, -8)
>>> -9.0
Też działa, no to teraz sprawdźmy mieszanymi liczbami.
>>> arithmetic_mean(-19, 10, 54, 21)
>>> 16.5
Ok, a co się stanie kiedy podamy tylko jedną liczbę ?
>>> arithmetic_mean(32)
>>> 32.0
Ponownie zadziałało.
Teraz wyobraźmy sobie że zamiast naszej małej funkcji mamy skomplikowaną funkcję liczącą np. 100 lini, wykorzystującą 10 innych funkcji. Jasne możemy sprawdzać czy działa ręcznie, ale wraz z rozrastaniem się projektu będzie to coraz dłużej trwało i trwało. Zmiana działania jednej funkcji, może rzutować na resztę kodu. Bez testów szukanie przyczyny może być trudne, bądź możemy nie dostrzec błędu. Dzięki testom, nie musimy robić tego za każdym razem - po prostu odpalamy testy i widzimy czy wszystko działa. (pod warunkiem że testy zostały napisane dobrze)
Inne zastosowanie testów. Kod tego forum jest dostępny publicznie i każdy może wnieść swoją poprawkę itp. Gdyby nie zawierał testów, to dodając nową funkcjonalność mógłbym zepsuć coś co już działa. Kiedy testy istnieją to widzę, czy mój wkład nie zepsuje czegoś co wcześniej działało. Tak samo ważne jest aby mój kod posiadał testy. Przecież ktoś inny też może coś dodać, bez testów nie będzie zagwarantowane, że moja funkcjonalność będzie działać po modyfikacji.
Ok teraz czas na stworzenie testów.
import unittest
# Tworzymy klase do testowania naszej funkcji
class ArithmeticMeanTests(unittest.TestCase):
# Testujemy czy zadziała z liczbami naturalnymi
def test_positive_numbers(self):
numbers = [1, 3, 4, 5]
# assertEqual służy do sprawdzenia czy wartości są równe
# jeśli tak to test się powiedzie, w przeciwnym razie nie
self.assertEqual(
arithmetic_mean(*numbers),
3.25
)
# Restujemy ale dla liczb ujemnych
def test_negative_numbers(self):
numbers = [-1, -5, -19, -21]
self.assertEqual(
arithmetic_mean(*numbers),
-11.5
)
# Tutaj dla liczb całkowitych
def test_mixed_numbers(self):
numbers = [39, -21, 1, 0, 5]
self.assertEqual(
arithmetic_mean(*numbers),
4.8
)
# Tutaj dla tylko jednej liczby
def test_single_number(self):
self.assertEqual(
arithmetic_mean(129),
129
)
# Uruchamiamy testy
unittest.main()
Ćwiczenia:
-> dopisz testy testujące kod w przypadku ułamków
*-> napisz funkcję zamieniającą liczby z systemu dziesiętnego na szesnastkowy, nie zapomnij o testach
Spójrz jeszcze tu. Jeśli chodzi o Django to po zrozumieniu idei testowania, nie będziesz miał problemów. Poczytaj MDN i Oficjalny Tutorial.