Test Driven Development (TDD) a commity

Test Driven Development (TDD) a commity
NO
  • Rejestracja:ponad 2 lata
  • Ostatnio:11 dni
  • Postów:135
0

Zastanawiam się, jak powinny wyglądać commity jeśli robi się TDD. Piszę sobie teraz pet projekt do zarządzania wydatkami i póki co moje commity wyglądają w ten sposób, że najpierw dodaje puste unit testy, potem ich implementacje a na końcu implementacje danego ficzera:
image

edytowany 5x, ostatnio: Nofenak
KamilAdam
  • Rejestracja:ponad 6 lat
  • Ostatnio:3 dni
  • Lokalizacja:Silesia/Marki
  • Postów:5505
2
Nofenak napisał(a):

Zastanawiam się, jak powinny wyglądać jeśli robi się TDD. Piszę sobie teraz pet projekt do zarządzania wydatkami i póki co moje commity wyglądają w ten sposób, że najpierw dodaje puste unit testy, potem ich implementacje a na końcu implementacje danego ficzera:

W sensie rozwalasz innym osobom mastera/maina? WIem iż tych innych osób nie ma, ale jakby były to by master/main był rozwalony i niedałoby się bić skompilować?


Mama called me disappointment, Papa called me fat
Każdego eksperta można zastąpić backendowcem który ma się douczyć po godzinach. Tak zostałem ekspertem AI, Neo4j i Nest.js . Przez mianowanie
Yarilo
może wrzucać na swojego brancha przecież
KamilAdam
Za załączony obrazku wrzuca na dev (develop?)
Yarilo
no jak nie ma innych osób to można wrzucać na deva, też by mi się nie chciało wrzucać rzeczy na feature branch jeśli jestem jedyną osobą w projekcie
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 10 godzin
  • Lokalizacja:Koszalin
  • Postów:10094
0
Nofenak napisał(a):

Zastanawiam się, jak powinny wyglądać commity jeśli robi się TDD. Piszę sobie teraz pet projekt do zarządzania wydatkami i póki co moje commity wyglądają w ten sposób, że najpierw dodaje puste unit testy, potem ich implementacje a na końcu implementacje danego ficzera:

Z punktu widzenia TDD, w ogóle nie musisz używać gita, jak nie chcesz, więc rób co chcesz.

Ale zerknijmy na wady i zalety jakie taki styl pracy może mieć.

Zalety (dla piszącego kod):

  • Zmusza do pisania testów najpierw, i to akurat jest dobre.

Zalety (dla zespołu):

  • Żadne

Wady:

  • Sztucznie podnosi ilość commitów na conajmniej dwa sposoby:
    • Po pierwsze, każdy commit jest 2x (bo osobno test, i osobno implementacja)
    • Po drugie - w normalnym cyklu TDD na wytworzenie jednego feature'a napisałbyś między 10-50 nowych testów, i odpowiednią ilość implementacji. Chcąc przed każdym testem robić commit, wyszło by Ci ich 20-100
  • W historii są commity, na której jeśli ktoś zrobi checkout to testy nie przechodzą (to jest moim zdaniem mega słabe)
  • Ciężko jest pracować z taką historią - jak zrobisz merge albo rebase, to pliki z testami najpewniej nie będą mieć konfliktów, ale pliki z implementacją już tak - więc point of failure nie będzie na testach, tylko na tym drugim commicie - może to prowadzić do bardzo tricky sytuacji.
  • Może zachęcać do pisania dwóch testów na raz, commit, i potem implementacja (i wtedy się TDD trochę psuje).
  • Nie po każdym teście zmiany się nadają do integrowania się z nimi, nawet jak praktykujesz TDD; więc nie po każdym teście jest sens robić push.
  • Robisz pulla, i dostajesz 100 commitów od kogoś - macie konflikt w jednej z nazw. Co robisz? Rozwiązujesz konflikt 100x? Jedyny sposób jaki można sobie z tym poradzić to chyba tylko git rerere.
edytowany 9x, ostatnio: Riddle
obscurity
  • Rejestracja:około 6 lat
  • Ostatnio:około 10 godzin
4

Ale wiesz że nie musisz robić commita po każdym save? Git ma się nijak do TDD, nie powinieneś commitować kodu który się nie kompiluje. Raczej nie potrzebujesz też wrócić do commita który ma testy bez implementacji więc to zupełnie bez sensu.

