--
pozdrawiam,
Michał Trzcinka
http://trzcinka.blogspot.com
No cóż, sam wyjaśniłeś. Programowanie ,,na pałę'' nie wróży nic dobrego.
Jeśli nie wiesz co piszesz w jaki sposób możesz być pewny, że twój
program będzie prawidłowo zachowywał się w każdej sytuacji? Fakt, że
twój kod się kompiluje a aplikacja się uruchamia i coś tam działa nie
oznacza bynajmniej, że działa poprawnie.
> Zdaję sobie sprawę, że wynika to z natury języka, który jest
> kompilowany, a nie interpretowany. Jednak czy są jakieś alternatywne
> podejścia zwiększające produktywność w Javie? Jakieś dynamiczne
> kontenery webowe, które bez problemu radzą sobie z wielokrotnym
> podmienianiem WARów bez konieczności restartu? Macie jakieś pomysły,
> doświadczenia w tym zakresie? A może macie jakieś własne sposoby na
> czekanie na kompilację/deployment? ;)
W teorii można takie rzeczy robić (np. http://www.zeroturnaround.com/)
ja jednak proponuję bardziej konserwatywne podejście. Nic nie zastąpi
przemyślenia tego co się robi. Lubię pisać np. cały dzień po to by
uruchomić wszystko w kilka minut przed wyjściem z pracy. Daje mi to
dodatkową satysfakcję i pomaga mi w utrzymaniu pewności, że wiem co robię.
Pozdrawiam,
Leonard
Można też tak skonfigurować tomcata, żeby nie deployować mu aplikacji
do jego katalogu webapps, tylko jakoś inaczej powiedzieć mu że ma taką
to a taką aplikację na takim kontekście, i skąd ma brać skompilowane
klasy. Dawno nie używałem, ale pamiętam że plugin sysdeo do eclipse'a
takie rzeczy potrafi.
Pozdrawiam
Paweł Stawicki
Każdy target można odpalić osobno albo całą serię.
Pozdrawiam Michał Pawluk
Paweł Stawicki pisze:
Tylko że właśnie to kasowanie, kompilowanie, pakowanie do wara itd. trwa...
Pozdrawiam
Paweł Stawicki
http://pawelstawicki.blogspot.com
--
pozdrawiam,
Michał Trzcinka
Nikt nie mówi, że trzeba kasować wszystko i kompilować od nowa. Ja
zrobiłem sobie skrypt dla Ant-a który używam z ew. drobnymi zmianami we
wszystkich projektach. Kompiluje tylko te klasy które się zmieniły a
następnie robię update wynikowego archiwum bez konieczności tworzenia go
od zera.
Wszystko jest w manualu dla Ant-a.
Pozdrawiam,
Leonard
No tak, ale kontener i tak musi to wynikowe archiwum rozpakować. Poza tym, kontenery różnie radzą sobie z aktualizowaniem
aplikacji w locie (taki Tomcat może tylko kilka razy a potem się wywala). Narzędzie, o którym wspomniałeś wcześniej (JavaRebel)
wygląda bardzo obiecująco, testowałem sobie chwilę i muszę przyznać, że jestem pod wrażeniem ;)
--
pozdrawiam,
Michał Trzcinka
http://tomcat.apache.org/tomcat-6.0-doc/config/context.html
Chodzi o atrybut reloadable. O ile pamiętam twórcy jetty obcieli ten
feature twierdząc że jest to security hole (problemy z naturą
classloaders) i choć jetty się świetnie osadza w innych narzędziach
(maven), to do "live webapplication development" nadaje się przez to
dosyć słabo. Choć są projekty które znalazły na to workaround - np.
cocoon.
http://cocoon.apache.org/2.2/maven-plugins/maven-plugin/1.0/1297_1_1.html
Jeśli używasz eclipse, to nie masz się o co martwić - po założeniu
nowego "Dynamic Web Project" wszystko działa "out of the box" tak jak
sobie tego życzysz i nawet wara będzie później z tego budować bez
żadnego anta czy mavena (dobre na początek). Jedyny minus - trzeba się
wpisać w pewną konwencję co do struktury katalogów w projekcie.
--
"Meaning is differential not referential"
kazik 'morisil' pogoda
http://www.xemantic.com/ http://blog.xemantic.com/
No nie koniecznie. Jeśli używasz go z JBossem, to robi eara za każdym
razem i go "publishuje". Ja właśnie przy pracy z jbossem zrobiłem
sobie zamiast eara katalog z rozszerzeniem .ear i w nim pliki z
rozszerzeniem jar/war i w nich linki. Działa super :)
Chciałbym stanowczo zaprotestować przeciwko plotkom jakoby unit testy
były rzeczą specyficzną dla Javy.
Niezależnie od wykorzystywanych narzędzi każdy duży, długo żyjący system
powinien być obłożony odpowiednią liczbą unit testów.
W szczególności w powyższym przypadku każdy poważny projektant systemu
powinien przewidzieć odpowiednią liczbę przypadków testowych w JWebUnit,
Cactusie, QuickTeście lub czymś podobnym.
--
Z powazaniem / Best Regards /
Mit freundlichen Gruessen / Meilleures salutations
Pawel Debski
Managing Consultant, e-mail: PDe...@econsulting.pl
Tel. 0048-504-766-316, 0048-22-730-2794
eConsulting Sp. z o. o. http://econsulting.pl
Kochanowskiego 3, Pruszkow, KRS 0000098514
NIP PL534-2194-317, kapital 150000PLN
Biuro W-wa: Ciolka 12/401, 0048-22-463-6357
O tym z kolei ja nie słyszałem TNXE6 stallman
To chyba tym lepiej? Czyż juzer nie jest zainteresowany tym jak działa
program, a nie co jest w środku?
> zdaniem razem z nimi powinny być tworzone
> testy funkcjonalne wyprodukowanych features. Dzięki takim narzędziom
Testy jednostkowe w sensie JUnit (np. test case konkretnej metody) jest
jednak moim zdaniem metodą pośrednią osiągnięcia wysokiej jakości
produktu finalnego.
Testy wychodzące od przypadków użycia (UML use cases) czy ogólniej - od
specyfikacji funkcjonalnej - są moim zdaniem lepszą, bo bardziej
bezpośrednią, metodą osiągnięcia tej jakości.
Zwróćcie uwagę, że obie metody się nie wykluczają, choć na ogół ich
równoległe stosowanie jest bardzo kosztowne. (zwłaszcza biorąc pod uwagę
aktualne oczekiwania płacowe programistów :-)
--
Z powazaniem / Best Regards /
Mit freundlichen Gruessen / Meilleures salutations
Pawel Debski
Managing Consultant, e-mail: PDe...@econsulting.pl
Tel. 0048-504-766-316, 0048-22-730-2794
eConsulting Sp. z o. o. http://econsulting.pl
Kochanowskiego 3, Pruszkow, KRS 0000098514
NIP PL534-2194-317, kapital 150000PLN
Biuro W-wa: Ciolka 12/401, 0048-22-463-6357
To join us: cv (o) econsulting (!) pl
To contract us: salesteam (o) econsulting (!) pl
testy jednostkowe dają pewność że przejście (lub nie przejście) testów
funkcjonalnych jest regułą a nie wyjątkiem a dzięki temu znacznie
obniżają koszty utrzymania i dodawania/modyfikacji funkcjonalności (a
programiści z utrzymania mają mniej wrzodów żołądka :) wiem coś o tym)
> Testy wychodzące od przypadków użycia (UML use cases) czy ogólniej - od
> specyfikacji funkcjonalnej - są moim zdaniem lepszą,
zastąpienie testów funkcjonalnych przez testy jednostkowe to bardzo
odważny i śmiały pomysł ;)
> (...) choć na ogół ich
> równoległe stosowanie jest bardzo kosztowne.
takie sławy programistyczne jak K. Beck czy M. Fowler mówią że używają
testów jednostkowych by zwiększyć swoją efektywność (programiści
czytają: by być bardziej za~!@#stymi programistami, managerowie: by
więcej pracy o lepszej jakości było wykonane w tym samym czasie), z
moich obserwacji wynika, iż kto nie spróbował twierdzi że są zbyt
kosztowne, kto spróbował używa bez względu czy jego PM o tym wie czy
nie
> (zwłaszcza biorąc pod uwagę
> aktualne oczekiwania płacowe programistów :-)
konsultant narzekający na płace programistów i na ich produktywność - ROTFL
--
Piotr Paradziński
http://groups.google.com/group/lublin-jug
http://it-researches.blogspot.com
Whats the difference between a used car salesman and a software salesmen?
The used car salesman knows when he's lying.
to jakby ktoś się zapędził w ufaniu testom ;]
--
pozdrawiam
Adam Kędziora
Chciałbym nieco rozwinąć Twoją myśl: :)
Tak się czasem zastanawiam, czy pojęcie "unit testing" nie jest trochę
źle dobrane - nieco mylące. Elementem metodyki XP jest zalecenie
tworzenia testu jednostkowego przed napisaniem kodu implementacji.
Uzasadnienie jest takie, że programista (programiści w XP) określają
przypadki użycia metod ewaluując przy okazji ich optymalne API. Testy
jednostkowe widziane z tej perspektywy to sposób na dokumentację
specyficznych "use cases" (gdzie programista jest po prostu
użytkownikiem API), czy ogólnie wymagań projektowych.
Do czego zmierzam? - skupiamy się tutaj na testach jednostkowych w
kontekście QA, które zasadniczo następuje jako późny etap w procesie
produkcji oprogramowania. Osobiście w kontekście unit testing
traktował bym QA jako "efekt uboczny", mający sens gdy sprawdza się
pokrycie kodu testami, oraz potem w ewolucji projektu, gdy testy
wykazują regressions. A ja chciałbym położyć nacisk na rolę testu
jednostkowego jako "mentalnego narzędzia" do projektowania API - to o
czym piszę wyżej.
Mamy taką zaprzyjaźnioną firmę w Danii, gdzie obficie czerpie się z
metodyk Agile, i w związku z tym programiści z zasady nie tworzą
javadocs :). Żeby dać przy tym obraz stopnia wykorzystania wzorców
projektowych w ich kodzie, przytoczę anegdotę - każde użycie przez
programistę IFa karane jest pieniężnie (jedna korona, czy coś takiego)
:) . Kiedy dostałem ich kody źródłowe i zapytałem o dokumentację, to
usłyszałem - "dobry kod jest samo-dokumentujący - jeśli coś jest
niejasne to zajrzyj do testów". I faktycznie coraz częściej jest tak,
że kiedy gadam z autorem jakiegoś projektu, który przy braku
dokumentacji usiłuje mi wyjaśnić co i jak, to słyszę "zajrzyj do
testów". :)
Pozdrawiam
Podpisuję się pod wszystkim ... ale mam swoje (naiwne?) obawy.
> programiści z zasady nie tworzą
> javadocs :)
> (...)
> "dobry kod jest samo-dokumentujący - jeśli coś jest
> niejasne to zajrzyj do testów"
Bardzo boję się takiego podejścia. Mówi się o tym też w kontekście
dobrze napisanego kodu obiektowego. W obu przypadkach mam wrażanie że
nie czuję słodkiego zapachu. Całkowita rezygnacja z pisania komentarzy
(dokumentujących) to podejście bardzo ekstremalne. Nie jestem wielkim
fanem terroryzmu.
Miło jest jak autouzupełnianie pokazuje Ci opis API i nie musisz przy
każdej metodzie szukać testów, które pisałeś n-czasu temu albo ...
... które pisał kolega
... w drugim końcu polski
... który odszedł z firmy
... nie do końca w miłej atmosferze
... a ty masz tylko skompilowaną bibliotekę bez źródeł.
Nierealne? Mi się zdarzyło.
Do tego ta cała masa kodu, będącego efektem ciągłych zmian wymagań i
takiej presji terminów że się biega z pustymi taczkami bo nie ma
czasu ich załadować.
... napisana przez programistę C
... z nawykiem nieustannej optymalizacji kodu na poziomie bitów
... sama aplikacja w Java
... albo w języku jednokrotnego zapisu typu Perl.
Też się zdarza.
OTOH pair programming też budził we mnie opór. A jego efektem ubocznym
też jest wczesne (czytaj szybkie==tańsze) wykrywanie błędów ergo
korzyści przy QA.
Pozdrawiam
--
Piotr Paradziński
Gratuluję przenikliwości i jasnego formułowania poglądów.
Nie zgodziłbym się natomiast z poglądem, że QA ma (powinno mieć?)
miejsce na późnym etapie projektu.
Prof. Turski, którego uważam za swojego mistrza, mawiał że dodanie QA na
koniec projektu, to tak jakby robić brudne jedzenie, a następnie dać
silną dawkę promieniowania, żeby wybić zarazki.
Czy o taki efekt chodzi?
> (offtopic) Odnośnie płacy - wolisz zapłacić programiście mniej
> pieniędzy i mieć błąd w systemie finansowym który zakopie twoją firmę,
> czy zapłacić więcej za lepszego programistę ? ;)
Widzę też, że włożyłem kij w mrowisko wspominając o pieniądzach.
Proponuję żeby zamiast się wyzłośliwiać rozważyć ważny w tym kontekście
aspekt:
- w latach 90tych wystarczyło zarzucić projekt ludźmi, żeby coś
(niekoniecznie sensownego) powstało w terminie.
- w chwili obecnej trzeba uważnie żonglować osobodniami w 3-4
kategoriach kosztowych, a prawidłowa metodyka działania jest znacznie
bardziej istotna.
W szczególności nie ma czasu ani pieniędzy na poprawianie po partaczach.
>
> to jakby ktoś się zapędził w ufaniu testom ;]
>
No właśnie. Zbytnia pewność siebie już niejednego zgubiła.
Ostatecznie zawsze czynnikiem decydującym ludzie - albo robią dobrą
robotę, albo nie.
Nie ma to jak zapładniająca dyskusja przed snem ;-)
Czym, życzę wszystkim dobranoc...
Oj prawdaż, prawdaż. :)
>> programiści z zasady nie tworzą
>> javadocs :)
>> (...)
>> "dobry kod jest samo-dokumentujący - jeśli coś jest
>> niejasne to zajrzyj do testów"
>
> Bardzo boję się takiego podejścia. Mówi się o tym też w kontekście
> dobrze napisanego kodu obiektowego. W obu przypadkach mam wrażanie że
> nie czuję słodkiego zapachu. Całkowita rezygnacja z pisania komentarzy
> (dokumentujących) to podejście bardzo ekstremalne. Nie jestem wielkim
> fanem terroryzmu.
Nie pisałem o naszej firmie, tylko o zaprzyjaźnionej. :) Osobiście
nawet przesadzam z javadocami. Przy moim perfekcjonizmie czuję się
dobrze udokumentowawszy wszystko powyżej metod i pól prywatnych, a i
dla "private" często czynię wyjątki. Dobry przykład gdzie javadocs to
konieczność - nawet jeśli parametry i nazwy metod są
"samodokumentujące", to w przypadku metody rzucających
RuntimeException (np. NumberFormatException), nie opisanie tego
javadociem może mieć opłakane skutki.
Wynika z tego że jednak nie wyraziłem się do końca jasno :( Powinienem
był inaczej to ująć.
Miałem na myśli logiczną sekwencję:
1. zbieranie wymagań -> 2. projektowanie -> 3. implementacja -> 4.
zapewnienie jakości -> 5. wdrożenie
Oczywiście taki cykl w typowych projektach (szczególnie przy
metodykach Agile i podejściu iteracyjnym), ma wysoki stopień
"sprzężenia zwrotnego" - prac z reguły nie wykonuje się czysto według
takiej sekwencji. Z tego względu też oczywiście uważam, że
infrastrukturę dla realizacji wszystkich elementów (z QA w
szczególności) warto zapewnić o ile to możliwe jeszcze przed
rozpoczęciem projektu. Mi chodziło tylko o to, żeby o testach
jednostkowych więcej myśleć w kontekście 2., albo nawet 1., a nie
wyłącznie 4. + ewentualnie 3.
> 2008/6/23 Pawel Debski <pde...@econsulting.pl>:
>> Nie zgodziłbym się natomiast z poglądem, że QA ma (powinno mieć?)
>> miejsce na późnym etapie projektu.
>
> Wynika z tego że jednak nie wyraziłem się do końca jasno :( Powinienem
> był inaczej to ująć.
>
> Miałem na myśli logiczną sekwencję:
>
> 1. zbieranie wymagań -> 2. projektowanie -> 3. implementacja -> 4.
> zapewnienie jakości -> 5. wdrożenie
>
> Oczywiście taki cykl w typowych projektach (szczególnie przy
> metodykach Agile i podejściu iteracyjnym), ma wysoki stopień
> "sprzężenia zwrotnego" - prac z reguły nie wykonuje się czysto według
> takiej sekwencji. Z tego względu też oczywiście uważam, że
> infrastrukturę dla realizacji wszystkich elementów (z QA w
> szczególności) warto zapewnić o ile to możliwe jeszcze przed
> rozpoczęciem projektu. Mi chodziło tylko o to, żeby o testach
> jednostkowych więcej myśleć w kontekście 2., albo nawet 1., a nie
> wyłącznie 4. + ewentualnie 3.
>
A ja mam wrażenie, że jak piszecie o testach unitowych, to każdy
myśli o czymś innym.
Czy testy funkcjonalne, integracyjne, unitowe itd. nie są
wystarczającym rozróżnieniem?
Nie bardzo rozumiem czemu testy unitowe w ogóle łączy się z QA'mi?
Czy testy unitowe nie są związane z małymi kawałeczkami kodu, które
są testowane przez programistów?
Wydaje mi się, że pojęcie testu unitowego powinno być jakoś
usystematyzowane, bo dla mnie to jakieś dziwne zamieszanie myśleć o
jednym rodzaju testu w kilku kontekstach.
Pozdrawiam
Tomasz Trela
Właśnie na to wygląda i to jest dosyć interesujące. :)
> Czy testy funkcjonalne, integracyjne, unitowe itd. nie są
> wystarczającym rozróżnieniem?
Mi chodzi nie o to "co jest czym?", bo "test jednostkowy" zawsze w
kategoriach "co?" pozostanie testem "kawałka kodu". Nie chodzi mi też
o to "jak?, jak to zrobić?" - czy junit, czy TestNG, czy dbunit, czy
cactus, etc. Chodzi mi o "dlaczego?" - zasadniczą funkcję testu - cel
dla którego test piszemy. A tu podejście jest jak widać niejedno.
> Nie bardzo rozumiem czemu testy unitowe w ogóle łączy się z QA'mi?
Ja bym łączył to przede wszystkim w kategoriach statystyk code
coverage testów, obok statycznej analizy kodu.
> Czy testy unitowe nie są związane z małymi kawałeczkami kodu, które
> są testowane przez programistów?
Zdecydowanie, ale programiści (przynajmniej Javy i ogólnie języków
obiektowych) nie tyle piszą sekwencje instrukcji reprezentujące
algorytm, co określają sposób zachowania obiektów w reakcji na
wywołania ich metod. To są dwa różne aspekty tej samej pracy, ale
skupienie się przy pisaniu testów jednostkowych na tym pierwszym
byłoby świadectwem kompletnego niezrozumienia zagadnienia.
Kiedy mam do zaprojektowania API jakiejś biblioteki, to zaczynam od
pisania testu i taki sposób kodowania promuję w firmie. Test
jednostkowy powstaje wtedy przed implementacją. Czy jego istnienie ma
jakikolwiek sens bez implementacji? Z pozoru nie, ale przecież
implementację możemy całkowicie zmienić. Dlatego tak ciekawe są
abstrakcyjne testy jednostkowe - np. te z commons-collections, albo
sunowski Java Test Compatibility Kit.
Każdy odpowiednio skomplikowany system zaczyna z czasem przejawiać
własności nieredukowalne do własności jego elementów składowych. Np. w
firmie napisaliśmy nowy język programowania zaimplementowany w Javie.
Mamy sporo testów jednostkowych na poziomie kodu Javy - część z nich
napisana przed implementacją, teraz z kolei myślimy o testach
jednostkowych dla kolejnego poziomu abstrakcji - naszego języka.
Gdybyśmy mieli odpowiednio dużo doświadczenia i jeszcze więcej
wyobraźni :) kiedy zaczynaliśmy parę lat temu projekt, to zaczęlibyśmy
właśnie od tych bardzo abstrakcyjnych testów - po to by dokładnie
wiedzieć co potem zaimplementować.
- czy statystyki code coverage cokolwiek nam mowia? Czy aby 100% to
nie jest wciaz za malo, zeby byc "w miare" pewnym poprawnosci
dzialania kodu? A z drugiej strony po co testy do trywialnych metod
(strata czasu aby miec 100%?).
- czy pisanie testow nie odciaga uwagi od samej implementacji? A
implementacja jest sprowadzana do zaspokojenia testow, a nie
rozwiazania wlasciwego/pierwotnego problemu.
- czy jakosc testow nie jest uzalezniona od jakosci programisty, a
wiec takze i od wlasciwej implementacji (dobra implementacja - po co
wiec testy, zla implementacja - testy i tak do kitu).
- czy aby na pewno ilosc czasu spedzona przy pisaniu testow jest
mniejsza od ilosci czasu spedzonego na debugowaniu?
- czy nie bardziej "oplacalne" jest zainwestowanie tego czasu w pair
programming, dobre code review itp?
- czy TDD to nie kolejny buzz word. ktory trzeba wpisac w CV, zeby dostac prace?
- ile osob wlasciwie stosuje TDD? (chyba dr. Kabutz, a moze ktos inny,
zadal to pytanie na jakiejs konferencji Javowej i tylko kilka procent
osob podnioslo reke), czy wiec TDD rzeczywiscie odroznia dobrego
programiste od zlego?
Jaka jest wiec Wasza opinia?
Regards,
Grzegorz Duda (http://grzegorzduda.blogspot.com)
Polish JUG (http://java.pl)
2008/6/24 Kazimierz Pogoda <hsh...@gmail.com>:
> 2008/6/24 pikson <pikso...@gmail.com>:
Do tego nie wszystko daje sie zdebugowac (np. system wielowatkowy), a
testami mozna sobie przynajmniej probowac pomoc utrzymać pewne sytuacje
poprawne (przy maagisterce wystarczy).
Przy pozostalych pytaniach pewnie kazdy bedzie mial watpliwosci. Pytanie
tez czy pytajac kto stosuje TDD pytamy o to czy pisze test najpierw czy
powiedzmy rownolegle (np. na poziomie kolejnych metod). To drugie jest
jakby takie bardziej agile ;)
Pozdrawiam,
Adrian
--
Pozdrawiam,
Adrian Nowak
Polish Java User Group
www.java.pl
No to jeszcze moj kij do mrowiska. Na wstepie zaznaczam, ze nie jestem
przeciwnikiem testow, czy samego TDD, ale chcialem Wam zadac kilka
pytan (do samodzielnego przemyslenia, lub podzielenia sie swoja opinia
tutaj):
- czy statystyki code coverage cokolwiek nam mowia? Czy aby 100% to
nie jest wciaz za malo, zeby byc "w miare" pewnym poprawnosci
dzialania kodu? A z drugiej strony po co testy do trywialnych metod
(strata czasu aby miec 100%?).
- czy pisanie testow nie odciaga uwagi od samej implementacji? A
implementacja jest sprowadzana do zaspokojenia testow, a nie
rozwiazania wlasciwego/pierwotnego problemu.
- czy jakosc testow nie jest uzalezniona od jakosci programisty, a
wiec takze i od wlasciwej implementacji (dobra implementacja - po co
wiec testy, zla implementacja - testy i tak do kitu).
- czy aby na pewno ilosc czasu spedzona przy pisaniu testow jest
mniejsza od ilosci czasu spedzonego na debugowaniu?
- czy nie bardziej "oplacalne" jest zainwestowanie tego czasu w pair
programming, dobre code review itp?
- czy TDD to nie kolejny buzz word. ktory trzeba wpisac w CV, zeby dostac prace?
- ile osob wlasciwie stosuje TDD? (chyba dr. Kabutz, a moze ktos inny,
zadal to pytanie na jakiejs konferencji Javowej i tylko kilka procent
osob podnioslo reke), czy wiec TDD rzeczywiscie odroznia dobrego
programiste od zlego?
Jaka jest wiec Wasza opinia?
Regards,
Grzegorz Duda (http://grzegorzduda.blogspot.com)
Polish JUG (http://java.pl)
2008/6/24 Kazimierz Pogoda <hsh...@gmail.com>:
> 2008/6/24 pikson <pikso...@gmail.com>:
>> Nie bardzo rozumiem czemu testy unitowe w ogóle łączy się z QA'mi?
>
> Ja bym łączył to przede wszystkim w kategoriach statystyk code
> coverage testów, obok statycznej analizy kodu.
>
Jeśli chodzi o code coverage to dla mnie osobiście mniej użyteczne są
statystyki, a bardziej "zapalone na czerwono" fragmenty kodu w IDE,
czy w raportach. Warto przyjrzeć się dokładnie właśnie tym miejscom.
> - czy pisanie testow nie odciaga uwagi od samej implementacji? A
> implementacja jest sprowadzana do zaspokojenia testow, a nie
> rozwiazania wlasciwego/pierwotnego problemu.
Dobre pytanie. Wyobrażam sobie, że może tak być. Ale czy pierwotny
problem nie leży wtedy w nieodpowiednio napisanym teście?
> - czy jakosc testow nie jest uzalezniona od jakosci programisty, a
> wiec takze i od wlasciwej implementacji (dobra implementacja - po co
> wiec testy, zla implementacja - testy i tak do kitu).
Kryterium "jakości programisty" to kategoria słabo definiowalna.
Zakładam, że można napisać poprawny kod implementacji bez stosowania
testów jednostkowych. Ja jednak traktuję testy przede wszystkim jako
protezę dla pokrycia własnych ograniczeń i braku wyobraźni. Często
rezygnuję z pisania testów dla komponentów GUI - to można zobaczyć i
wyklikać. Testy dla kontroli efektów działania servletów - też bym się
zastanawiał. Dla prostych beanów z mutators/accessors też nie bardzo
jest sens. Jest jednak wiele kategorii kodu, gdzie nie da się po
prostu wywołać main()/wpisać URL w przeglądarce i zobaczyć jak to
działa. Przynajmniej takie są nasze projekty - kod czysto serwerowy,
ale nie servletowy. Jeśli w ogóle chcemy kodować inaczej niż "na
sucho", zanim komponenty trafią do skomplikowanego kontenera, to
potrzebujemy testu chociażby jako "entry point" by uruchomić
debugowanie. Dlatego tak bardzo propaguję podejście, że w przypadku
testów jednostkowych testowanie kodu to "efekt uboczny". Pierwszy cel
to w ogóle dostać się do kodu, jeśli nie można wizualizować efektów
jego działania. A jakość samych testów to już osobne zagadnienie.
> - czy aby na pewno ilosc czasu spedzona przy pisaniu testow jest
> mniejsza od ilosci czasu spedzonego na debugowaniu?
O tym wyżej :)
> - ile osob wlasciwie stosuje TDD? (chyba dr. Kabutz, a moze ktos inny,
> zadal to pytanie na jakiejs konferencji Javowej i tylko kilka procent
> osob podnioslo reke), czy wiec TDD rzeczywiscie odroznia dobrego
> programiste od zlego?
"Dobry programista" - znowu kategoria słabo określona :) . W naszych
czasach, w branży IT, "dobry programista", to "pragmatyczny
programista". Ale to się ma raczej nijak do kontekstu akademickiego.
Nie podchodził bym do TDD wyznaniowo - jeśli pomaga w realizacji celów
- warto stosować, jeśli nie, warto porzucić.
Jeśli tworzymy projekt na zaliczenie - wykładowca raczej nie zajrzy do
testów (chyba że to jest przedmiotem zaliczenia - ciekawe czy na
którejś uczelni w Polsce coś takiego się zdarza :) ). Jeśli tworzymy
jednorazowy projekt na zamówienie, który nie będzie później
konserwowany, testy jednostkowe mogą stanowić zbyt duży overhead.
Jeśli tworzymy kod biblioteki - np. takiej która manipuluje stringami,
albo do operacji matematycznych - np. obróbki danych statystycznych -
w takim przypadku testy jawią mi się jako konieczność.
Specyfika kodu naszych firmowych projektów jest mniej więcej taka:
- biblioteki 3rd party (jakarta commons, jgraph, etc. - zasadniczo Open Source)
- biblioteki własne (utils, rmi, collections, ioc, crypt, etc.)
- właściwy kod projektu
Jeśli chodzi o pokrycie testami, to najbardziej zależy mi na kategorii
"biblioteki własne" - resztę traktuję już po macoszemu :)
Jeśli tworzymy projekt na zaliczenie - wykładowca raczej nie zajrzy do
testów (chyba że to jest przedmiotem zaliczenia - ciekawe czy na
którejś uczelni w Polsce coś takiego się zdarza :) ).
Z wikipedii:
http://en.wikipedia.org/wiki/Test-driven_development
"Practitioners emphasize that test-driven development is a method of
designing software, not merely a method of testing."
I bardzo podoba mi się jeszcze:
"Fake it, till you make it"
:) Dzisiaj wypróbowywałem mockito - to była duża przyjemność. :)
2008/6/24 Robert Sajdok <r...@onet.pl>:
>> Tak się czasem zastanawiam, czy pojęcie "unit testing" nie jest trochęZ wikipedii:
>> źle dobrane - nieco mylące. Elementem metodyki XP jest zalecenie
>> tworzenia testu jednostkowego przed napisaniem kodu implementacji.
> A czasem nie jest zalecane pisanie testów i implementacji
> równocześnie ? Tak przynajmniej ja to wyczytałem i bardziej to do mnie
> przemawia.
http://en.wikipedia.org/wiki/Test-driven_development
"Practitioners emphasize that test-driven development is a method of
designing software, not merely a method of testing."
I bardzo podoba mi się jeszcze:
"Fake it, till you make it"
:) Dzisiaj wypróbowywałem mockito - to była duża przyjemność. :)
Dobrze, że dopisałeś to w nawiasie. Dla mnie jest wręcz przeciwnie.
To, że IDE pokazuje mi błędy, jest jak najbardziej właściwe. Jeśli
używasz Eclipse'a, to dzięki opcji Quick Fix te wszystkie klasy i
metody zrobi za Ciebie IDE. A tego zdecydowanie brakuje mi, gdy np.
programuje w Rubym.
Pozdrawiam,
Bartosz Bańkowski
- czy statystyki code coverage cokolwiek nam mowia? Czy aby 100% to
nie jest wciaz za malo, zeby byc "w miare" pewnym poprawnosci
dzialania kodu? A z drugiej strony po co testy do trywialnych metod
(strata czasu aby miec 100%?).
- czy pisanie testow nie odciaga uwagi od samej implementacji? A
implementacja jest sprowadzana do zaspokojenia testow, a nie
rozwiazania wlasciwego/pierwotnego problemu.
- czy jakosc testow nie jest uzalezniona od jakosci programisty, a
wiec takze i od wlasciwej implementacji (dobra implementacja - po co
wiec testy, zla implementacja - testy i tak do kitu).
- czy aby na pewno ilosc czasu spedzona przy pisaniu testow jest
mniejsza od ilosci czasu spedzonego na debugowaniu?
- czy nie bardziej "oplacalne" jest zainwestowanie tego czasu w pair
programming, dobre code review itp?
- czy TDD to nie kolejny buzz word. ktory trzeba wpisac w CV, zeby dostac prace?
- ile osob wlasciwie stosuje TDD? (chyba dr. Kabutz, a moze ktos inny,
zadal to pytanie na jakiejs konferencji Javowej i tylko kilka procent
osob podnioslo reke), czy wiec TDD rzeczywiscie odroznia dobrego
programiste od zlego?
O ile pamiętam w którymś wywiadzie Gosling opowiedział nieco
żartobliwie, że największy błąd jaki popełnił podczas projektowania
Javy to dopuszczenie do istnienia klas - powinny być same interfejsy.
:)
> Język. Ponieważ większość z nas to Javowcy to sami wiemy, jak TDD jest na
> początku trudne. IDE wyświetla ciągle błedy np. brak metody, ale można się
> do tego przyzwyczaić.
Hmm, w eclipse w takich sytuacjach robię CTRL-1 (o przepraszam -
jabłko-1 ;) ) i Enter.
Byc moze tez sa sytuacje ze posiadanie pewlnego zestawu testow przed
implementacja powodowac moze trudnosci w postepach nad implementacja ...
no dobra bronie sie troche ;)
Na pewno testy pisane kiedykolwiek sa duzo lepsze niz ich brak, a
niestety pozniej nie mialem tyle szczescia i mojego szefa nie udalo sie
przekonac do "straty czasu na pisanie testow"... dzieki temu mam uraz do
recznego debugowania na cale (krotkie) zycie (i softwaru produkcji
szczesciarzy dzisiejszych rozgrywek, choc to pewnie mi przejdzie pszy
lepszej okazji).
Pozdrawiam,
Adrian
Test-first nie oznacza napisania wszystkich możliwych przypadków
testowych. Tworzysz jeden i implementujesz do niego funkcjonalność,
refaktorujesz i tak w kółko. Nie wyobrażam sobie stworzenia całego
zestawu testów przed. Będzie to tak samo nieefektywne, jak napisanie
najpierw kodu, a później testów. To co Ty nazywasz "równoległym"
pisaniem testów, to jest właściwe zastosowanie TDD.
Pozdrawiam,
Bartosz Bańkowski
W takim razie mowiac o TDD (chyba za wszesnie zetknalem sie z praktyka i
przez to teorie tylko liznalem) brakuje precyzji, bo raz podkresla sie
ze testy przed implementacja (co oczywiscie rozumiec mozna jako przed
implementacja metody, a nie calego czy wiekszego fragmentu projektu), a
dwa w pojeciu refaktoryzacji nie miesci sie przeciez zmina/rozszerzenie
dzialania tylko poprawa struktury kodu (funkcjonalnalnosc pozostaje).
Pozdrawiam,
Adrian