TDD - a rzeczywistość

TDD - a rzeczywistość
R1
  • Rejestracja:około 10 lat
  • Ostatnio:prawie 5 lat
  • Postów:208
0

Witam,

jestem w trakcie lektury "Mistrz czystego kodu" Robert C. Martin i napisał on:

//"1. Nie wolno napisać Ci nawet wiersza produktywnego kodu, jeżeli wcześniej nie napiszesz pasującego testu jednostkowego, który nie zostanie zaliczony.
2. Nie wolno Ci napisać więcej testu jednostkowego, niż jest konieczne, żeby test nie został zaliczony. Nieudana kompilacja też powoduje, że test nie jest zaliczony.
3. Nie wolno Ci napisać więcej produktywnego kodu, niż potrzeba, żeby aktualnie oblany test został zaliczony."
//

Czy w praktyce jak piszecie aplikacje jakiekolwiek to stosujecie się to tych trzech zasad zawodowo i prywatnie??

KA
nie stosuje się, bo uważam te zasady za głupie i oderwane od rzeczywistości
jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 2 godziny
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
3

W pracy praktycznie 100% ( wyjątki to jakis naprawdę stary kod, kóry ma zaraz umrzeć , generalnie jak do zakończenia działania czegoś jest mniej niż 2 miesiące - to można czasem olać testy).

W projektach domowych róznie:

  • czasem stosuje złośliwe "TDD (kreatywność w punkcie 3)" - generalnie nie do końca polecam wobec kolegów, bo się odbija czkawką - ale jako ćwiczenie lubię,
  • w Scali staram się czasem przepisać testy na typy (średnio mi to wychodzi),
  • mam taki projekt, w którym naprawdę nie wiem co robię - wtedy też nie piszę testów,
  • czasem olewam testy zupełnie - stosuję zasadę 2 miesięcy - testy mniej więcej po takim czasie się zwracają - jak jest strzał na kilka dni i masz gwarancję, że kod po dwóch miesiącach nie bedzie dalej utrzymywany , i nie będzie działał - to można testy oszczędzić,

Natomiast pisanie testów po implementacji jest bzdurą. Czasami jak mi ktoś w zespole powie, że wszystko działa i tylko musi teraz napisać testy -- to mówię, żeby tego nie robił. Te testy "po", już niczego nie wnoszą. Tak się zdarza, jak jest ktoś nowy, albo pracuje nad nową technologią i nie ogarnia jak w niej testować.
Natomiast absolutnie wymagam testów po zraportowanym bugu - był bug w kodzie - to najpierw test odtwarzający bug - potem fix. (Bug driven tests).
Takie testy są najbardziej cennne. Czasami to jest całkiem niezłe wyzwanie, jak był np. bug na współbieżności, czasem się niestety też nie da - niektóre Heisenbugi.
( no i nadal w roku 2016 nie mam testów do CSS- czyli wywali się layout - jak to przetestować? JavaScript , typescript natomiast testuje się nawet lepiej niż Javę).


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 2x, ostatnio: jarekr000000
Koziołek
BDT to jest piękne podejście, jeszcze jak podepniesz do tego storage i automaty, które potrafią na podstawie historii bugów zrobić regresję. Ile to baboli my w ten sposób w systemach rozliczeniowych wyłapaliśmy przy migracjach.
KA
BDT - to rzeczywiście ma sens
R3
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 2 lata
  • Postów:320
0

Mam wrazenie, ze jak ktos autorytarnie nie zarzadzi, ze najpierw testy pozniej implementacja to ludzie nie naucza sie w ten sposob pisac. Pozniej jest to 'wola programisty' i nikt juz nie robi TDD bo zwolennicy poddaja sie jak pozniej maja wszystko refaktoryzowac.

Moze TDD nie jest idealne ale jest jednak lekarstwem na wiele rzeczy.

  • porzadkuje kod, lepszy design
  • single responsibility
  • jest wiecej testow ;)
  • wieksza czytelnosc, nazwy testow mowia co ma robic kod
  • im dalej w las tym bardziej czas na testy sie zwraca