Odpowiedź na pytanie "Zastanawiam się, jak powinny wyglądać commity jeśli robi się TDD":

tak samo jak zawsze


"A car won't take your job, another horse driving a car will." - Horse influencer, 1910
KamilAdam
  • Rejestracja:ponad 6 lat
  • Ostatnio:3 dni
  • Lokalizacja:Silesia/Marki
  • Postów:5505
3
obscurity napisał(a):

Ale wiesz że nie musisz robić commita po każdym save? Git ma się nijak do TDD, nie powinieneś commitować kodu który się nie kompiluje. Raczej nie potrzebujesz też wrócić do commita który ma testy bez implementacji więc to zupełnie bez sensu.

Odpowiedź na pytanie "Zastanawiam się, jak powinny wyglądać commity jeśli robi się TDD":

tak samo jak zawsze

Zastanawiam się czy to wszystko co robi OP nie jest po to żeby pokazać iż robi się TDD, no bo jak masz wydewelopowany feature to nie wiesz czy testy były pierwsze czy feature. No chyba iż zachowasz mnóstwo commitów które będę dokłądnie to pokazywać. Tylko w zasadzie co co? Żeby móc wpisać sobie do CV iż ma sie dowód na to iż zrobiło się projekt w TDD?


Mama called me disappointment, Papa called me fat
Każdego eksperta można zastąpić backendowcem który ma się douczyć po godzinach. Tak zostałem ekspertem AI, Neo4j i Nest.js . Przez mianowanie
KE
No właśnie może to jest powód, ale tutaj też można oszukiwać, bo to nie problem napisać wszystko, a potem scommitować osobno testy i implementację + ewentualnie zmienić datę. Więc historia tutaj niczego nie udowadnia.
MarekR22
Moderator C/C++
  • Rejestracja:ponad 17 lat
  • Ostatnio:4 minuty
4

Ja preferuje commity, które są zawsze zielone. chodz o to, żeby git bisect miał więcej szans na powodzenie.
Nie znaczy to jednak, że robię commit co każdy cykl TDD. Raczej w jednym commit jest parę cykli TDD.

Poza tym, pytanie jest jaką macie politykę mergowania PR do master?

  • po prostu merge
  • squash merge - tarci się detale commitów i wychodzi jeden commit jeden feature
  • rebase fast forward (nie lubię, bo nie widać jasno, gdzie w historii zaczyna się jeden feature, a kończy poprzedni)
  • rebase + merge no-fast-forward (ja preferuję to).

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 10 godzin
  • Lokalizacja:Koszalin
  • Postów:10094
0
MarekR22 napisał(a):

Poza tym, pytanie jest jaką macie politykę mergowania PR do master?

  • po prostu merge
  • squash merge - tarci się detale commitów i wychodzi jeden commit jeden feature
  • rebase fast forward (nie lubię, bo nie widać jasno, gdzie w historii zaczyna się jeden feature, a kończy poprzedni)
  • rebase + merge no-fast-forward (ja preferuję to).

To ostatnie to się chyba nazywa "bow-shape" history, nie?

Ja preferuję "rebase fast forward", bo nie wydaje mi się że historia zmian w kontroli wersji odpowiada funkcjonalnościom. Funkcjonalności się na siebie nakładają, plączą z bugfixami, refaktorami, etc. Chyba nie da się osiągnąć korelacji "commit <=> funkcjonalności".

edytowany 1x, ostatnio: Riddle
obscurity
  • Rejestracja:około 6 lat
  • Ostatnio:około 10 godzin
2

Ja się zastanawiam czy osoby które tak dbają o historię commitów kiedykolwiek z tego skorzystali? Ja osobiście nigdy nie przeglądałem historii w ten sposób commit po commicie, historia jedynie mi się przydaje do namierzenia jiry i dyskusji o jakiejś zmianie, szczytem wykorzystania gita jak dla mnie było zrobienie cherry-picka (np jako hotfixa z aktualnej wersji do starej wersji którą supportujemy) co zdarzyło się jakieś może 10 razy w moim życiu.
Czy faktycznie macie tak zawiłe w utrzymaniu projekty że historia musi być czysta i jakie są scenariusze w których to robi wam jakąkolwiek różnicę? Czy chodzi po prostu o porządek dla porządku?

