Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [OOP][TDD][BDD] Algorytm a jego testowalność
Riggs
post 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?
Go to the top of the page
+Quote Post
Crozin
post 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
Go to the top of the page
+Quote Post
destroyerr
post 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.
Go to the top of the page
+Quote Post
Riggs
post 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.
Go to the top of the page
+Quote Post
Pyton_000
post 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.
Go to the top of the page
+Quote Post
lukaskolista
post 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).
Go to the top of the page
+Quote Post
destroyerr
post 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...
Go to the top of the page
+Quote Post
Pyton_000
post 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 biggrin.gif Tak to jest jak się nie odświeża stron haha.gif
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 29.03.2024 - 00:11