edytowany 2x, ostatnio: rav3n
R1
  • Rejestracja:około 10 lat
  • Ostatnio:prawie 5 lat
  • Postów:208
0

to wychodzi na to że ucząc się nowego języka powinno się jednocześnie przerabiać testowanie w nim jak i samą składnie języka? od kiedy "programuje" czy to w pascalu kiedyś czy c/c++ czy innym języku nigdy nie spotkałem ani książki ani kursu, która by poruszała "oba" problemy jednocześnie. A wydaje mi się (mogę się mylić) że ucząc się języka nabieramy jakiś przyzwyczajeń itp i potem wprowadzając do tego testy musimy uczyć się na nowo "pisania". Pozbyć się jakiś przyzwyczajeń itd.

jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 2 godziny
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
0
rav3n napisał(a):

Mam wrazenie, ze jak ktos autorytarnie nie zarzadzi, ze najpierw testy pozniej implementacja to ludzie nie naucza sie w ten sposob pisac. Pozniej jest to 'wola programisty' i nikt juz nie robi TDD bo zwolennicy poddaja sie jak pozniej maja wszystko refaktoryzowac.

U mnie to nie działało. To co działa to wyszkolenie managementu w temacie "dług techniczny".
A na programistów... jedynie manipulacja :-(


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 1x, ostatnio: jarekr000000
Wibowit
dług techniczny, a nie technologiczny
jarekr000000
@Wibowit - dzieki, poprawiłem
R3
Bez TDD moze moga pisac jacys bardzo doswiadczeni ludzie robiac POC. Ale na ogol kod bez TDD to masakra, robie zmiane, puszcam testy... Nic sie nie wywala. No i mam klasy, ktore sa serwisem, klientem i konwerterem na raz itp..
KA
Bez TDD moze moga pisac jacys bardzo doswiadczeni ludzie robiac POC bez przesady
R3
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 2 lata
  • Postów:320
0

Testy jednostkowe to must have. Im latwiej to robic w tecnologii X tym wiecej zyskuje w moich oczach.

Np. Golang.z dodatkowym libem jest bardzo spoko pod wzgledem testow i od razu mi zaplusowal w tym miejscu ;)

Latwo w internecie znajdziesz jak napisac prosty test w jezyku X.. Poczytaj o podejsciu TDD i zmus sie do pisania testow najpierw. Dobre IDE tez pomaga. Piszac test z metodami ktore nie istnieja i tworzysz puste lub rzucajace wyjatkami 'not implemented yet' generujac je z IDE. I zeby nie przeszedl Ci test bez implementacji czasem ;)

R1
  • Rejestracja:około 10 lat
  • Ostatnio:prawie 5 lat
  • Postów:208
0

to że testy są potrzebne wiem doskonale tzn rozumiem ich idee itp:) jakiś czas temu napisałem pewną aplikację na własny użytek (ma około 2000 linii kodu nie wiele no ale:) ) i właśnie się zastanawiam czy nie spróbować napisać tego jeszcze raz pisząc do tego testy. Tylko właśnie, uczyłem się cały czas np. javy ale bez JUnit np. bo przecież testy to nie tylko assertEquals przecież.

Przez chwilę przeszło mi przez myśl nawet napisanie testów do napisanej aplikacji... ale po chwili w mojej głowie pojawiało się inne rozwiązanie danego problemu i testy wymusiły by na mnie zmianę całego kodu.

LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:około 3 godziny
  • Postów:8414
0

TDD jest jak Vim.

  1. zupełnie inne programowanie, żeby skutecznie pracować z TDD/Vimem trzeba się nauczyć nowych nawyków, zanim się nauczymy, będzie to niewygodne
  2. TDD jak i Vim ma dużo zalet i często przyśpieszają pracę (TDD = szybka pętla zwrotna, ochrona przed regresją, łatwość refaktoringu, Vim = potęga edycji, inteligentne komendy itp.)

