Wpis z mikrobloga

@Ginden: Zależy od definicji „błędu”.

Tzn, traktuj TDD jako sposób na pisanie „specyfikacji kodu”, nie pisz nawet jednej linii kodu bez specyfikującego zachowanie testu.

W efekcie kod zachowuje się dokładnie jak tego sobie życzysz (nie ma błędów). Być może będą błędy projektowe, ale nie będzie błędu w kodzie, bo wyspecyfikowałeś pewne zachowania i w każdej chwili możesz zweryfikować, że są one działające.

Pozostają więc jedynie błędy projektowe (czyli np założenie, że
@MacDada: Nieprawda. Dziękuję dobranoc :).

Nawet przy TDD nie ustrzeżesz się błędów w kodzie, bo i w teście możesz popełnić błąd/nie wziąć czegoś pod uwagę. Finalnie będzie jeszcze gorzej, bo będziesz miał błąd, który nie wywala testu - będziesz uważał, że jest ok.
Nawet przy TDD nie ustrzeżesz się błędów w kodzie, bo i w teście możesz popełnić błąd/nie wziąć czegoś pod uwagę.



@KotoFan: Błędu w kodzie mieć nie będziesz – będziesz miał błąd w specyfikacji. Tzn robiąc TDD mówisz czego oczekujesz od kodu.

Jeśli oczekujesz za mało lub oczekujesz rzeczy, których nie powinieneś, to oddzielna bajka. Przechodzący testy kod zachowa się jednak poprawnie, wedle oczekiwań.
@MacDada:

Kwestia sporna. TDD ma bardzo wiele zalet, ale ma także dość sporo wad. Jak choćby ta, że w praktyce #it specyfikacja zmienia się przez pierwsze tygodnie od początku implementowania (tak, teoria mówi co innego, ja mówię o praktyce) i jak zaczynasz od testów, to potem okazuje się, że połowa z nich jest nieaktualna.

TDD jest świetne, jak doskonale wiesz co robisz i jak dziedzina, w której piszesz jest w 100%
@MacDada: Nie do wszystkiego jesteś w stanie napisać testy pokrywające każdy edge case.

Por.

_R
. Niemal niemożliwe jest napisanie testów pokrywających wszystkie edge case do takich funkcjonalności jak np.:

*

_R.isValidVariableName
*

_R.getInternalClass
*

_R.indirectEval
@MacDada: Na świecie istniała jedna organizacja która robiła bezbłędny kod. Grupa zajmująca się pisaniem oprogramowania dla promów kosmicznych. Prawie bezbłędny. Ale u nich każda linjka programu kosztowała dziesiątki a nawet setki tysięcy dolarów.
@plushy: Artykuł, który podrzuciłeś mówi dokładnie to o czym piszę: że oprogramowanie jest tak dobre, jak jego specyfikacja.

Proces TDD jest właśnie sposobem na uniknięcie błędów w kodzie – piszesz czego wymagasz od kodu, a potem implementujesz to. W każdej chwili możesz sprawdzić czy kod spełnia reguły „formalnej specyfikacji”, jaką jest kod testujący.

I tak jak pisałem wcześniej, „jeśli oczekujesz za mało lub oczekujesz rzeczy, których nie powinieneś, to oddzielna bajka.”
specyfikacja zmienia się przez pierwsze tygodnie od początku implementowania


@Ragnarokk: I właśnie po to jest TDD, żebyś po zmianie wymagań mógł bezpiecznie zmienić implementację. TDD daje Ci pewność, że zmienisz tylko to co jest od Ciebie wymagane, a wszystko inne będzie dalej działać bez zarzutu.

jak zaczynasz od testów, to potem okazuje się, że połowa z nich jest nieaktualna.


TDD = Test Driven Development, nie piszesz nowego kodu dopóki nie masz
Nie do wszystkiego jesteś w stanie napisać testy pokrywające każdy edge case.