Miałem w zespole "purystę gita" który spędził dwa dni na "przepisywaniu historii" po zmergowaniu dwóch repo żeby jakoś wyglądała i osobiście dla mnie to były dwa zmarnowane dni robocze, ale może czegoś nie rozumiem.


"A car won't take your job, another horse driving a car will." - Horse influencer, 1910
MarekR22
Moderator C/C++
  • Rejestracja:ponad 17 lat
  • Ostatnio:4 minuty
2
obscurity napisał(a):

Ja się zastanawiam czy osoby które tak dbają o historię commitów kiedykolwiek z tego skorzystali?

Naprawdę nigdy nie korzystałeś z git blame / annotate?
Często jak nie wiem skąd się wziął dany kod, to patrzę w historię i dobry commit message bardzo pomaga.
Szczególnie jak trzeba sprawdzić, czy fix nie wprowadził innego bug-a.

Poza tym odpowiadam za Continues Integration i jak trzeba wycofać jąkąś zmianę, to dobra historia bardzo to ułatawia.

Poza tym jak wiadomo kiedy bug się pojawił, patrzenie w historię ułątwia zlokalizowania, jaka zmiana coś zepsuła.

Fakt nie korzysta się z tego często, ale to jest jak z czarnymi skrzynkami w samolocie.
Dopóki wszystko jest w porządku to jest to zbędny sprzęt/funkcjonalność, ale jak już problem jest to lepiej, żeby czarna skrzynka zawierała użyteczne informacje, a nie śmietnik.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 2x, ostatnio: MarekR22
obscurity
  • Rejestracja:około 6 lat
  • Ostatnio:około 10 godzin
4
MarekR22 napisał(a):

Naprawdę nigdy nie korzystałeś z git blame / annotate?

no przecież właśnie napisałem że tylko do blame mi to potrzebne, a to jak wyglądają commity przed czy po i w jaki sposób został zmergowany branch to mi nie robi różnicy, do wycofywania zmian faktycznie najwygodniej mieć zesquashowane commity, ale to praktycznie to samo, squash niby przeszkadza w cherry picku ale ile razy w życiu się zdarzyło że wycofuje się zmianę albo kopiuje częściowo?
Wydaje się że jedynie "rebase fast forward" może zrobić bałagan bo ciężko to cofnąć


"A car won't take your job, another horse driving a car will." - Horse influencer, 1910
edytowany 4x, ostatnio: obscurity
KE
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 13 godzin
  • Postów:684
4

że najpierw dodaje puste unit testy, potem ich implementacje a na końcu implementacje danego ficzera

Ale przecież nie o to chodzi w TDD, zaprezentowane podejście nie ma sensu niezależnie od systemu kontroli wersji. Przecież w TDD piszesz (w teorii) minimalny test który nie przechodzi (red), potem dopisujesz fragment kodu który ten test poprawia (green) a potem ewentualnie czyścisz (refactor). I to powtarzasz do skutku, ale po kawałku. Jeśli chcesz najpierw napisać wszystkie testy dla twojego expenses crud, a potem całą implementację, i to zawrzeć w dwóch commitach, to to nie jest TDD.

Już (minimalnie) więcej sensu miałoby commitowanie każdego kroku red-green-refactor, ale to w średniej wielkości funkcji miałbyś dziesiątki commitów. To można oczywiście robić na luzaka w Gicie (bo branche są lokalne i nie trzeba się nimi chwalić światu), i może miało by to sens w projekcie solo, ale w czymkolwiek realnym gdzie pracuje >2 osoby to też nie ma sensu.

edytowany 1x, ostatnio: kelog
LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:4 minuty
  • Postów:8423
0

image

Problem w tym, że te 2 pośrednie commity to są WIP (work in progress).

Add empty unit tests for expenses crud - czyli coś tam zacząłeś robić, spoko, ale t
Implemented unit tests for expenses crud - to już nie jest spoko, bo napisałeś testy, które failują. Czyli na tym stanie projekt może się nie zbudować, jeśli warunkiem zbudowania będą wszystkie testy na zielono. Tego typu testy powinny mieć jakiś skip ustawione, żeby test runner je sobie pominął.
Implemented expenses crud - to jest dopiero ficzer.

Czyli chcesz zrobić commitowanie na raty, co sprowadza dodatkowy bałagan. Ficzer jest koncepcyjnie całością (kod produkcyjny + testy), a nie że testy osobno, a osobno implementacja (no i nie do końca na tym polega TDD). Ktoś popatrzy na ostatniego commita i pomyśli a gdzie testy do tego?.

