Roman Piekarski

Roman Piekarski Programista do
wynajęcia

Temat: agile test driven development

Witam,

Chcę dzisiaj poruszyć temat wytwarzania oprogramowania przy urzyciu automatycznych testów jednostkowych.

Najpierw tworzymy startery a dopiero pozniej piszemy glowny kod funkcjonalności pamiętając o tym aby przetestwać wszystko, z czym wiąże się jakiekolwiek ryzyko w działaniu. Wszystko, co podejrzewamy o jakieś błędy. Wszystko, co intuicja podpowiada. Skupiamy raczej na testowaniu klas a nie metod.

Jakię są wasze doświadczenia podczas pisania testów jednostkowych? Na czym się najbardziej skupiacie? Co testujecie? Czego nietestujecie?
Jakie nasuwają wam się refleksje związane z testowaniem kodu?

Czy waszym zdaniem podejście do testów jednostkowych tworzone przy aplikacjach webowych różni się od aplikacji desktopowych? Jeśli tak to czym? Jeśli tak, to jakie podejście stosujecie przy aplikacjach webowych a jakie przy desktopowych?

Zapraszam do dyskusji

Pozdrawiam

konto usunięte

Temat: agile test driven development

Z testami to jest tak.. Wykrywasz wszystkie podstawowe błędy.
Rzecz w tym że znaczny procent błędów pojawia się dopiero znacznie znacznie później, kiedy tworzony soft - rozwija się, rośnie i zaczynają się pojawiać funkcjonalności które operują na tych samych danych ale nie z poziomu tego samego modelu/controllera.

I tego testy już nie wyłapują - bo same modele działają w 100% poprawnie. A błąd pojawił się w wyniku nakładania się danych..

podobnych sytuacji jest bardzo wiele.

konto usunięte

Temat: agile test driven development

Z drugiej strony mozna powiedziec:"Lepiej miec testy jednostkowe niz nich nie miec" ;P
Tomasz B.

Tomasz B. Senior Software
Engineer

Temat: agile test driven development

Nie wiem czy o to tobie chodziło, lecz ja osobiście mam jeden sposób na testy aplikacji webowych. Tworze oprogramowanie które symuluje duży ruch na stronie Web w tym samym czasie.
Przy wejściu około kilku tysięcy na raz użytkowników od razu wykrywasz bug ze zwalnianiem pamięci oraz optymalizacją bazy danych i inne ciekawostki, które tak naprawdę nigdy nie wypłyną przy pojedynczych testach.
Fajna sprawa
Roman Piekarski

Roman Piekarski Programista do
wynajęcia

Temat: agile test driven development

Tomasz B.:
Nie wiem czy o to tobie chodziło, lecz ja osobiście mam jeden sposób na testy aplikacji webowych. Tworze oprogramowanie które symuluje duży ruch na stronie Web w tym samym czasie.

W jaki sposób symulujesz ruch na stronie? Jakie rzeczy uwzględniasz? Czy są to cały czas te same schematy ruchu/obiegu na stronie, czy udaje ci się mieszać/randomizować te schematy w celu uzyskania różnych krzyżówek sytuacyjnych?Roman Piekarski edytował(a) ten post dnia 22.10.09 o godzinie 10:27
Roman Piekarski

Roman Piekarski Programista do
wynajęcia

Temat: agile test driven development

Tomasz B.:
Nie wiem czy o to tobie chodziło ..

Generalnie nie do konca o to mi chodziło: poczytaj
Tomasz B.

Tomasz B. Senior Software
Engineer

Temat: agile test driven development

Odnośnie ruchu to aplikacja pobierała kontenty poszczególnych stron, aplikacja działa wielowątkowo, jeśli jest potrzeba to też wysyła posta lub get.
Niestety taka aplikacja jest tworzona pod konkretne rozwiązanie konkretny serwis Web.
Moja aplikacja miał udawać użytkownika i chodzić po zakładkach portalu, miała opcję zarówno losowości że np. pobierała zakładkę 1 a potem zakładkę 9. Jak i miała możliwość po kolei od 1 do 9.
Na końcu generowała mi raport odnośnie dostępności serwisu pod obciążeniem.
Ale to już raczej podchodzi takie rozwiązany pod testy wydajności, a nie o to tobie chodziło.
W razie dodatkowych pytań służę prywatnie pomocą.
Pozdrawiam

