Zanurkuj w Pythonie/Podsumowanie
Testowanie jednostkowe to bardzo silna koncepcja, która, jeśli zostanie poprawnie wdrożona, może zarówno zredukować koszty utrzymywania, jak i zwiększyć elastyczność każdego trwającego długo projektu informatycznego. Ważne jest, aby zrozumieć, że testowanie jednostkowe nie jest panaceum, Magicznym Rozwiązywaczem Problemów czy srebrną kulą. Napisanie dobrych przypadków testowych jest trudne, a utrzymywanie ich wymaga ogromnej dyscypliny (szczególnie w sytuacjach, gdy klienci żądają natychmiastowych poprawek krytycznych błędów). Testowanie jednostkowe nie zastępuje również innych form testowania, takich jak testy funkcjonalne, testy integracyjne czy testy akceptacyjne. Jest jednak wykonalne, działa, a kiedy już zobaczycie je w działaniu, będziecie się zastanawiać, jak w ogóle mogliście bez niego żyć.
W tym rozdziale poruszyliśmy wiele spraw; część z nich nie dotyczyła wyłącznie języka Python. Biblioteki do testowania jednostkowego istnieją dla wielu różnych języków, a ich używanie wymaga jedynie zrozumienia kilku podstawowych koncepcji:
- projektowania przypadków testowych, które są specyficzne, zautomatyzowane i niezależne
- pisania przypadków testowych przed napisaniem testowanego kodu
- pisania przypadków testowych, które uwzględniają poprawne dane wejściowe i spodziewają się poprawnych wyników
- pisania przypadków testowych, które uwzględniają niepoprawne dane wejściowe i spodziewają się odpowiednich niepowodzeń
- pisania i aktualizowania przypadków testowych przedstawiających błędy lub odzwierciedlających nowe wymagania
- bezwzględnej refaktoryzacji w celu poprawy wydajności, skalowalności, czytelności, utrzymywalności oraz każdej innej -ności, która nie jest wystarczająca
Po przeczytaniu tego rozdziału nie powinniście mieć również żadnych problemów z wykonywaniem zadań specyficznych dla języka Python:
- tworzeniem klas pochodnych po unittest.TestCase i pisaniem metod będących szczególnymi przypadkami testowymi
- używaniem assertEqual do sprawdzania, czy funkcja zwróciła spodziewaną wartość
- używaniem assertRaises do sprawdzania, czy funkcja rzuca spodziewany wyjątek
- wywoływaniem unittest.main() w klauzuli if __name__ w celu uruchomienia wszystkich przypadków testowych na raz
- uruchamianiem zestawu testów jednostkowych zarówno w trybie normalnym, jak i rozwlekłym