Tak samo potem powiedzmy, że rozbudujesz tego CRUDa. I bardziej elegancko byłoby zrobić commit, gdzie masz od razu wszystkie potrzebne zmiany: zmiany w kodzie produkcyjnym + dodatkowe testy (albo zmiany w istniejących testach).

Z drugiej strony jeśli piszesz projekt samemu, to możesz sobie commitować jak ci wygodnie. Chociaż jeśli miałbym w ogóle dzielić tego CRUDa na kilka commitów, to już wolał podzielić po kolejnych ficzerach (gdzie w każdym commicie byłby kod produkcyjny + testy do kolejnej mniejszej rzeczy):

Kopiuj
Add delete for CRUD
Add update for CRUD
Add remove for CRUD
Add create for CRUD
Initial

to też byłoby bliższe TDD, które przecież też wcale nie polega na napisaniu wszystkich możliwych testów, a potem implementacji, tylko raczej się przeplata:
test -> implementacja -> test -> implementacja -> test -> implementacja


edytowany 4x, ostatnio: LukeJL
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 15 godzin
  • Lokalizacja:Wrocław
3
Nofenak napisał(a):

Zastanawiam się, jak powinny wyglądać commity jeśli robi się TDD. Piszę sobie teraz pet projekt do zarządzania wydatkami i póki co moje commity wyglądają w ten sposób, że najpierw dodaje puste unit testy, potem ich implementacje a na końcu implementacje danego ficzera:
image

Zasadniczo, można commitować kod na trzy sposoby:

  1. Cały ficzer na raz.
  2. Każdy bajt oddzielnie.
  3. Dowolna opcja między 1. a 2.

Co więcej, nie trzeba się trzymać raz wybranego schematu na zawsze.
Po prostu wybierz sobie jak Ci pasuje.

Git daje wolność tworzenia, wolność eksperymentowania, porzucania pomysłów w celu zastąpienia ich nowymi, i wracania do tych porzuconych, gdy nowe okażą się gorsze.
Nie rozumiem, czemu ludzie z własnej woli chcą sobie wymyślać jakieś ograniczenia, typu: trzeba commitować, gdy zrobi się coś, a nie zrobi się czegoś, albo nie można commitować, jeśli testy nie przechodzą, albo projekt się nie kompiluje. Absurdalne, piramidalne bzdury, w ten sposób tylko utrudnia się sobie życie.

Althorion
Widziałem repo ze squashami po każdej wersji. Bisectowanie tego to była czysta przyjemność, ale — niestety — są tacy, którzy z tych trzech sposobów commitowania kodu wybierają czwarty (czy może — zerowy)…
Althorion
Nie no, miałeś commity, ale z kilkunastoma ficzerami do kupy.
somekind
Aaa, no to tego faktycznie nie przewidziałem. Ale w takim wypadku, to nie rozumiem po co w ogóle kontrola wersji.
somekind
BTW - wszystkie repa w moim zespole są squashowane, nawet nie da się inaczej. :)
bagietMajster
  • Rejestracja:ponad rok
  • Ostatnio:około 13 godzin
  • Postów:436
0
obscurity napisał(a):

Ja się zastanawiam czy osoby które tak dbają o historię commitów kiedykolwiek z tego skorzystali? Ja osobiście nigdy nie przeglądałem historii w ten sposób commit po commicie, historia jedynie mi się przydaje do namierzenia jiry i dyskusji o jakiejś zmianie, szczytem wykorzystania gita jak dla mnie było zrobienie cherry-picka (np jako hotfixa z aktualnej wersji do starej wersji którą supportujemy) co zdarzyło się jakieś może 10 razy w moim życiu.
Czy faktycznie macie tak zawiłe w utrzymaniu projekty że historia musi być czysta i jakie są scenariusze w których to robi wam jakąkolwiek różnicę? Czy chodzi po prostu o porządek dla porządku?

Miałem w zespole "purystę gita" który spędził dwa dni na "przepisywaniu historii" po zmergowaniu dwóch repo żeby jakoś wyglądała i osobiście dla mnie to były dwa zmarnowane dni robocze, ale może czegoś nie rozumiem.