konto usunięte

Temat: agile test driven development

Osobiście testom jednostkowym poddaję przede wszystkim klasy narzędziowe - to właśnie błędy w ich działaniu najtrudniej wykryć, w dodatku powstaje kod który opiera swoje poprawne działanie na błędach w nich występujących.
Czyli wszelkiego rodzaju klasy rozszerzające kolekcje, operujące na kolekcjach, strumieniach, wykonujące obliczenia finansowe (!) i obliczenia na jednostkach miary.
Te ostatnie to już bezwzględna konieczność. Błędy obliczeniowe np w fakturach może wykryć dopiero urząd skarbowy w czasie kontroli.
Stanisław P.

Stanisław P. Software designer

Temat: agile test driven development

A ja mówię TDD nie. Tzn. przynajmniej nie w ten sposób, w jaki to powinno wyglądać oficjalnie.

Po kilku próbach doszedłem do wniosku, że:
- dłużej zajmuje przerabianie testów później, żeby były zgodne z nowym interfejsem jeśli plan zmieni się w trakcie programowania
- zaoszczędzony czas można przeznaczyć na cykl coverage-test -> nowy unit-test -> i od nowa ;)
- może są magicy, którzy wiedzą przed napisaniem programu jak ich wewnętrzny interfejs będzie wyglądał - ja nigdy nie wiem i to dopiero ewoluuje w trakcie pisania
- jeśli piszę testy przed kodem, często okazuje się, że nagle mam 5 testów które może wyglądają inaczej i teoretycznie robią coś innego, ale w kodzie całego systemu używają dokładnie tej samej ścieżki... fajnie wiedzieć, że wszystkie działają, ale potem spokojnie można 4 z nich wyciąć, bo nic nowego nie wnoszą, tylko opóźniają proces

Więc testy - jak najbardziej, continuous integration - super, dążenie do pokrycia 100% - dobrym zwyczajem... ale testy przed kodem - nie dla mnie.
Roman Piekarski

Roman Piekarski Programista do
wynajęcia

Temat: agile test driven development

A moze wczesniejsze zaplanoanie modelu klas/metod ktore beda spelnialy konkretne role i zadania, w tym przygotowanie rowniez interfejsu co pozwoli wejsc na gotowy model i na tym w trakcie wprowadzic ewentualne ale juz bardzo znikome poprawki kore nie zajma az tak wiele czasu. Co o tym myslisz?
Stanisław Pitucha:
A ja mówię TDD nie. Tzn. przynajmniej nie w ten sposób, w jaki to powinno wyglądać oficjalnie.

Po kilku próbach doszedłem do wniosku, że:
- dłużej zajmuje przerabianie testów później, żeby były zgodne z nowym interfejsem jeśli plan zmieni się w trakcie programowania
- zaoszczędzony czas można przeznaczyć na cykl coverage-test -> nowy unit-test -> i od nowa ;)
- może są magicy, którzy wiedzą przed napisaniem programu jak ich wewnętrzny interfejs będzie wyglądał - ja nigdy nie wiem i to dopiero ewoluuje w trakcie pisania
- jeśli piszę testy przed kodem, często okazuje się, że nagle mam 5 testów które może wyglądają inaczej i teoretycznie robią coś innego, ale w kodzie całego systemu używają dokładnie tej samej ścieżki... fajnie wiedzieć, że wszystkie działają, ale potem spokojnie można 4 z nich wyciąć, bo nic nowego nie wnoszą, tylko opóźniają proces

