Czy istnieją mocne dowody zwrotu z inwestycji w testy jednostkowe?

127

Testowanie jednostkowe brzmi dla mnie świetnie, ale nie jestem pewien, czy powinienem poświęcić trochę czasu na naukę, chyba że uda mi się przekonać innych, że ma to znaczną wartość. Muszę przekonać innych programistów i, co ważniejsze, osoby zajmujące się liczeniem fasoli w zarządzaniu, że cały dodatkowy czas spędzony na nauce frameworka testowego, pisaniu testów, utrzymywaniu ich aktualizacji itp. Zwróci się na siebie, a potem trochę.

Jaki jest dowód? Czy ktoś faktycznie opracował to samo oprogramowanie z dwoma oddzielnymi zespołami, z których jeden stosował testy jednostkowe, a drugi nie, i porównał wyniki? Wątpię. Czy mam to po prostu usprawiedliwić słowami: „Poszukaj tego w Internecie, wszyscy o tym mówią, więc to musi być słuszne”?

Gdzie są twarde dowody, które przekonają laików, że testy jednostkowe są warte wysiłku?

kruk
źródło

Odpowiedzi:

98

Tak. To jest link do badania Boby'ego George'a i Laurie Williamsa w NCST i innego przeprowadzonego przez Nagappan et al. Jestem pewien, że jest ich więcej. Publikacje dr Williamsa na temat testowania mogą stanowić dobry punkt wyjścia do ich znalezienia.

[EDYCJA] Dwa powyższe artykuły odnoszą się konkretnie do TDD i pokazują 15-35% wzrost czasu początkowego rozwoju po przyjęciu TDD, ale 40-90% spadek defektów przed wydaniem. Jeśli nie możesz uzyskać pełnej wersji tekstowej, sugeruję skorzystanie z Google Scholar, aby sprawdzić, czy możesz znaleźć publicznie dostępną wersję.

tvanfosson
źródło
14
Pierwsze badanie porównuje agile + TDD z projektami kaskadowymi, jego wyniki byłyby bardziej odpowiednie, gdyby porównało dwa zespoły zwinne. W drugim badaniu wspomniano o innych badaniach, które wykazały niewielką lub żadną premię za jakość projektów TDD. Porównując szacunki kierownictwa dotyczące dodatkowego czasu potrzebnego na TDD, szacuje się, że oba zespoły z dużym doświadczeniem w dziedzinie mają o 20% niższe pokrycie testami. Potwierdza to moje własne doświadczenie, pewność jest znacznie ważniejsza w systemach, z którymi jeszcze nie pracowałem, podczas gdy testowanie jest przeszkodą dla wszystkiego innego.
LearnCocos2D
Żadne z badań nie porównuje porównywalnego modelu procesu z jedynie zmianą metofologii testowej. Czyli spędzanie czasu na UT faktycznie lepiej spędzać np. testowanie systemu. W obecnym kształcie równie dobrze mogłoby wyglądać badanie „jeśli testujemy mądrzej, czy to pomoże”.
Rune FS
1
A co, jeśli koszt naprawy błędów występujących po wydaniu to 0,01% całkowitego rozwoju? W takim przypadku TDD byłaby okropną inwestycją. A jeśli błędów jest niewiele? Te% s nic nie znaczą bez kontekstu. Szczerze mówiąc, nie przeczytałem jeszcze całego opracowania. Ale w obecnym kształcie Twój post jest przydatny (dobre linki), ale nie odpowiada na pytanie dotyczące zwrotu z inwestycji, IMO.
Instine
1
@Instine Na szczęście (?) Istnieją dobre dowody na to, że tak nie jest. Naprawianie błędów występujących po wydaniu jest wykładniczo droższe niż błędy znalezione na wczesnym etapie rozwoju (co robi TDD). W tym kontekście koszt wynoszący 0,01% całkowitego rozwoju wszystkich błędów występujących po wydaniu wydaje się mało prawdopodobny. (Aby uzyskać szczegółowe informacje, patrz Code Complete , w szczególności Boehm & in. , „Understanding and Controlling Software Costs”, IEEE Trans Softw Eng (1988)).
Konrad Rudolph
Warto chyba zauważyć, że pierwsze badanie obejmuje próbkę 24 programistów (pracujących w parach, czyli 12 zespołów). Nie jestem pewien, jaki byłby statystycznie prawidłowy rozmiar próby, ale wydaje się, że jest on niski. Może ktoś inny wie?
Zachary Yates
30

„Muszę przekonać innych programistów i, co ważniejsze, pracowników zarządzających, że cały dodatkowy czas poświęcony na naukę frameworka testowego, pisanie testów, aktualizowanie ich itd. Zwróci się na siebie, a potem trochę. "