Ja kiedyś robiłem raport comitow jednego z programistów który narobił syfu i szefostwo chciało żeby wykazać jak. Wtedy pelne gitflow mi pomogło bo mogłem wygodnie porobić screeny i wrzucić w docx i dopisać swoje wynurzenia na ten temat. Natomiast nigdy poza tym jednym przypadkiem przez ostatnie 5 lat mojej kariery nikt inny nie skorzystał z tej historii w projektach w których byłem. Co lepsze to gdybyśmy nie mieli gitflow to by nic nie zmieniło bo szefo chciał tylko screeny syfiastych miejsc a nie jak do tego doszło.

Zresztą sama historia nie ma za bardzo wpływu na projekt, po kilku latach rzeczy są zrobione tak jak są i trzeba się z tym pogodzić i wprowadzić zmianę na bazie tego co jest a nie dumać i myśleć że 2 lata temu było tak a rok temu tak.

Samo ttd to w sumie jakiś fancy sposób developmentu oparty na mchu i paproci. A jego najzabawniejsza podstawa jest fakt że przy unitach istnieje przekonanie o ich prawidłowości i braku bugów. Bo jak to tak unit test może mieć błąd? Skoro nie umiemy pisać kodu bez bugów to testów też nie. Nie ma znaczenia czy pierwsze jest jajko czy kura jak jajko nie ma białka a kura ma raka mózgu. TDD dla mnie jest mniej wygodny niż standardowe podejście i możliwy do wykonania praktycznie tylko przy nowych ficzerach więc w może połowie mojej pracy.

To co robisz z comitami to poniżej krytyki. Zrób sobie skrypt żeby Ci comitował co 5 min, ma to tyle samo sensu co to co robisz. Robisz comit dopiero jak masz kod który się minimalnie kompiluje a najlepiej to nie rozwala testów żeby pipe nie świecił się na czerwono.

TL DR
TTD to sojowa metoda stosowana przez twitterowych krzykaczy.


Praktyczna implementacja TDD zaczyna się od ciebie.
FA
Testowanie kodu, to nie problem jaka i kury, tylko zawoalowany problem stopu. Nie da się tego zrobić dobrze, a nawet jak zrobisz dobrze to nigdy nie będziesz miał pewności że na pewno jest dobrze. Jedynym wyjątkiem są mooooooccnnooo skończone problemy.
obscurity
czemu tego "syfu" nie wyłapano na code review?
bagietMajster
to wynikało z patologicznego podejścia że CR było do "przehandlowania" czyli klepałeś komuś CR w ciemno w zamian za to samo :)
LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:4 minuty
  • Postów:8423
2
bagietMajster napisał(a):

przy unitach istnieje przekonanie o ich prawidłowości i braku bugów.

Nikt rozsądny tak nie twierdzi. Testy badają tylko to, co jego asercje. A w momencie pisania nie zawsze można wykryć wszystkie przypadki brzegowe, które powinny być pokryte asercjami.

Efektem TDD nie jest to, że się dostarcza bezbłędny kod, tylko że się dostarcza kod przetestowany. Więc wiele zależy od seniority kogoś kto pisze takie testy. Ile jest w stanie przewidzieć edge case'ów.

A samo TDD jako praktyka nie jest wystarczające do łapania edge case'ów. TDD jest dość liberalne i polega na tym, że pisze się failujący test, a potem tylko tyle implementacji, żeby test przeszedł na zielono np. napisana w TDD funkcja do obliczania silni mogłaby w efekcie wyglądać tak:

Kopiuj
function factorial() {
   return 6;
}


assert.strictEqual(factorial(3), 6);

(zakładając, że ktoś najpierw napisałby asercję, a potem funkcję).

I to może być problemem. Samo pisanie w paradygmacie TDD nie gwarantuje, że kod będzie działać w różnych przypadkach. Potrzeba jeszcze programisty, który będzie umiał określić, jakie asercje należy napisać, żeby sprawdzić poprawność czegoś.

Ale to nie znaczy, że TDD jest słabe. To po prostu sposób działania, którego końcowy efekt zależy od umiejętności/doświadczenia/wysiłku danego programisty.


edytowany 2x, ostatnio: LukeJL
bagietMajster
Czyli tak samo jak napiszemy testy do kodu. Celem tez jest dostarczenie przetestowanego kodu.
KE
W TDD nie chodzi tylko o testy, wręcz można poczytać opinie, że napisane testy są tylko produktem ubocznym. Drugą zaletą jest to, że próbujesz użyć swój kod, zanim zostanie napisany. Prowadzi to zwykle do lepszego API.
WeiXiao
@kelog: dokładnie, chodzi o lepszy API design. Ale jeżeli ktoś zaczyna projektować API od designu, no to ta wartość TDD zaczyna się tracić
KE
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 13 godzin
  • Postów:684