Jednak zarówno jeśli chodzi o TDD jak i Vim, to nie osiągnąłem biegłości w żadnym z nich, więc korzystam z niemodalnego edytora (teraz z Atoma, ale robię już własny), a kod piszę w ten sposób, że najpierw jest hakerka(make it work), potem jest przemyślenie architektury(make it right), i dopiero na tym etapie piszę testy (inaczej musiałbym przepisywać testy kilka razy, bo między pierwszą a drugą fazą często zmieniam API danego modułu).

Chociaż muszę się zgodzić, że do fiksowania bugów TDD bardzo dobrze się sprawdza:

Natomiast absolutnie wymagam testów po zraportowanym bugu - był bug w kodzie - to najpierw test odtwarzający bug - potem fix. (Bug driven tests).
Takie testy są najbardziej cennne.

Szybki feedback "czy już działa" oraz zabezpieczenie przed pojawieniem się tego samego buga w przyszłości.

Także TDD sprawdza się u mnie jeśli wiem co robię (zwykle jednak jestem jak ten pies w stanie nieważkości z napisem "I have no idea what I'm doing")


edytowany 2x, ostatnio: LukeJL
0

Ja tego trochę sobie nie wyobrażam. Przecież pisząc kod... nie wiemy jak on będzie jeszcze wyglądał. Czasami zdarza się 10 razy zmieniać sygnaturę jakiejś metody czy przerabiać jedną klasę... to jak ja mam przewidzieć jak kod ma wyglądać przed jego napisaniem? Bo tego wymaga ode mnie TDD.

spartanPAGE
  • Rejestracja:prawie 12 lat
  • Ostatnio:18 dni
0

Z TDD najpierw definiujesz zachowania, a potem je implementujesz.

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
5

@jarekr000000

Te testy "po", już niczego nie wnoszą

Ktoś chyba nigdy nie słyszał o czymś takim jak regresja albo o błędach zwiazanych z refaktoryzacją kodu. Serio czasem czytając twoje posty zastanawiam sie czy pracowałeś dłużej przy jakimś (starszym) projekcie w fazie utrzymania. Staż by sugerował że musiało tak być, ale to co piszesz nijak...
Oczywiście jeśli ktoś chce ocenić jak przydatne są testy w chwili ich napisania zaraz po implementacji to wartość jest zerowa, o ile programista nie jest idiotą i nie napisał niedziałajacego kodu. Ale wartość testów wychodzi znacznie później, kiedy ktoś zaczyna coś refaktorować, zmieniać technologię, migrować itd.

Natomiast absolutnie wymagam testów po zraportowanym bugu

Ja mam nadzieje ze to jest standard wszędzie ;)

@rav3n

  • porzadkuje kod, lepszy design

Nigdy nie widziałem żeby podejscie test-first wygenerowało lepszy kod. Z mojego dświadczenia wynika ze generuje taki sam.

  • single responsibility

Nie widzę związku.

  • jest wiecej testow
  • wieksza czytelnosc, nazwy testow mowia co ma robic kod
  • im dalej w las tym bardziej czas na testy sie zwraca

To samo można powiedzieć o pisaniu testów w ogóle, niezależnie od tego czy to TDD czy cokolwiek innego. Ty chyba próbujesz przeciwstawić tutaj "pisanie testów" od "niepisania testów".

Przecież pisząc kod... nie wiemy jak on będzie jeszcze wyglądał