Więc testy - jak najbardziej, continuous integration - super, dążenie do pokrycia 100% - dobrym zwyczajem... ale testy przed kodem - nie dla mnie.
Stanisław P.

Stanisław P. Software designer

Temat: agile test driven development

Roman Piekarski:
A moze wczesniejsze zaplanoanie modelu klas/metod ktore beda spelnialy konkretne role i zadania, w tym przygotowanie rowniez interfejsu co pozwoli wejsc na gotowy model i na tym w trakcie wprowadzic ewentualne ale juz bardzo znikome poprawki kore nie zajma az tak wiele czasu. Co o tym myslisz?

Teoretycznie to by było fajne. Niestety ja programuje rzeczy dosyć eksperymentalne zawsze, więc żeby programować pod gotowy model musiałbym coś doprowadzić do działania, zaplanować poprawnie i napisać jeszcze raz. Ale czasu tyle nie ma...
Dodatkowo jestem świadomy, że za ~2 miesiące przyjdą prawdziwi userzy i powiedzą, że to jest to d. bo nie dodaliśmy X... i wtedy właśnie przepisujemy połowę od początku z jakimś lepszym planem, do testów już gotowych.

Może to po prostu specyfika mojej pracy (tzn. że nie robimy na potrzebę, ale uświadamiamy ludziom jakie potrzeby mogą mieć, później oni dodają swoje życzenia i przerabiamy ;) )
Roman Piekarski

Roman Piekarski Programista do
wynajęcia

Temat: agile test driven development

Stanisław Pitucha:

Może to po prostu specyfika mojej pracy (tzn. że nie robimy na potrzebę, ale uświadamiamy ludziom jakie potrzeby mogą mieć, później oni dodają swoje życzenia i przerabiamy ;) )

Mysle, ze Twoje ostatnie zdanie zdecydowanie wyjasnia dlaczego jestes przeciwko TDD. Tak, masz dosc specyficzną pracę jednakze userzy prawde mowiac oceniaja tylko GUI. Jezeli kwestia rozchodzi się o potrzeby userow ktorzy mogą mieć potrzeby rozniace się z waszą koncepcja to dlaczego najpierw niezaprojektujecie prototypowego gui w oparciu o ktore bedziecie w stanie zasymulowac przypadki urzycia tak aby user mogl ocenic wasza wizje? Dopiero na tej podstawie moglibyscie zacząć budować architekture systemu.

Temat: agile test driven development

Tomasz B.:
Odnośnie ruchu to aplikacja pobierała kontenty poszczególnych stron, aplikacja działa wielowątkowo, jeśli jest potrzeba to też wysyła posta lub get.
Niestety taka aplikacja jest tworzona pod konkretne rozwiązanie konkretny serwis Web.
Moja aplikacja miał udawać użytkownika i chodzić po zakładkach portalu, miała opcję zarówno losowości że np. pobierała zakładkę 1 a potem zakładkę 9. Jak i miała możliwość po kolei od 1 do 9.
Na końcu generowała mi raport odnośnie dostępności serwisu pod obciążeniem.
Ale to już raczej podchodzi takie rozwiązany pod testy wydajności, a nie o to tobie chodziło.
W razie dodatkowych pytań służę prywatnie pomocą.
Pozdrawiam

Współtworzyłem bardzo podobny projekt - wielowątkowy, rozproszony z możliwością definiowania scenariuszy przejść dla poszczególnych użytkowników serwisu ze wsparciem dla SSL/TLS namalowany w perlu i C. Nazywał się rebellion i miał być udostępniony publicznie, ale jak wyszło z licencją nie wiem, w każdym razie zainteresowane osoby mogą poszukać ;)

konto usunięte

Temat: agile test driven development

Testy jednostkowe a symulowanie ruchu (obciążenia) to chyba inne rodzaje testów.
Testy jednostkowe przydają się w projektach kilku/kilkunastoosobowych.
Po zmianie kodu w przypadku popełnienia błędu mam po paru chwilach informacje o błedzie na maila :).

NUnit + SVN + CruiseControl.