1

możliwy do wykonania praktycznie tylko przy nowych ficzerach

Dla mnie zawsze w praktyce było dokładnie odwrotnie, przy zmianach w istniejącym kodzie, a zwłaszcza przy naprawianiu bugów, TDD sprawdzało się świetnie. Dodajesz test, który udowadnia, że dany bug występuje, a potem poprawiasz buga. No ale to trzeba też mieć dyscyplinę, sama metodyka niewiele pomoże jak masz zespół krudowców dodających nullchecki gdzie popadnie (złe wspomnienia).

KamilAdam
  • Rejestracja:ponad 6 lat
  • Ostatnio:3 dni
  • Lokalizacja:Silesia/Marki
  • Postów:5505
1

Nie rozumiem, czemu ludzie z własnej woli chcą sobie wymyślać jakieś ograniczenia, typu: trzeba commitować, gdy zrobi się coś, a nie zrobi się czegoś, albo nie można commitować, jeśli testy nie przechodzą, albo projekt się nie kompiluje. Absurdalne, piramidalne bzdury, w ten sposób tylko utrudnia się sobie życie.

Jak pchasz na feature branch niedziałający kod to nie ma problemu. Gorzej jak pchasz taki kod na mastera/maina


Mama called me disappointment, Papa called me fat
Każdego eksperta można zastąpić backendowcem który ma się douczyć po godzinach. Tak zostałem ekspertem AI, Neo4j i Nest.js . Przez mianowanie
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 15 godzin
  • Lokalizacja:Wrocław
0
bagietMajster napisał(a):

Skoro nie umiemy pisać kodu bez bugów to testów też nie.

To dość oczywiste, pozostaje pytanie - co jest bardziej prawdopodobne:

  1. błąd w jednym miejscu;
  2. ten sam błąd, a do niego 10 odwrotnych błędów niwelujących działanie tego pierwszego?

TDD dla mnie jest mniej wygodny niż standardowe podejście

Z moich obserwacji wynika, że "standardowe podejście" to "nie mamy testów, bo manager nie pozwala". Nie nazwałbym tego wygodnym.

KamilAdam napisał(a):

Jak pchasz na feature branch niedziałający kod to nie ma problemu. Gorzej jak pchasz taki kod na mastera/maina

Zakładam, że to taka podstawowa zasada higieny, że pracujemy na jakiejś swojej gałęzi, a nie na masterze.

LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:4 minuty
  • Postów:8423
2
bagietMajster napisał(a):

Skoro nie umiemy pisać kodu bez bugów to testów też nie.

Z reguły testy mają mniej logiki i abstrakcji niż kod produkcyjny. Robisz jakiś setup, a potem sprawdzasz asercjami, czy się zgadza. Pisanie testów zwykle nie jest zbyt wymyślne. Struktura pliku z testami też jest raczej dość sztywna. Można niby zrobić zawsze buga w testach, np. sprawdzać w asercji nie tę wartość, co trzeba, ale to będzie raczej odizolowany w jakimś kejsie bug.

Kod produkcyjny natomiast pisze się bardziej swobodnie oraz używając większej liczby abstrakcji na raz, czy robiąc bardziej skomplikowane przekazywanie danych z jednego miejsca na drugie, jak również często trzymając mutowalny stan w środku systemu. W takich warunkach łatwo coś przeoczyć i zrobić buga, a bug ten często będzie nie wiadomo gdzie i może wpływać na pozostałe części systemu. Dlatego przydają się testy, które to sprawdzą.

Można powiedzieć, że kod produkcyjny to jak bycie pisarzem, a pisanie testów to jak bycie korektorem. Pisarz wymyśla treść, a korektor sprawdza, czy są zachowane wszystkie reguły. Chociaż oczywiście zarówno pisarz może zrobić błąd, jak i korektor może tego błędu nie dostrzec.


edytowany 1x, ostatnio: LukeJL
bagietMajster
Tylko idąc za twoim przykładem to w TDD robi się pierwsze korektę a potem piszę tekst :P
LukeJL
faktycznie. Ale cóż, widocznie ta metafora ma swoje ograniczenia.
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 10 godzin
  • Lokalizacja:Koszalin
  • Postów:10094