I nie musisz, bo chodzi tu raczej o testowanie "zachowania" czy też taki blackbox test. Więc interesuje cię co funkcja robi a nie jak wygląda od środka. Wiec generalnie tylko sama sygnatura ma jakieśtam znaczenie, żebyś mógł to sobie wywołać w teście. To zresztą jest też potem takie trochę programowanie top-down. Tzn najpierw definiujesz sobie same sygnatury a potem dopiero zaczynasz wypełniać je implementacją.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
Zobacz pozostałe 2 komentarze
LukeJL
patrząc po sobie to muszę stwierdzić, że to złudna nadzieja. Ja jeśli piszę cały moduł na TDD, to tworzę w rezultacie o wiele gorszy kod, przeinżynierowany (bo zamiast napisać coś od A do B to robię naokoło, myśląc bardziej o ładnym pisaniu testów niż o rzeczywistym problemie), więc raczej nie przepadam za TDD jako główną metodą developerki.
LukeJL
Chociaż czasem pisząc TDD mogę coś przemyśleć, oczywiście, stosowanie TDD może dać pewien wgląd, spojrzeć na sprawy z innej perspektywy. Ale to wszystko zależy, to nie jest czarodziejska różdżka (wbrew temu co mówi Wujek Bob).
LukeJL
@rav3n TDD nie usunie problemów z kiepską architekturą, co najwyżej pozwoli na refaktoring bez bólu - ale jak programista jest kiepski, to nawet mając 100% pokrycia testów nie będzie umiał zrefaktorować kodu.
R3
TDD ma swoje wady, ale według mnie przynajmniej cokolwiek daje niż robienie wszystkiego na pałę ;) Poza tym nikt nie powiedział, że TDD jest takie łatwo proste przyjemne i remedium na wszystko. Ale nie powiedzialbym, ze to zawsze overdesign, ja takiego poczucia nie mialem ;)
R3
Myślę, że przede wszystkim nowicjuszom daje to trochę rozeznania w temacie.
AD
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 8 lat
  • Postów:67
0

Przy odpowiednio ekspresywnym systemie typów testy jednostkowe nie są potrzebne. Jako skrajne przykłady można podać np. Coq, w którym poprawność programu jest całkowicie weryfikowana podczas kompilacji, i języki dynamiczne, w których można pisać nieskończoność testów i nie mamy nigdy pewności że się wszystko nie posypie.

Albo inaczej mówiąc, im jest mniej możliwych rozwiązań danego problemu, tym mniej testów trzeba pisać, a typy ograniczają tą przestrzeń rozwiązań. Na przykład funkcja o sygnaturze (przykład w Scali):
def map[A, B](f: A => B, a: A): B

Ma tylko jedno możliwe rozwiązanie, dlatego nie ma sensu jej testować.

edytowany 1x, ostatnio: adwy
jarekr000000
Sądzę, że do tego zmierzamy. Widzę analogię z komentarzami. Obecnie wielu już się pogodziło z clean codem - komentarz to smród - zamiast komentować przepisz. Podobnie widze sprawę testów - na razie w obecnych jezykach i przy moim np. poziomie doświadczenia - ciężko jest mi coś zrobić "typami", ale warto próbować - powoli będzie się dało coraz więcej. Aż któregoś dnia ktoś napisze: testy to smród :-)
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

@adwy

  1. Coq to nie język programowania tylko system dowodzenia twierdzeń, wiec niejako z definicji to tam działa.
  2. Nie zgodzę sie że podana funkcja nie wymaga testu. Bo przecież nie trudno ją zepsuć zwracając sobie z niej losowy obiekt typu B, wcale nie będący wynikiem f(a). System typów ładnie "testuje" na przykład spinanie sie ze sobą modułów / interfejsów. Ale końcowa implementacja zwykle i tak wymaga testu bo gdzieś tam trzeba sprawdzić czy faktyczny wynik jest poprawny.

"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
jarekr000000
@Shalom "nie trudno ją zepsuć zwracając sobie z niej losowy obiekt typu B, wcale nie będący wynikiem f(a)" - tylko wtedy kiedy masz udostępnione konstruktory do A i B.
AD
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 8 lat
  • Postów:67
0
Shalom napisał(a):