Czemu?

Dlaczego nie zrobić tego po prostu cicho i dyskretnie. Nie musisz robić tego wszystkiego od razu. Możesz to zrobić w małych kawałkach.

Uczenie się ram zajmuje bardzo mało czasu.

Napisanie jednego testu, tylko jednego, zajmuje bardzo mało czasu.

Bez testów jednostkowych jedyne, co masz, to zaufanie do oprogramowania. Dzięki jednemu testowi jednostkowemu nadal masz pewność, a także dowód, że co najmniej jeden test przeszedł pomyślnie.

To wszystko, czego potrzeba. Nikt nie musi wiedzieć, że to robisz. Po prostu to zrób.

S.Lott
źródło
9
Liczniki fasoli nie potrafiły odróżnić testu jednostkowego od reszty kodu, czy od tego zależało ich życie. Popieram sugestię, aby po prostu to zrobić. Jest jednak jedno zastrzeżenie: jeśli nie jesteś sam, potrzebujesz innych programistów, aby przyjęli tę praktykę. Jeśli nie, niechcący zepsują twoje testy.
Thomas Eyde,
Po prostu zrób to i nie mów im, i sprzedaj pomysł swoim kolegom podczas przerwy na kawę ;-)
Johan
3
Ponieważ zostałbyś zwolniony, gdybyś konsekwentnie nie dotrzymał terminów?
Andrew
3
@Neko: Testy jednostkowe nie dodają "trochę narzutu". One zredukować całkowity nakład pracy poprzez zapobieganie cały zalew głupich błędów. Praca nie rośnie; po prostu zmienia się ze złego kodu na dobre testy jednostkowe i dobry kod.
S.Lott,
1
Liczniki fasoli chcą, aby ich inżynierowie zapewnili solidne rozwiązania problemów domeny. Możesz po prostu napisać testy jako część swojego rozwiązania. Nawet tego nie zauważą. Jeśli zapytają, możesz im po prostu powiedzieć, że poświęcasz mu więcej czasu, aby upewnić się, że jest solidny i nie wymaga przeróbki. Jeśli SUGERUJESZ napisanie do nich testów jednostkowych, prosisz ich o zatwierdzenie czegoś, o czym nic nie wiedzą.
Yorkshireman
16

Podchodzę do tego inaczej:

Jakie masz zapewnienie, że Twój kod jest poprawny? Albo że nie łamie założenia X, gdy ktoś w twoim zespole zmieni funkcję func1 ()? Bez testów jednostkowych zapewniających „uczciwość” nie jestem pewien, czy masz dużo pewności.

Idea aktualizowania testów jest interesująca. Same testy często nie muszą się zmieniać. Mam 3x kod testowy w porównaniu z kodem produkcyjnym, a kod testowy został bardzo nieznacznie zmieniony . To jednak pozwala mi dobrze spać w nocy i pozwala mi powiedzieć klientowi, że mam pewność, że mogę wdrożyć funkcjonalność Y bez przerywania pracy systemu.

Być może w środowisku akademickim istnieją dowody, ale nigdy nie pracowałem w świecie komercyjnym, w którym ktoś zapłaciłby za taki test. Mogę ci jednak powiedzieć, że dobrze mi się udało, trochę czasu zajęło mi przyzwyczajenie się do frameworka testowego, a pisanie testów sprawiło, że naprawdę zastanawiałem się nad swoimi wymaganiami i projektem, o wiele bardziej niż kiedykolwiek pracowałem w zespołach, które nie napisał żadnych testów.

Oto, gdzie to się opłaca: 1) masz zaufanie do swojego kodu i 2) łapiesz problemy wcześniej niż w innym przypadku. Ty nie masz QA facet powiedzieć „hej, nie przeszkadzało granice sprawdzanie funkcji xyz (), prawda? On nie dostać się do stwierdzenia, że błąd, ponieważ jesteś okazało się, że miesiąc temu. To jest dobre dla go, dobre dla Ciebie, dobre dla firmy i dobre dla klienta.

Najwyraźniej to anegdota, ale dla mnie zdziałało cuda. Nie jestem pewien, czy mogę zapewnić Ci arkusze kalkulacyjne, ale mój klient jest zadowolony i to jest ostateczny cel.

