[OOP][TDD][BDD] Algorytm a jego testowalność |
[OOP][TDD][BDD] Algorytm a jego testowalność |
2.02.2016, 09:25:00
Post
#1
|
|
Grupa: Zarejestrowani Postów: 162 Pomógł: 13 Dołączył: 16.06.2007 Ostrzeżenie: (0%) |
Witam,
chciałbym poruszyć mam nadzieję ciekawe zagadnienie. Otóż ostatnio pisałem sobie dość rozbudowany algorytm i chciałem wykonać go za pomocą metodyk TDD/BDD i narzędzi PHPSpec i PHPUnit. Mam jednak co do niego kilka wątpliwości. Weźmy za przykład algorytm który kiedyś robiłem i wiem, że działa dobrze. Koncepcja też jest chyba ok. SudokuSolver - klasa, która jako konstruktor przyjmuje tablicę 9x9 częściowo wypełnioną. Posiada metodę solve() dostępną publicznie która zwraca albo rozwiązanie w postaci tablicy 9x9 bez wartości null (czyli całą wypełnioną) albo rzuca wyjątkiem jeśli nie ma rozwiązania. Wiadomo, że metodę w metodzie solve() trzeba wywołać częściowe metody np. sprawdzające rozwiązanie, np. checkColumn, checkRow, check3x3. Zakodowałem je jako metody prywatne bo nie widzę potrzeby możliwości wywołania ich poza ciałem klasy - z resztą solve ma dać wynik. Jak podejść do pisania testów takiej klasy? W PHPSpec mógłbym tylko odwoływać się do solve() i oczekiwać wyniku. w PHPUnit od biedy można zrobić ReflectionClass ale to chyba nie o to chodzi w testowaniu... Chciałbym mieć możliwie największe pokrycie kodu testami, tak żeby mieć pewność że algorytm działa prawidłowo. Jak testować poszczególne etapy - czy np checkColumn zostało wywołane x razy itp.. Czy może bez wystawienia metod jako public nie mam szans na dobre przetestowanie kodu? |
|
|
2.02.2016, 09:51:47
Post
#2
|
|
Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) |
Pomijając szczególne przypadki, metody niepubliczne nie powinny być testowane bezpośrednio. W Twoim przypadku:
1. Powinieneś mieć serię testów, która dla danych wejściowych sprawdza czy zwrócony wynik jest taki jak przewidywano (tablica A -> tablica B, bądź tablica A -> wyjątek). W sumie będziesz miał kilkanaście/dziesiąt testów, a właściwie zestawów testowych. 2. Możesz rzucić sobie okiem na wyniki pokrycia kodu testami w celu przygotowaniu takiego zestawu danych wejściowych by przetestować wszystkie wewnętrzne mechanizmy. Ten post edytował Crozin 2.02.2016, 09:52:20 |
|
|
2.02.2016, 11:22:16
Post
#3
|
|
Grupa: Zarejestrowani Postów: 879 Pomógł: 189 Dołączył: 14.06.2006 Skąd: Bytom Ostrzeżenie: (0%) |
Jeżeli chcesz testować różne warunki sprawdzania to może wydziel sprawdzanie do osobnych obiektów. Wtedy do obiektu rozwiązującego załadujesz sobie kolekcję takich "sprawdzaczy", ułatwione masz wtedy testowanie tego co chcesz.
|
|
|
2.02.2016, 11:43:13
Post
#4
|
|
Grupa: Zarejestrowani Postów: 162 Pomógł: 13 Dołączył: 16.06.2007 Ostrzeżenie: (0%) |
@destroyerr jest to jakiś pomysł, pewnie tylko prosta klasa rozrośnie się do dość dużych rozmiarów ale to jest dobry pomysł żeby testować każdy komponent.
|
|
|
2.02.2016, 11:57:26
Post
#5
|
|
Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) |
Możesz wydzielić "Valiataors" np. RowValidator, ColValidator, SquareValidator. Wszystkie na jakimś wspólnym interfejsie.
W klasie bazowej podajesz tylko listę Validatorów i odpalasz jeden po drugim. Wtedy testujesz każdy validator oddzielnie i na koniec całość jako komponent. |
|
|
2.02.2016, 15:11:53
Post
#6
|
|
Grupa: Zarejestrowani Postów: 872 Pomógł: 94 Dołączył: 31.03.2010 Ostrzeżenie: (0%) |
Cytat w PHPUnit od biedy można zrobić ReflectionClass ale to chyba nie o to chodzi w testowaniu... Czemu niby nie?Co powiesz na MockBuilder https://phpunit.de/manual/current/en/test-doubles.html Działa podobnie do biblioteki Reflection o ile na niej nie bazuje (nie znam kodu MockBuildera). |
|
|
2.02.2016, 21:42:23
Post
#7
|
|
Grupa: Zarejestrowani Postów: 879 Pomógł: 189 Dołączył: 14.06.2006 Skąd: Bytom Ostrzeżenie: (0%) |
@Pyton_000 No co Ty nie powiesz...
|
|
|
2.02.2016, 22:46:46
Post
#8
|
|
Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) |
Hahaha Tak to jest jak się nie odświeża stron
|
|
|
Wersja Lo-Fi | Aktualny czas: 29.03.2024 - 00:11 |