@Ginden: Zgadza się, dlatego pisałem:

Zależy od definicji „błędu”.


Dlatego nie twierdzę, że można wyeliminować wszystkie błędy w aplikacji – twierdzę, że można wyeliminować błędy w kodzie aplikacji. Że implementacja będzie bezbłędna – w zakresie jej specyfikacji (testów ;-)).

Przy okazji TDD/BDD realnie przyczynia się do zmniejszenia liczby błędów także w aplikacji – bo wymaga zastanowienia się nad różnymi
@Ginden: http://pl.wikipedia.org/wiki/Odchylenie_standardowe#Odchylenie_a_obserwacje_dalekie_od_.C5.9Bredniej

Wszystko to statystyka i prawdopodobieństwo. Trzeba dążyć do 100% pokrycia, ale na pewno się tego nie osiągnie.

Ogólnie TDD wydaje mi się bardzo spoko, ale moje doświadczenie z tym polega tylko na kilku ćwiczeniach.

Ogólnie jeżeli piszesz w TDD, to twój kod jest testowalny i gotowy na refaktoring. W dowolnym momencie - nawet przy zmianie założeń.

W końcu TDD zbliża cię zawsze do celu i funkcjonalności, czyli traktowanie klas
Trzeba dążyć do 100% pokrycia


@patrolez:

Na ostatniej konferencji na której byłem był cały wykład o tym, że wcale nie.

@MacDada:

Zależy jak bardzo się wszystko zmieni. Jak zmienią się tylko wartości, to masz rację. Jak przełożony nagle powie, że zmieniamy całą architekturę i ma być gotowe z końcem tygodnia, to już większy problem ( ͡° ͜ʖ ͡°)

Ogólnie mam wrażenie, że traktujesz TDD/BDD jako jedyną
@Ragnarokk: dążyć != osiągnąć. W TDD ogólnie większość kodu zostanie pokryta.

Chodzi o współtworzenie testów i kodu produkcyjnego, a nie pokrywanie już istniejącego kodu.

Wtedy kod produkcyjny weryfikuje testy i testy weryfikują kod produkcyjny.

Tak się składa, że właśnie Uncle Bob testuje i pisze z TDD.

W sumie, to jego doświadczeniem się inspiruję :P
@patrolez:

Trochę się rozmijamy w zrozumieniu nawzajem. TDD jest bardzo dobre, tylko mówię, że nie jest to zawsze i uniwersalnie najlepsze rozwiązanie. Sam korzystam, kiedy mogę. Natomiast chodzi mi o to, że są w pracy zawodowej sytuacje, że ta idea nie do końca spotyka się z praktyką. Taki Uncle Bob chyba nie ma nad sobą przełożonych, którzy mu mówią, że coś musi być zrobione na wczoraj, więc może rozwijać swoje oprogramowanie
@Ragnarokk: Mógłbym się znów szerzej rozpisać, ale podsumuję to tak: temat nie dotyczy szybkości wykonania projektu, systemu zarządzania (bo szef) czy też grania w ruletkę (tu się raczej nie #!$%@?, więc nie testuję).

TDD sprawia, że kod jest niezawodny.

Niesie za sobą koszta i o tym nie dyskutuję. Aczkolwiek widziałem opinie (i badania z doświadczenia firm), że koszta pisania z TDD są mniejsze niż koszta wynikające z niepisania TDD. Ale nadal
@MacDada:

Na dłuższą metę koszta mogą być jak najbardziej mniejsze przy użyciu TDD, tutaj nie mam wątpliwości. Maintainowanie zbugowanego kodu jest kosztowne i #!$%@?ące. Początkowo, przy samym starcie są mniejsze, po latach się powinno spokojnie zamortyzować i dać zysk.

W sprawie niezawodności - w testach mozna popełniać błędy jak w każdym innym miejscu. Niezawodna jest tylko śmierć :)