itsmatt
źródło
Mój facet od kontroli jakości był dość bystry, ale nie patrzył na kod, ale łatwo było stwierdzić, że granice nie zostały sprawdzone.
itsmatt
Całkowicie zgodziliśmy się, że testy jednostkowe zmuszają cię do myślenia o projekcie i poprawności, zamiast lekkomyślnie
kodować
7
Klienci nie płacą nam za pisanie testów. Z drugiej strony nie płacą nam też za pisanie kodu. Płacą nam za rozwiązywanie ich problemów, a kiedy się konfrontują, założę się, że chcą, aby problemy zostały rozwiązane. Biorąc pod uwagę dowody, to niewiarygodne, że klienci nie chcą zabezpieczyć swojej inwestycji.
Thomas Eyde,
10

Udowodniliśmy twardymi dowodami, że można napisać kiepskie oprogramowanie bez testów jednostkowych. Uważam, że istnieją dowody na kiepskie oprogramowanie z testami jednostkowymi. Ale nie o to chodzi.

Testowanie jednostkowe lub programowanie sterowane testami (TDD) to technika projektowania, a nie technika testowa. Kod napisany na podstawie testów wygląda zupełnie inaczej niż kod, który nim nie jest.

Chociaż to nie jest twoje pytanie, zastanawiam się, czy naprawdę jest to najłatwiejszy sposób, aby pójść tą drogą i odpowiedzieć na pytania (i dostarczyć dowody, które mogą zostać zakwestionowane przez inne raporty), które mogą zostać źle zadane. Nawet jeśli znajdziesz twarde dowody w swojej sprawie - ktoś inny może znaleźć twarde dowody przeciwko.

Czy zadaniem liczników ziaren jest określanie, jak powinni pracować pracownicy techniczni? Czy zapewniają najtańsze narzędzia we wszystkich przypadkach, ponieważ uważają, że nie potrzebujesz droższych?

Argument ten jest albo wygrywany na podstawie zaufania (jedna z podstawowych wartości zespołów zwinnych), albo przegrywany w oparciu o siłę roli zwycięskiej strony. Nawet jeśli zwolennicy TDD wygrają w oparciu o siłę roli, uznałbym to za przegrane.

Olaf Kock
źródło
13
usłyszeć, usłyszeć :) Wiele twardych dowodów na TDD pochodzi również od bardzo doświadczonych zespołów, które już bez niego osiągały dobre wyniki. TDD po ​​prostu poprawiło swoje wyniki, zamiast tworzyć je z powietrza. Prawdziwy zwrot z inwestycji to zatrudnianie przyzwoitych programistów i pozwalanie im decydować, jak mają działać.
workmad3
„Czy zadaniem liczników fasoli jest określanie, jak powinni pracować ludzie techniczni?” -> wszystkie decyzje biznesowe sprowadzają się do pieniędzy. Mimo to dobra odpowiedź, +1
jcollum
@jcollum, ale to, jak wykonujesz swoją pracę, nie ma nic wspólnego z pieniędzmi, a jeśli chcesz, aby ktoś był odpowiedzialny, pozwól im zdecydować, JAK zrobią to, o co ich prosiłeś
Rune FS
TDD nie jest techniką projektowania, to tylko technika kodowania. blog.ploeh.dk/2010/12/22/TheTDDApostate Wielu komentatorów nie zgadza się, że TDD obejmuje refaktoryzację (która jest techniką projektowania), ale refaktoryzacja nie oznacza TDD. Można refaktoryzować bez testów, duże złożone refaktoryzacje i tak wpływają na testy jednostkowe, tj. Testy również muszą być refaktoryzowane, więc mogą również stać się nieważne / fałszywie zielone; prostsze refaktoryzacje wielu nie mają wpływu na testy, ale ryzyko błędu jest mniejsze - ponieważ refaktoryzacja jest prosta.
KolA
@Kol No cóż, z odbiciem 10,5 roku po tej odpowiedzi, mógłbym dziś sformułować to nieco bardziej defensywnie, ale mimo to: nie twierdzę, że TDD jest jedyną techniką projektowania, której kiedykolwiek będziesz potrzebować, a Mark otwiera się tym, że jest dobra technika projektowania, zanim stwierdzisz, że wcale nią nie jest. Chciałbym osłabić swoją opinię i powiedzieć, że to nie musi być tylko technika projektowania. Każdy kod, który kiedykolwiek napisałem TDD, wygląda inaczej niż kod, który napisałem bez. Nazwałbym to wynikiem projektu. Najlepiej pracuję z tablicą, dyskusjami i innymi narzędziami oprócz TDD. Ale dzięki za link
Olaf Kock
6

Więcej o TDD niż stricte jednostkowym testowaniu, tutaj jest łącze do Uświadomienia sobie poprawy jakości poprzez rozwój oparty na testach: wyniki i doświadczenia czterech zespołów przemysłowych , autorstwa Nagappana, E. Michaela Maximiliena, Thirumalesh Bhat i Laurie Williams. artykuł opublikowany przez grupę Microsoft Empirical Software Engineering and Measurement (ESM) i już wspomniany tutaj.