Nie zgodzę sie że podana funkcja nie wymaga testu. Bo przecież nie trudno ją zepsuć zwracając sobie z niej losowy obiekt typu B, wcale nie będący wynikiem f(a).

Nie da się w ten sposób popsuć, bo nie wiesz czym jest B i w jaki sposób zwrócić jakiś losowy element tego typu.

Shalom napisał(a):

Ale końcowa implementacja zwykle i tak wymaga testu bo gdzieś tam trzeba sprawdzić czy faktyczny wynik jest poprawny.

Ale im więcej wynika z typowania tym mniej rzeczy trzeba zweryfikować. Przykładowo jeżeli wiemy że jakaś funkcja jako wynik powinna zwrócić listę z przynajmniej jednym elementem, to jeżeli zwróci NonEmptyList zamiast zwykłego List, to nie trzeba już pisać testu który to sprawdza.

Shalom
@adwy ale to się szybko skończy kodem w stylu https://github.com/EnterpriseQualityCoding/FizzBuzzEnterpriseEdition (chodzi mi o przerost formy nad treścią) ;) I wątpie żeby programowało się w taki sposób wygodniej. Wręcz przeciwnie. Będzie milion typów których nikt nie będzie mógł zapamiętać.
vpiotr
@Shalom: pewnie bardziej chodzi o typy definiowane w miejscu wymagania, np. enable_if w C++11: http://seanmiddleditch.com/c11-usage-of-stdenable_if-in-function-templates/
jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 2 godziny
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
0
Shalom napisał(a):

@jarekr000000

Te testy "po", już niczego nie wnoszą

Ktoś chyba nigdy nie słyszał o czymś takim jak regresja albo o błędach zwiazanych z refaktoryzacją kodu. Serio czasem czytając twoje posty zastanawiam sie czy pracowałeś dłużej przy jakimś (starszym) projekcie w fazie utrzymania. Staż by sugerował że musiało tak być, ale to co piszesz nijak...
Oczywiście jeśli ktoś chce ocenić jak przydatne są testy w chwili ich napisania zaraz po implementacji to wartość jest zerowa, o ile programista nie jest idiotą i nie napisał niedziałajacego kodu. Ale wartość testów wychodzi znacznie później, kiedy ktoś zaczyna coś refaktorować, zmieniać technologię, migrować itd.

Oj @Shalom - jak co nie pasuje do twojej wizji to musi być głupek pisał ... podoba mi się twój tok rozumowania.

Ale ciekawostka - od nastu lat najwięcej zarabiam właśnie na nekromancji - czyli utrzymaniu w ruchu - a nawet rozwoju - mniej lub bardziej starych systemów (choć ostatnio mam wrażenie, że 3 lata to już stary - ale powiedzmy, że obecnie np. tykam kodu mającego max 8 lat - gdzie pare pokoleń programistów się przewinęło... ;-)). Przy okazji: te "stare" systemy nawet lubię: tu są wyzwania :-).

Wnioski wyciągam na podstawie... pieniędzy - w działającym, rozwijanym systemie zawsze jest mnóstwo miejsc, które można poprawić - i trzeba priorytetyzować - co najbardziej się opłaca. Pisanie testów po implementacji uznałem już dawno za nic nie wnoszące - bo się zwykle nie wywalają.

A co w przypadku refaktoryzacji? no właśnie - jak ktoś taką robi na kodzie, który nie ma testów to właśnie jest moment zapłaty. Zanim się zacznie - trzeba napisać testy. Dokładnie tak samo w przypadku bugu.