4

@bagietMajster Myślę że niechcący ktoś Ci przekazał mylne pojęcie tego czym TDD jest. TDD nie obiecuje programów bez bugów ani nie obiecuje "udowodnienia 100% poprawności".

TDD to po prostu technika projektowa i testowa, która może też służyć do specyfikacji wymagań, i wytwarzania oprogramowania inkrementacyjnie. Jest również pomocna w wytwarzaniu lepszego designu. I w zasadzie tyle.

Nikt kto praktykuje TDD nie twierdzi że to pomaga wymyślić programy "w 100% poprawne".

LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:4 minuty
  • Postów:8423
3
bagietMajster napisał(a):

TDD dla mnie jest mniej wygodny niż standardowe podejście i możliwy do wykonania praktycznie tylko przy nowych ficzerach więc w może połowie mojej pracy.

Trzeba sobie zdać sprawę również z tego, że nawet stosując TDD niekoniecznie trzeba tego używać do wszystkiego.
TDD najlepiej się sprawdza do pisania bibliotek czy niezależnych modułów, które mają działać w przewidywalny sposób (i wiadomo jaki).

Z kolei grzebanie w większej istniejącej apce (która się zachowuje dynamicznie i jej działanie jest uzależnione od różnych rzeczy) i dodawanie różnych ficzerów, które integrują ileś rzeczy ze sobą (więc ciężko to testować w izolacji), nie musi być dobrym kejsem dla TDD. Szczególnie jeśli robi się coś z GUI, np. frontend w React.

Myślę, że zamiast psioczyć na TDD, to po prostu można nie używać tej metodyki tam, gdzie jest niewygodna, a używać w tych miejscach, gdzie to ma sens.


bagietMajster
  • Rejestracja:ponad rok
  • Ostatnio:około 13 godzin
  • Postów:436
3
LukeJL napisał(a):

Myślę, że zamiast psioczyć na TDD, to po prostu można nie używać tej metodyki tam, gdzie jest niewygodna, a używać w tych miejscach, gdzie to ma sens.

Z tego co się orientuję to chyba po to jest forum? żeby wyrazić swoją opinie na dany temat,? (a to że ta opinia nie idzie zgodnie z linią partii to inna sprawa)
Uważam że TDD jest sztuką dla sztuki. Ja nikomu nie bronię w tym robić, po prostu wyraziłem swoją opinie na ten temat.


Praktyczna implementacja TDD zaczyna się od ciebie.
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 10 godzin
  • Lokalizacja:Koszalin
  • Postów:10094
1
bagietMajster napisał(a):

Uważam że TDD jest sztuką dla sztuki. Ja nikomu nie bronię w tym robić, po prostu wyraziłem swoją opinie na ten temat.

A piszesz testy? Nie z TDD, tylko czy piszesz testy w ogóle np. testy jednostkowe, już po fakcie?

CosherJeepersCreepers
a jak napisze, że nie to co? Zrugasz go jako nieodpowiedzialnego Inżynjerra Łoprogramowanja?
WeiXiao
  • Rejestracja:około 9 lat
  • Ostatnio:około 9 godzin
  • Postów:5143
2
Riddle napisał(a):
bagietMajster napisał(a):

Uważam że TDD jest sztuką dla sztuki. Ja nikomu nie bronię w tym robić, po prostu wyraziłem swoją opinie na ten temat.

A piszesz testy? Nie z TDD, tylko czy piszesz testy w ogóle np. testy jednostkowe, już po fakcie?

Tak, po fakcie - gdy już mam przyzwoitą pewność np. co do ostatecznego designu API oraz poznałem potencjalne problemy wynikające z danego podejścia.

Przecież nie będę pisał testów podczas prototypowania, lol.

edytowany 1x, ostatnio: WeiXiao
GO
  • Rejestracja:około rok
  • Ostatnio:5 miesięcy
  • Postów:358
0

Im bardziej skomplikowany problem tym testy są ważniejsze, przy testowaniu czy coś zostało dodane do bazy to widać gołym okiem obyło by się bez testów, ale jak jest jakiś algorytm i wydaje się, że dobrze rozwiązuje problem to przy szczególnych przypadkach może się wywalić, a testy są proste bo wiesz jak coś powinno się zachować, a nie jak to rozwiązać, a algorytm automatyzujący tą czynność często może być bardzo skomplikowany.