Zespół odkrył, że zespoły TDD stworzyły kod, który jest od 60% do 90% procent lepszy (pod względem gęstości defektów) niż zespoły bez TDD. Jednak zespoły TDD potrzebowały od 15% do 35% więcej czasu na ukończenie swoich projektów.

filant
źródło
5

Oto świetna i zabawna lektura faceta, który zmienia swoją firmę od wewnątrz. Nie ogranicza się do TDD. http://jamesshore.com/Change-Diary/ Zauważ, że od dłuższego czasu nie przekonał „fasolkowych liczników” i zamiast tego zastosował „taktykę partyzancką”.

Epaga
źródło
link wygląda interesująco ... warto sprawdzić re: zmiana procesów pracy organizacji ...
paskudny pasty
5

Aby dodać więcej informacji do tych odpowiedzi, istnieją dwa źródła metaanalizy, które mogą pomóc w określeniu wpływu wydajności i jakości na doświadczenie akademickie i branżowe:

Wstęp redaktorów gościnnych: TDD - sztuka nieustraszonego programowania [ link ]

Wydaje się, że wszyscy badacze zgadzają się, że TDD zachęca do lepszego skupienia się na zadaniach i pokrycia testów. Sam fakt większej liczby testów niekoniecznie oznacza, że ​​jakość oprogramowania będzie lepsza, ale zwiększona uwaga programistów na projekt testów jest jednak zachęcająca. Jeśli postrzegamy testowanie jako próbkowanie bardzo dużej populacji potencjalnych zachowań, więcej testów oznacza dokładniejszą próbkę. W zakresie, w jakim każdy test może znaleźć ważny problem, którego żaden z pozostałych nie może znaleźć, testy są przydatne, zwłaszcza jeśli można je przeprowadzić tanio.

Tabela 1. Podsumowanie wybranych badań empirycznych rozwoju sterowanego testami: uczestnicy branży *

https://www.computer.org/cms/Computer.org/dl/mags/so/2007/03/figures/s3024t1.gif

Tabela 2. Podsumowanie wybranych badań empirycznych TDD: uczestnicy akademiccy *

wprowadź opis obrazu tutaj

Wpływ rozwoju opartego na testach na zewnętrzną jakość i produktywność: metaanaliza [ link ]

Abstrakcyjny:

Ten artykuł zawiera systematyczną metaanalizę 27 badań, które badają wpływ programowania sterowanego testami (TDD) na jakość i produktywność kodu zewnętrznego.

Wyniki wskazują, że ogólnie TDD ma niewielki pozytywny wpływ na jakość, ale niewielki lub żaden dostrzegalny wpływ na produktywność. Jednak analiza podgrup wykazała, że ​​zarówno poprawa jakości, jak i spadek produktywności są znacznie większe w badaniach przemysłowych w porównaniu z badaniami akademickimi. Większy spadek produktywności stwierdzono w badaniach, w których różnica w wysiłku testowym między TDD a procesem grupy kontrolnej była znacząca. Większą poprawę jakości zaobserwowano również w badaniach akademickich, gdy różnica w nakładzie testu jest znaczna; nie można było jednak wyciągnąć żadnych wniosków dotyczących badań przemysłowych ze względu na brak danych.

Na koniec zbadano wpływ doświadczenia programisty i rozmiaru zadania jako zmiennych moderujących i stwierdzono statystycznie istotną dodatnią korelację między rozmiarem zadania a stopniem poprawy jakości.

Dariusz Woźniak
źródło
4

Cóż, jest kilka dużych firm, które wymagają używania testów jednostkowych, ale jeśli jesteś małą firmą, po co naśladować duże?

Dla mnie, kiedy zacząłem od testów jednostkowych, wiele lat temu (dziś używamy głównie modelu zachowania ), było to spowodowane tym, że nie mogłem kontrolować całej ścieżki w jednej aplikacji.

Byłem przyzwyczajony do programowania od dołu i REPL, więc kiedy dostałem test jednostkowy (jeden test dla każdej funkcji), było to jak przywrócenie REPL do języków, które są bardzo mocno kompilowane. To przywróciło zabawę do każdego wiersza kodu, który napisałem. Czułem się bogiem. Lubię to. Nie potrzebowałem raportu, aby powiedzieć mi, że zacząłem pisać lepszy kod szybciej. Mój szef nie potrzebował raportu, żeby to zauważyć, ponieważ robiąc szalone rzeczy, nagle nigdy nie przegapiliśmy terminu. Mój szef nie potrzebował raportu, aby zauważyć, że liczba „zwykłych” błędów spada z (do wielu) do prawie zera z powodu tej bardzo dziwnej rzeczy związanej z pisaniem nieproduktywnego kodu.