konto usunięte

Temat: agile test driven development

Zastanawiam sie czy rzeczywiście warto jest łączyć pełne TTD z agile?
w końcu w agile - co sprint mamy potencjalną zmianę koncepcji. Czy nie prościej będzie po prostu wykonać podstawowe testy user story i na tym poprzestać? Rzecz jasna zakładam ze testy takie jak przesyłanie głupich danych / celowo błędnych danych we wszelkiej maści formularzach lub tam gdzie występują parametry do których ma dostęp user.
Więc czy warto marnować kupę czasu na coś co potencjalnie za chwilę wywalimy? Czy nie lepiej uzupełniać testy do finalnej wersji softu? Dodatkowo - np testy obciążeniowe też moim zdaniem jest sens robić dopiero po ukończeniu aplikacji.

Prosty przykład - mam portal przygotowany pod multijęzyczność. Gdy zaczynałem programowanie - zmiennych słownikowych było ok 100. Teraz jest ich 1600+ Wcześniej optymalizacja ładowania słownika nie była potrzebna, a teraz piszę ładowanie słownika w oparciu o use case.
Napisanie do tego testów - w moim przypadku jedynie wydłużyło by produkcję docelowego kodu. A testy obciążeniowe dopiero teraz zaczynają pokazywać jakkolwiek wymierne wyniki.
Wojciech Zieliński

Wojciech Zieliński IT
Project/Programme/Pe
ople Manager
(PRINCE2
Practicioner...

Temat: agile test driven development

Sergiusz Czerkasow:
Napisanie do tego testów - w moim przypadku jedynie wydłużyło by produkcję docelowego kodu. A testy obciążeniowe dopiero teraz zaczynają pokazywać jakkolwiek wymierne wyniki.
A jak bardzo wydłuży oddanie kodu bugfixing ? :) Zwłaszcza w Agile, gdzie jak wspomniałeś co sprint może się zmienić koncepcja...
Według mnie właśnie w Agile testy jednostkowe są bardzo istotne - głównie z uwagi na testy regresyjne... Jak masz projekt, który praktycznie powstaje na zasadzie zarządzania zmianą, to jeśli nie masz przygotowanych testów regresyjnych, które możesz odpalić po zmianie jakiejś funkcjonalności, która potencjalnie (choć nie na pierwszy rzut oka) może być powiązana z czymś napisanym 10 sprintów temu, to leżysz... I zaczynasz pisać testy na końcu całego procesu - a wtedy nie tylko zajmuje to więcej czasu, ale przede wszystkich istnieje bardzo duże prawdopodobieństwo przepuszczenia któregoś z use case... A znając życie - właśnie ten use case będzie jednym z pierwszych, który zostanie sprawdzony przez zleceniodawcę w momencie odbioru i akceptacji oprogramowania...

Według mnie w Agile trzeba stosować testy i testami opisywać funkcjonalność... Zresztą - to była jedna z podwalin XP... I według mnie jedna z tych lepszych...
Zresztą zasada test driven development jest nawet częściowo stosowana w metodykach formalnych - my np. w przypadku jeśli realizujemy projekt w metodzie kaskadowej, z pełną specyfikacją funkcjonalną stworzoną na początku, jednym z elementów dokumentacji PRZED-projektowej jest właśnie zestaw testów akceptacyjnych - podpisywanych przez zleceniodawcę. Bo tylko (z mojej przynajmniej wiedzy) coś takiego pozwala na całkowicie jednoznaczne określenie czy projekt jest skończony i gotowy do pracy produkcyjnej (oczywiście z zastrzeżeniem okresu gwarancyjnego - bo testy akceptacyjne nigdy nie wykryją wszystkiego - chyba że zostały przygotowane zgodnie z metodyką testów formalnych - ale to jest już sajgon) i czy może być odebrany...Wojciech Zieliński edytował(a) ten post dnia 27.10.09 o godzinie 21:28

konto usunięte

Temat: agile test driven development