Testy zrobione "zaraz po implementacji" i tak mam w całej masie, i jak to w testach robionych po -> wszystko jest na Mockito. Nawet po usunięciu implementacji potrafią nadal zakończyć się sukcesem :-) (A próba refaktoryzacji niezmiennie kończy się koniecznością jednoczesnej zmiany i kodu i testów... czyli totalnie bez sensu).


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 1x, ostatnio: jarekr000000
Zobacz pozostałe 6 komentarzy
Shalom
@jarekr000000 ale "przed pushem" wcale nie znaczy że pisze przed implementacją ;)
jarekr000000
@Shalom - jak ma zrypany design łamiący SRP, tony adnotacji dla kontenera i testy na Mockitach, a co gorsza testy postaci testMethodXY() - to widać, że było pisane po.
R3
teoretycznie to "po" coś takiego też nie powinno mieć miejsca ;)
jarekr000000
@rav3n - prawda, a z drugiej strony londynskie TDD też się kończy na Mockitach, więc faktycznie testy po, to nie jest warunek wystarczający ani nawet konieczny złego kodu
R3
@jarekr000000 mimo wszystko według mnie testy 'przed' prędzej działają, a londyńskie tdd mnie zastanawia ;]
M9
  • Rejestracja:prawie 10 lat
  • Ostatnio:prawie 6 lat
0

Ostatnio muszę pracować z systemem, którego nawet zbudowanie jest wyzwaniem. Nie używa ant ani maven. Nie jest nawet pakowany jako .jar. To jest czysta nekromancja: muszę zrozumieć live coding na Tomcat. Może uda się coś z tym zrobić. Wiele razy pracowałem z legacy kodem, ale tutaj jest bardzo trudno, ponieważ nic nie wiemy o systemie oraz robi to jeden mid (ja 3.5 lata doświadczenia z lagacy kodem) i jeden junior developer. Technologie scriptlet / JSP / servlet wszystko na metodach statycznych, większość logiki na widokach lub w procedurach składowanych (kilkadziesiąt parametrów). Nie ma mowy o testach. Najpierw trzeba jakoś odtworzyć proces deployowania projektu. Jedna firma już na tym poległa.

Może uda się przekonać kierownictwo do Selenium, ale nie ma budżetu na takie rzeczy.

edytowany 4x, ostatnio: margor90
H1
I rzucanie na to mida i juniora jest... normalne ? Budowanie projektu, continous integration i testy to chyba właśnie powinny być pierwsze kroki ;) Wszystko też kwestia czasu, ale przy czymś takim to raczej powinno założyć się, że będzie to czasochłonne.
jarekr000000
Własnie się do czegoś tak zabawnego zapisałem - pomagam naprawiać - tylko, że programistów jest 9, to projekt uniwersytecki i nikt nie miał za bardzo do czynienia z inżynierią oprogramowania (studenci różnych technicznych kierunków ale nie IT). Z tej perspektywy to nawet muszę powiedzieć, że system robią geniusze (i mają u mnie szacunek). Mimo to pare miesięcy pisania... i mają dokładnie jeden test: assertEquals( 2+2, 4) - nie żartuję.
M9
Ogólnie jestem korpo seniorem, ale w rzeczywistości midem (3.5 lata). Dawałem radę na takich projektach ale do 20k linii kodu. Ale tutaj po prostu brakuje wiedzy. Może dam radę jak zawsze: ale szykuje i tak zmianę pracy, bo IMO trochę mało zasobów i mam ochotę być w systemie rozwojowym (do tej pory pracowałem jako samodzielny deweloper na legacy projektach, ale JEE jest łatwe). Umiarkowanie chce mi się samemu z czymś takim bujać.
H1
Na start przydałyby się jednak większe zasoby ;)
R1
  • Rejestracja:około 10 lat
  • Ostatnio:prawie 5 lat
  • Postów:208
0

Chciałem odświeżyć trochę temat. Widzę kwestia TDD to kwestia dyskusyjna, jedni TDD stosują inni wręcz przeciwnie bo uważają to za stratę czasu itp.

mnie ten temat bardzo interesuje nadal i dlatego zakupiłem sobie książkę pt. "TDD Programowanie w Javie sterowane testami" Viktor Farcic i Alex Garcia i zastanawia mnie pewna kwestia wszędzie w sumie gdzie czytam o TDD napisali aby:

  • napisać test
  • odpalić test (wynik negatywny bo brak rozwiązania)
  • napisać rozwiązanie
  • odpalić test (wynik pozytywny)
  • refaktoryzacja kodu