WeiXiao
ale co to ma do TDD?
GO
A co ty się tak czepiasz? nie ma żadnych technicznych problemów na forum do rozwiazania.
FA
  • Rejestracja:ponad 5 lat
  • Ostatnio:około 3 godziny
  • Lokalizacja:warszawa
  • Postów:309
2

Im bardziej skomplikowany problem tym testy są ważniejsze, przy testowaniu czy coś zostało dodane do bazy to widać gołym okiem obyło by się bez testów, ale jak jest jakiś algorytm i wydaje się, że dobrze rozwiązuje problem to przy szczególnych przypadkach może się wywalić, a testy są proste bo wiesz jak coś powinno się zachować, a nie jak to rozwiązać, a algorytm automatyzujący tą czynność często może być bardzo skomplikowany.

A potem masz dzisiątki lub setki endpotów z których każdy ma dodać naście wartości do bazy i nagle robi sie problem nie do ograniecie manulanie, bo samą skalą Cie zabije.
Niigdy nie byłem jakimś fanem intensywnego testowania, a raczej wprost przeciwnie. Ale po tym jak hobbystycznie czy ostatnio w pracy, trafiły sie takie ilości danych że nie da sie ich sprawdzić ręcznie, mój swiato pogląd został brutalnie z weryfikowany. To nie musi być żaden skomplikowanych algorytm, prosta czynność wykonana 1000 razy na 1000 róznych danych, i edcasy same sie pojawiają.

GO
  • Rejestracja:około rok
  • Ostatnio:5 miesięcy
  • Postów:358
0

Manualnie testować nie ma co sprawdzać strata czasu, jak automatycznie testy wychwycą, tylko zachowanie trzeba zdefiniować, a nad tym czasem trzeba pomyśleć, zastanowić się bo zwykle trzeba różne sposoby zakończenia funkcji/algorytmu sprawdzić jakieś brzegi.

somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 15 godzin
  • Lokalizacja:Wrocław
0
bagietMajster napisał(a):

Z tego co się orientuję to chyba po to jest forum? żeby wyrazić swoją opinie na dany temat,? (a to że ta opinia nie idzie zgodnie z linią partii to inna sprawa)
Uważam że TDD jest sztuką dla sztuki. Ja nikomu nie bronię w tym robić, po prostu wyraziłem swoją opinie na ten temat.

Tak, a inni mają prawo uznać Twoją opinię za bezsensowną, a także obalać argumenty, które podałeś. (Co jest o tyle łatwe, że postanowiłeś walczyć z chochołem.)
Wolność wyrażania opinii działa w dwie strony.

(Żeby nie było, sam TDD na ogół nie stosuję.)

bagietMajster
  • Rejestracja:ponad rok
  • Ostatnio:około 13 godzin
  • Postów:436
0
Riddle napisał(a):
bagietMajster napisał(a):

Uważam że TDD jest sztuką dla sztuki. Ja nikomu nie bronię w tym robić, po prostu wyraziłem swoją opinie na ten temat.

A piszesz testy? Nie z TDD, tylko czy piszesz testy w ogóle np. testy jednostkowe, już po fakcie?

Tak, piszę testy jednostkowe po tym jak zrobię zadanie.


Praktyczna implementacja TDD zaczyna się od ciebie.
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 10 godzin
  • Lokalizacja:Koszalin
  • Postów:10094
1
bagietMajster napisał(a):

A piszesz testy? Nie z TDD, tylko czy piszesz testy w ogóle np. testy jednostkowe, już po fakcie?

Tak, piszę testy jednostkowe po tym jak zrobię zadanie.

Czyli piszesz testy już po napisaniu feature'a?

To mam pytanko do Ciebie:

  • Jaki masz code coverage'a?
  • Ile z tego code coverage jest puste, a ile faktycznie pokrywa kod? (tak że testy failują jak znajdą buga w tym miejscu)
  • Jak często podczas pisania aplikacji uruchamiasz ją żeby sprawdzić czy działa nadal wporzo?
  • Jak często, kiedy natrafiasz na miejsce trudne do przetestowania, po prostu stwierdzasz "aa, dobra" i zostawiasz to miejsce nieprzetestowane?
  • Czy można się spodziewać że 80% Twoich testów to są testy jakichś helperów, a faktyczne mięcho Twojej aplikacji jest nieprzetestowane?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.