Ha!
Wojtku, jak najbardziej się z tobą zgadzam! Chciałbym mieć klientów który rozumieją ideę TTD. 99% moich klientów nie rozumie co to jest test jednostkowy, a już na pewno nie trawi pozycji w kosztorysie pod tytułem testy jednostkowe - które zazwyczaj opiewają na ok 30% czasu potrzebnego na produkcję. Po długotrwałym tłumaczeniu co to jest - klient zadaje pytanie - czy ma wsparcie poprodukcyjne? Czy w ramach tego wsparcia poprawiamy błędy w oczywisty sposób mijające się ze specyfikacją? Jeżeli słyszy 2 razy tak - to mówi że on tych testów do szczęścia nie potrzebuje. Że jego strona/portal/serwis będzie działać i bez tego, a jak będzie chciał coś zmieniać - to od tego ma agencję by ogarniała temat.

Można uzasadnić klientowi korporacyjnemu że to jest niezbędne, ale tylko i wyłącznie dzięki temu że na spotkanie zaprasza się ich IT. Gorzej gdy oni nie uważają testów za potrzebne.

Kolejny aspekt testów jednostkowych - w testach też mogą być błędy - w końcu to taki sam kod który w różnych okolicznościach może mieć bugi.

Jak uzasadnić klientowi - że po jednym sprincie dostaje on np funkcjonalność rejestracji użytkownika w portalu, w tym samym tygodniu w projekt wkracza spec od usability i stwierdza że w tym formularzu powinno być o połowę mniej pól. Zaś w drugim kroku rejestracji - o połowę więcej? Mamy do przebudowania niewielki kawałek aplikacji, ale zdecydowanie większy w testach.

Dokumentacja - ilu ogólne dostępnych programistów będzie przegryzać się przez testy zamiast po prostu przeczytać dokumentację API ?

Kolejny aspekt programistyczny już - zawsze stosuję MVC. W tym w kontrolerze - zawsze atomizuję akcje. Czyli żadna akcja w żadnym kontrolerze nie robi 2 rzeczy na raz. Czas potrzebny na debug takiej akcji - jest stosunkowo krótki. Albo akcja działa - albo straszy błędem. Co zmienią w tej sytuacji testy? Nic. Wydłużają jedynie czas produkcji. Zaznaczam ze bardzo dokładnie kontroluję każde dane wprowadzane przez użytkownika - więc od tej strony nie ma co się zepsuć.

Testy regresyjne - nie są mi do szczęścia potrzebne. Pamiętaj że w agile z założenia oddajemy co sprint mały pakiet w pełni działających funkcjonalności - więc nie jest konieczne testowanie w połączeniu z czymś co pisaliśmy 10 sprintów wcześniej - po prostu dostarczony pakiet jest niezależny od tego co pisaliśmy wcześniej.

Jasne ze są projekty w których to co mówisz ma rację bytu, gdzie obsługujemy np sektor finansowy, a przez 10 sprintów budujemy współzależny pakiet funkcjonalności, działający na transakcjach i rozproszonych usługach, zintegrowany dla pełni szczęścia z kilkoma starszymi systemami posiadanymi przez instytucję. Wtedy - nie podejmę się takiego projektu bez pisania kompletu testów, pięknej dokumentacji, oraz sztabu analityków do pomocy. Tylko wiesz co? Taki projekt pisałem raz w życiu, gdy pracowałem dla centralwings przy ich systemie rezerwacyjnym, który musiałem integrować z światowym, oraz udostępnić dla rzeszy resellerów, z obsługą płatności włącznie. Wiesz co? Z powodu tego jednego razu - nie ma sensu wprowadzać czysto korporacyjnych rozwiązań do robienia czegoś mniej więcej prostego. Bo najczęściej jest to sztuka dla sztuki - bez wartości biznesowej, gdyż dla każdego z moich klientów kluczowym elementem jest czas.

Następna dyskusja:

[10 grudnia] Agile Developm...




Wyślij zaproszenie do