a co w sytuacji kiedy projekt jest dosyć rozbudowany i same testy na przykład trwają po 5 min i więcej? domyślam się że to są niezbyt częste przypadki no ale na pewno się takie sytuacje zdarzają? w takiej sytuacji taki "szablon" na pewno nie przyśpiesza pisania kodu... czy się mylę?

Zobacz pozostały 1 komentarz
R1
nie nie widziałem, gdyż w moim zawodzie w czasie pisania "programu" nie ma czegoś takiego jak testy (bo kto widział testy jednostkowe w pisaniu programów do sterowników PLC:) ) Jednakże to nie zmienia faktu że chce się czegoś nauczyć:) Do tej pory piszę / pisałem tak jak Ty mówisz, zero testów. Te moje "projekciki" i bez testów działają więc żyć bez testów się da no ale...
R3
@karolinaa: trollujesz jak zwykle czy Ty tak serio?
Shalom
@rafal20-1988: oj żebyś ty się nie dziwił z tymi testami dla PLCków ;) Pisze programy które piszą programy na PLC i zapewniam że testy mamy. Ba, są ludzie którzy robią też narzędzia do formalnego testowania poprawności programów dla sterowników :)
R1
@Shalom dobra dobra ale pisząc program do maszyny testów już nie pisze chyba nikt (bynajmniej mi nie wiadomo o narzędziach do testowania "działania" maszyny:P
Shalom
No są zawsze jakieś test-benche w laboratorium ;) Ale z racji ze kody są generowane to trzeba się upewnić głównie że sam generator dobrze działa i że specyfikacja dla generatora ma sens.
spartanPAGE
  • Rejestracja:prawie 12 lat
  • Ostatnio:18 dni
0

Co do długich testów: raz, testy mają wykonywać się jak najkrócej, dwa, można odpalać tylko te, z którymi aktualnie pracujemy.

R1
w sumie o tym zapomniałem że testy można odpalać pojedynczo:) a np. pod koniec dnia odpalić wszystkie aby sprawdzić czy gdzieś indziej się nie namieszało:)
0

Według mnie TDD działa tylko jak większośc osób stosuje.

Samotny Rycerz Mocy TDD w projekcie z mojego doświadczenia zakopie się przy refaktoryzacji i braku co niektórych testów.

Teoretycznie z TDD i bez kod powinien być jakościowo podobny, ale ja takiego nie widziałem jeszcze.

R1
  • Rejestracja:około 10 lat
  • Ostatnio:prawie 5 lat
  • Postów:208
0

no dobra ale w TDD nie chodzi głównie o testy ale TDD ma na celu chyba jeszcze porządkowanie w głowie samego projektu, podejścia do niego. Nie wiem może się mylę bo sam osobiście nie mam z tym doświadczenia.

LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:około 3 godziny
  • Postów:8414
0

a co w sytuacji kiedy projekt jest dosyć rozbudowany i same testy na przykład trwają po 5 min i więcej?

Nie musisz wtedy odpalać co chwila wszystkich testów w całym projekcie, a jedynie test dla twojego modułu, co najwyżej przed commitem odpalisz sobie wszystkie testy dla pewności.

Tyle, że projekt musi być dobrze napisany i moduły muszą być w miarę niezależne od siebie tak, żeby faktycznie to miało sens (z kolei w źle napisanej apce moduły mogą być za bardzo powiązane ze sobą i zmiana w jednym pobocznym module może wtedy rozwalić apkę w 20 miejscach - wtedy faktycznie byś musiał wszystko odpalać...)


edytowany 1x, ostatnio: LukeJL
DQ
  • Rejestracja:prawie 10 lat
  • Ostatnio:6 miesięcy
  • Postów:141