Jak już napisał inny plakat, nie używasz TDD do testowania (weryfikacji). Piszesz go, aby uchwycić specyfikację, zachowanie tego, co działa twoja jednostka (obiekt, moduł, funkcja, klasa, serwer, klaster).

Istnieje wiele niepowodzeń i historii sukcesów związanych z przejściem na inny model tworzenia oprogramowania w wielu firmach.

Po prostu zacząłem go używać, gdy miałem coś nowego do napisania. Jest takie stare powiedzenie, które ciężko mi przetłumaczyć na angielski, ale:

Zacznij od czegoś tak prostego, że nie zauważysz, że to robisz. Trenując do maratonu zacznij od przejścia 9 metrów i biegu 1 metr, powtórz.

Jonke
źródło
Więc powinienem to zrobić? Gwarantujemy, że zadziała i nie ma znaczenia, czy nikt inny nie zrobi tego ze mną?
raven
Właściwie to jest test Joela: joelonsoftware.com/articles/fog0000000043.html . Wydaje mi się, że możesz mieć więcej problemów niż brak nagrody Nobla Study On Unit Test
Jonke
4

Istnieją statystyki, które dowodzą, że naprawienie błędu znalezionego w teście jednostkowym / integracyjnym kosztuje wielokrotnie mniej niż naprawienie go już w systemie live (opierają się na monitorowaniu tysięcy rzeczywistych projektów).

Edycja : na przykład, jak wskazano, książka „ Code Complete ” opisuje takie badania (paragraf 20.3, „Względna skuteczność technik jakości”). Ale są też prywatne badania w dziedzinie doradztwa, które również to potwierdzają.

Gabriele D'Antona
źródło
1
Jest to omówione w Code Complete Steve'a McConnella , czyli książce, którą prawdopodobnie chcesz mieć na półce z innych powodów.
Robert Rossney,
Nie jest to związane z metodą testowania, ale z tym, kiedy w procesie zgłaszany jest błąd, a ponadto lepiej byłoby poświęcić czas na znajdowanie błędów w specyfikacjach, ponieważ koszt ich naprawy podczas wyszukiwania podczas opracowywania jest raportowany nawet 1000 razy jako kosztowny (a współczynnik 10 na fazę rozwoju)
Rune FS
OTOH, jeśli naprawisz tylko problemy, które ludzie faktycznie napotykają w rzeczywistych sytuacjach, prawdopodobnie będziesz musiał naprawić znacznie mniej błędów. Nie jest też dla mnie jasne, że naprawianie błędów wcześniej jest naprawdę tańsze, ponieważ wykrycie błędu w specyfikacji może wymagać znacznie więcej wysiłku niż wykrycie tego samego błędu w implementacji, a wykrycie błędu jest częścią kosztu naprawy błędu. Jest to jedna z tych rzeczy, w które wszyscy po prostu wierzą, ponieważ brzmi to oczywiste, ale nigdy nie widziałem solidnego studium, które pokazałoby efekt.
LKM,
0

Mam do tego jeden zestaw punktów danych - z doświadczenia, które sprzedało mi testy jednostkowe.

Wiele księżyców temu byłem świeżo upieczonym absolwentem pracującym nad dużym projektem VB6 i miałem okazję napisać dużą część kodu procedury składowanej. Z podsystemu, który pisałem, stanowiło około 1/4 całej bazy kodu - około 13 000 LOC z około 50 KB.

Napisałem zestaw testów jednostkowych dla procedur składowanych, ale testowanie jednostkowe kodu interfejsu użytkownika VB6 nie jest tak naprawdę wykonalne bez narzędzi takich jak Rational Robot; przynajmniej wtedy nie było.

Statystyki z zapewniania jakości dotyczące tego artykułu wskazywały, że około 40 lub 50 usterek zostało zgłoszonych w całym podsystemie, z czego dwa pochodziły z procedur składowanych. To jedna wada na 6500 linii kodu w porównaniu z 1 na 1000–1200 w całym fragmencie. Należy również pamiętać, że około 2/3 kodu VB6 to standardowy kod do obsługi błędów i rejestrowania, identyczny we wszystkich procedurach.

Bez zbytniej zmiany kierunku można przypisać testom jednostkowym przynajmniej poprawę współczynnika defektów o rząd wielkości.

ConcernedOfTunbridgeWells
źródło