Wpis z mikrobloga

Zaczęłam trochę ćwiczyć testy jednostkowe. Napisałam sobie wczoraj grę - te słynne connect four. Dzisiaj zaczęłam klepać do tego testy jednostkowe. Mam prośbę do Mirków z #programowanie i z #java aby rzucili okiem i ewentualnie powiedzieli co robię źle/dobrze. Nie chciało mi się narazie całego projektu wrzucać, tylko jedną klasę Board. Jest to na tyle trywialny i autonomiczny kod, że chyba nikt nie będzie miał problemu z rozczytaniem. Klasa z Testem pod spodem.

klik
  • 33
@ZasilaczKomputerowy:
- czemu wszystko jest public/protected?

- testy powinny być rozdzielone, tj. tworzysz 2 metody testowe, jedną dla column, jedną dla field, i obie oznaczasz jako @Test
- metoda setColumn nie rzuca wyjątków, skąd zatem w testach bloki try-catch?
- pętle i asercje w pętlach nie są dobrym pomysłem przy testach jednostkowych - ciężko się to debugguje
- w tych testach ogólnie za dużo się dzieje, można je najprawdopodobniej rozbić na
@kisi3l:

shouldTestSetColumnMarkForPlayerA brzmi lepiej? Nie ma się co bać rozległych nazw.

To. Długie nazwy streszczające obiekt testu danej metody są świetną konwencją. Z jakiś powodów wszyscy z którymi robiłem jakiś projekt na studiach bali się jej stosować.
@kisi3l: Pytania/polemika:

- czemu wszystko jest public/protected?

Gdzie?
1. W testach:
a nie musi być?
2. W kodzie programu:
wszystkie metody pblic są używane gdzieś na zewnątrz w innych klasach. Pola protected są protected bo być może klasa będzie rozszerzana.

metoda setColumn nie rzuca wyjątków, skąd zatem w testach bloki try-catch?

A gdzie w testach jest setColumn w try-catch?

pętle i asercje w pętlach nie są dobrym pomysłem przy testach jednostkowych
Pytam o testy. Resztę to pisałam wczoraj po dwóch piwach, żeby mieć co testować, nie patrzeć na to bo nie ma to nic do rzeczy.


@ZasilaczKomputerowy: doceniam, że piszesz testy zanim podjęłaś pracę w zawodzie, niewielu programistów może się tym pochwalić. Ale z takim podejściem za daleko nie zajedziesz.

Nie da się dobrze przetestować tragicznie napisanego kodu. Do dobrych unit testów potrzebujesz SOLID, a drugie magiczne pojęcie to piramida testów. Fowler,
@ZasilaczKomputerowy: Rób mniejsze i bardziej opisowe metody testowe.

Np masz metodę getField, która ma trzy ścieżki działania:

1. x >= WIDTH => leci wyjątek
2. y >= HEIGHT => leci wyjątek
3. x zwracana jest wartość

Tym samym powinnaś mieć trzy metody testowe:

1.
testGetFieldThrowsWhenXOutOfBounds
2.
testGetFieldThrowsWhenYOutOfBounds
3.
testGetFieldReturnsFieldMarker

BTW, co jak
x lub y będą liczbami ujemnymi? Jeśli walidujesz czy wartość nie wykracza poza boarda, to -5` raczej też wykracza,
@ZasilaczKomputerowy: Wygeneruj sobie pokrycie kodu testami – znajdziesz fragmenty, które jeszcze nie masz przetestowane.

A tak w ogóle to TDD: pisz testy i kod jednocześnie. Nie dopisuj testów do już istniejącego kodu, bo jest duża szansa, że coś w testach pominiesz, będą nieadekwatne lub będą sprawdzały nie do końca to co „twórca miał na myśli”.

Tzn czasem trzeba dopisać testy do istniejącego kodu, ale chodzi mi, żebyś zainteresowała się dodatkowo TDD
@ZasilaczKomputerowy: Metody testujące, tak samo jak kod produkcyjny (testowany) powinny być krótkie i opisujące siebie. Generalnie (prawie) wszystkie reguły czystego kodu obowiązują także dla testów. Mniejszą uwagę przykładamy do duplikacji, bo testy mają stanowić „przykłady użycia”.

Lepiej więc trochę więcej duplikacji, ale za to ważne, żeby była jasna struktura testu – jak przygotowujesz klasę, jak ją używasz, co oczekujesz.