0
rafal20-1988 napisał(a):

no dobra ale w TDD nie chodzi głównie o testy ale TDD ma na celu chyba jeszcze porządkowanie w głowie samego projektu, podejścia do niego. Nie wiem może się mylę bo sam osobiście nie mam z tym doświadczenia.

Można poniekąd stwierdzić, że testy to efekt uboczny całego podejścia do pisania aplikacji przy użyciu TDD. Głównym naciskiem ma być sam moment pisania testu. W ten sposób masz pewność, że później napisany kod, który przechodzi dany przypadek testowy robi dokładnie to co chcesz. Jest to sytuacja całkowicie przeciwna do pisania testu do istniejącego kodu. Wtedy praktycznie rzecz biorąc dostosowujesz test do kodu, a nie na odwrót - co de facto niewiele daje.

Jednakże tak jak już ktoś wspominał, jeśli tylko jedna osoba stosuje taką metodologię to zapewne nic z tego nie wyjdzie. Szczególnie jeśli zadania dodatkowo obejmują przykładowo naprawę bugów. Według mnie wtedy jest to nadmierna strata czasu, który mógłby być przeznaczony na coś innego.

Ogólnie to jak ze wszystkim - jeśli będziesz mądrze wykorzystywać metodologię to na pewno pomoże, jeśli będziesz ślepo podążać za wytycznymi to zapewne nie da żadnego zysku, a i może zaszkodzi.

Koziołek
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:3 dni
  • Lokalizacja:Stacktrace
  • Postów:6821
2
rafal20-1988 napisał(a):

a co w sytuacji kiedy projekt jest dosyć rozbudowany i same testy na przykład trwają po 5 min i więcej?

To znaczy, że jest do d**y napisany projekt i TDD go nie uratuje. Moim zdaniem istnieją pewne wyznaczniki tego, kiedy TDD nie ma szans zadziałać w ramach istniejącego projektu:

  • długo wykonujące się testy – to znak, że muszą być odpalane wedle zasady "wszystko albo nic", moduły jak i poszczególne mniejsze elementy kodu są od siebie silne zależne, testy wymagają wielu przygotowań m.in. stanu aplikacji. Testy jednostkowe zmutowały do jednostkowo-integracyjnych.
  • "nierówne" pokrycie testami – niektóre części są dobrze pokryte, a inne słabo. Te pokryte słabo zapewne ciężko przetestować, bo są skomplikowane i wymagają wielu zależności.
  • nie wiadomo jak napisać test – najprawdopodobniej wymagania nie są poprawnie zdefiniowane i kod będzie miał za zadanie przerzucenie odpowiedzialności na inne elementy systemu.
  • Większość istniejących testów była pisana post mortem – najprawdopodobniej są niekompletne.
  • Ciężko wydzielić podzbiór testów do wykonania – zależności, zależności :)

Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException
R1
  • Rejestracja:około 10 lat
  • Ostatnio:prawie 5 lat
  • Postów:208
0

@Koziołek: twierdzisz że testy nigdy nie będą się tak "długo" wykonywały? a co w sytuacji gdy aplikacja jest rozbudowana i samych testów jest 20k linii kodu?

Koziołek
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:3 dni
  • Lokalizacja:Stacktrace
  • Postów:6821
2

@rafal20-1988: 20k linii kodu testowego to mało. W ELIXIRze mieliśmy około 35k linii testów (JUnity - około 6k testów) i całość nie wykonywała się dłużej niż 2 minuty na CI. Dlaczego? Ponieważ na 8 rdzeniowej maszynie mogłem puścić wszystko równolegle. Dlaczego? Ponieważ testy były prawdziwymi testami jednostkowymi, czyli m.in. nie korzystały z bazy danych czy plików, odseparowane, nie współdzieliły zasobów.

Do tego oczyliście były też testy integracyjne, które szły około godziny, ale musiały przeorać dość duże zbiory danych.


Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)