Jeśli testy jednostkowe są tak świetne, dlaczego nie robi tego więcej firm? [Zamknięte]


103

Pierwsza prawdziwa firma programistyczna, w której pracowałem, dotyczyła testów jednostkowych (NUnit). Nie wiem, czy wtedy byliśmy prawdziwymi zwolennikami tego zagadnienia - nie mam pojęcia, jak wyglądało nasze pokrycie kodu i pisałem większość testów jednostkowych. Od tego czasu natknąłem się na kilka firm, które przeprowadzają wiele testów, ale są to testy na krzesłach: polegają na obecności osoby, mają niską powtarzalność i małą szansę na złapanie błędów. Inna postawa jest taka: to było coś, co chcieli osiągnąć „w przyszłości”; zasadniczo kiedy pieniądze spadają z nieba.

Brakuje mi testów jednostkowych - to po prostu ułatwia życie. Ale odkrywam, że kiedy szukam nowej pracy, testy jednostkowe są czymś, z czym firmy chciałyby się „zacząć” w przyszłości lub czymś, czego w ogóle nie robią (uhh, to było już od jakiegoś czasu teraz!). Powiedziałbym, że 60-75% wymagań pracy, na które patrzyłem w ciągu ostatnich 2 lat, w ogóle nie wymieniało testów jednostkowych. Przychodzi mi do głowy tylko jedna lub dwie osoby, które miały doświadczenie w testowaniu jednostkowym jako wymaganie (na stanowisko programisty średniego poziomu).

Więc pytanie brzmi, czego brakuje ? Myślę, że to sprawia, że ​​ludzie są bardziej produktywni, ale to dopiero po spędzeniu dużej ilości czasu na robieniu tego. Czy nie ma dobrych badań dotyczących oszczędności kosztów testów jednostkowych? Czy to jest rodzaj firmy, na którą patrzę?

Edycja: mimo że tytuł jest trochę zwolennikiem diabłów, uważam się za zwolennika testów jednostkowych.


W jakiej domenie pracujesz? Gdziekolwiek pracowałem, zawsze spotykałem się z testami jednostkowymi o różnej kompletności. Ale moje doświadczenie dotyczy obrazowania medycznego i przemysłowego, więc może to być powód ...
Kena

11
Testowanie krzesła: osoba siedzi na krześle, kieruje aplikacją, zgłasza błędy.
jcollum

3
@ Darknight powinien mieć 50 tys. Głosów pozytywnych za swoją uczciwość. Chodź stare głowy, sięgnij po dzisiejszy czas. Zachowaj te bzdury z testów jednostkowych w latach 90-tych, gdzie należy. Największa strata czasu. Jest to po prostu coś do poruszenia, abyś mógł wyglądać na ważnego, ale w większości przypadków absolutnie nic nie robi. Obecnie mamy coś, co nazywa się IDE, nie programujemy już na konsoli ani w notatniku. Wiemy, że nasz kod jest poprawny, ponieważ możemy najechać kursorem na tekst i zobaczyć wartości. Zachowaj testy jednostkowe w przeszłości ze wszystkimi innymi starymi licznikami czasu.
portfoliobuilder

1
@portfoliobuilder Tak, najechanie kursorem na wartości w środowisku IDE naprawdę pomoże poprawić jakość kodu. Ponieważ stan będzie zawsze taki sam, a kod nigdy się nie zmieni. Tak jest! I powodzenia.
Franz D.

1
@portfoliobuilder - zapomniałeś / s
ocodo

Odpowiedzi:


112

Z mojego doświadczenia wynika, że ​​jest na to kilka czynników:

  1. Kierownictwo tak naprawdę nie rozumie, czym tak naprawdę jest testowanie jednostkowe ani dlaczego ma dla niego rzeczywistą wartość wewnętrzną.
  2. Kierownictwo jest bardziej zainteresowane szybką dostawą produktów i (nieprawidłowo) postrzega testy jednostkowe jako szkodliwe dla osiągnięcia tego celu.
  3. Istnieje błędne przekonanie, że testowanie należy wyłącznie do funkcji kontroli jakości. Deweloperzy są programistami i nie mogą pisać testów.
  4. Istnieje powszechne błędne przekonanie, że kierownictwo będzie musiało wydawać pieniądze na prawidłowe przeprowadzanie testów jednostkowych, mimo że narzędzia są dostępne bezpłatnie. (Oczywiście programista musi wziąć pod uwagę czas na przyspieszenie, ale nie jest to zbyteczne).
  5. Odpowiedź Willa zaokrągli tę odpowiedź: Bardzo trudno jest określić wartość kodu testowego (edytuj jcollum)

Oczywiście istnieją inne czynniki, ale to jest to, na co do tej pory się natknąłem.


Tak, prawie opisałem moje zarządzanie i nie mamy testów.
Ty.

A obsługa tego w niektórych popularnych językach (C / C ++) jest słaba.
Martin Beckett

@mgb - CxxUnit działa dla mnie całkiem nieźle ...
Dominic Rodger

2
CxxTest jest również bardzo dobry. Ze względu na słabe mechanizmy odbicia w C ++ wydaje się, że prezentowane są bardziej zróżnicowane „rozwiązania”; CxxTest wymaga etapu wstępnego przetwarzania w systemie kompilacji, podczas gdy narzędzia takie jak TUT są całkowicie obsługiwane w czasie kompilacji i obsługiwane przez język, ale są niewygodne w użyciu.
Tom

2
Odkryłem, że użytkownicy stackoverflow.com mają skłonność do obwiniania zarządzania za wiele takich problemów. Kiedy pytałem moich prawdziwych przyjaciół o ich „problemy z zarządzaniem”, które się pojawiają, zwykle stwierdzałem, że nigdy nawet nie wyrazili swoich obaw kierownictwu, muszą mniej rozpoczynać kampanię mającą na celu zmianę punktów widzenia ludzi. Zamiast mówić „kierownictwo nie…”, próbuję się zastanowić, w jaki sposób mogę pomóc kierownictwu zobaczyć mój punkt widzenia i przekonać ich, że moje stanowisko jest prawidłowe. Myślę, że jest to problem, ponieważ programiści nie są dobrzy w sprzedaży testów jednostkowych.
Brian Stinar

87

1) To trudne
2) To wymaga czasu
3) Bardzo trudno jest określić wartość kodu testowego

Punkt 3 jest lepki. Dobre testy jednostkowe zmniejszają liczbę błędów. Ale tak samo jak dobry kod produkcyjny. Jak określić, ile błędów nie istnieje z powodu testów jednostkowych? Nie możesz zmierzyć tego, czego nie ma. Możesz wskazać studia, ale nie pasują one dobrze do arkusza kalkulacyjnego menedżera firmy.


11
„Dobre testy jednostkowe zmniejszają liczbę błędów. Ale dobry kod produkcyjny również.” - Dobre testy jednostkowe umożliwiają ulepszenie kodu produkcyjnego. Nawet jeśli kod jest początkowo zły, ale masz dobre pokrycie testowe, możesz z pewnością refaktoryzować system, aż kod będzie dobry.
Esko Luontola

1
Esko, oprócz dobrego pokrycia, musisz mieć również dobre testy, które faktycznie coś testują. Mógłbyś mieć 100% pokrycia kodu i właściwie testować bardzo niewiele
Jacob Adams,

Doskonała odpowiedź! Powiedziałeś to samo, co moja odpowiedź, w znacznie mniejszej liczbie słów.
Wedge

2
Tak, testy jednostkowe wymagają czasu. Ale to samo dotyczy „losowych napraw błędów”. Właściwy programowanie sterowane testami ma „wszystkie” funkcje „udokumentowane” w testach. Jeśli testy są zielone, produkt działa zgodnie z przeznaczeniem (z wyjątkiem problemów z użytecznością itp.). Z mojego doświadczenia wynika, że ​​prawie w ogóle nie ma to wpływu na całkowity czas rozwoju. Spędzasz więcej czasu na rzeczach i naprawiasz je za pierwszym razem, a nie po czasie spędzonym na naprawianiu błędów.
Arve Systad

1
Nie. Przez ten sam czas otrzymuję 3-4 razy więcej kodu produkcyjnego / funkcji z taką samą liczbą błędów na funkcję. To różni się w zależności od dewelopera, ale zazwyczaj źli programiści również piszą złe testy i nadal popełniają wiele błędów, więc testy jednostkowe nie poprawiają jakości ich kodu - tylko je spowalniają. Testy nigdy nie dowodzą braku błędów, a w najlepszym przypadku ich obecności.
KolA,

71

Łatwo jest zrzucić całą winę na „zarządzanie”. Ale czy kierownictwo naprawdę mówi ci, żebyś specjalnie nie wykonywał testów jednostkowych?

Zarządzanie generalnie nie mówi (i prawdopodobnie nie powinno) mówić Ci, jak wykonywać swoją pracę, czy jest to modularyzacja, abstrakcyjne typy danych, wzorce projektowe czy testy jednostkowe. Są to narzędzia handlowe, które stosuje odnoszący sukcesy, kompetentny inżynier oprogramowania, ale kiepski inżynier tego nie robi.

Myślę, że prawdziwa odpowiedź na twoje pytanie brzmi: testowanie jednostkowe jest naprawdę trudne, a studenci informatyki nie są do tego przygotowywani.

Jest to łatwe, gdy piszesz własną klasę ciągów. Kiedy testujesz rzeczywisty produkt, napotykasz wyzwania, o których nikt ci nie powiedział na slajdach PowerPoint:

  • Interakcja z użytkownikiem. Połowa aplikacji to logika interfejsu użytkownika. Jak to przetestować w sposób zautomatyzowany, aby nie zepsuło się, jeśli przesuniesz przycisk?
  • Interakcja z zewnętrznymi interfejsami API i frameworkami. Jeśli piszesz sterownik jądra systemu Windows, jak przetestujesz go jednostkowo? Czy piszesz kody pośredniczące dla każdej używanej funkcji IRP i jądra, skutecznie tworząc symulację jądra systemu operacyjnego?
  • Komunikacja sieciowa to rzecz XXI wieku. Jak koordynujesz test jednostkowy składający się z kilku rozproszonych komponentów?
  • Jak wybrać dobre przypadki testowe? Często widzę ludzi próbujących „robić przypadkowe rzeczy w pętli 1000 iteracji i zobaczyć, czy się zepsuje”. Kiedy to zrobisz, wysiłek jest większy niż zwroty, ważne błędy są pomijane, a testowanie jednostkowe jest porzucane.
  • Jak sprawdzić, czy wymagania dotyczące wydajności są spełnione?
  • Znajomość wzorców w testowaniu jest niewielka: fragmenty kodu, gotowe odpowiedzi, testy regresji to pojęcia, których większość ludzi nie zna. Ilu w Twoim miejscu pracy faktycznie czyta książkę o testach jednostkowych?

Jedyną rzeczą, za którą możemy winić kierownictwo, jest to, że specyfikacje wymagań rzadko zawierają wymagania dotyczące poziomu jakości dostarczanego produktu.

Następnym razem, gdy szef poprosi Cię o oszacowanie czasu, uwzględnij czas na napisanie testu jednostkowego i zobacz, co się stanie.


2
Dobry pomysł. Ale nie odwołuj się do czasu tworzenia testów jednostkowych oddzielnie od czasu tworzenia kodu „produktu”!
Jeff Kotula,

3
Przeczytanie tej odpowiedzi uświadomiło mi, że chociaż znam koncepcję i podstawy testów jednostkowych, tak naprawdę nie wiem, jak robić to skutecznie. Czy możesz polecić dobrą książkę na ten temat?
Breton,

1
Na jednym sterowniku jądra, nad którym pracowałem, zrefaktoryzowałem fragment kodu do biblioteki, którą połączyłem w wiązkę testową trybu użytkownika. Ten konkretny kod był niezależny od środowiska, więc był dość łatwy. Nie próbowałem tego, ale IRP, takie jak systemy plików i bazy danych, powinny być mockowalne.
George V. Reilly

1
Dzięki Bochs lub QEMU można napisać symulację swojego urządzenia, z którą będzie mógł rozmawiać sterownik jądra.
Zan Lynx

2
@floding, fascynująca odpowiedź. Myślę, że będę musiał przeczytać książkę o testach jednostkowych.
Dan Rosenstark

28

Większość testów niczego nie testuje.
Piszesz funkcję fileopen () i unittest, która kończy się niepowodzeniem, jeśli plik nie istnieje i powiedzie się, jeśli plik istnieje. Wspaniały! Czy teraz sprawdziłeś, czy działa z nazwą pliku w języku chińskim BIG5? na udziale NFS? w systemie Vista z plikiem na kluczu USB i włączoną kontrolą konta użytkownika?

Problem polega na tym, że testy jednostkowe są pisane przez tego samego programistę, który napisał funkcję, na tym samym zestawie założeń i na tym samym poziomie umiejętności. Aby testy naprawdę działały, muszą być napisane przez kogoś innego, tylko zgodnie z opublikowaną specyfikacją, bez oglądania kodu. - W większości firm samo napisanie specyfikacji byłoby przełomem!

Testy jednostkowe sprawdzają błędy w kodzie poszczególnych funkcji. Mogą pracować dla warstw dostępu do danych, bibliotek matematycznych itp., Gdzie dane wejściowe / wyjściowe są dobrze znane, a struktura wewnętrzna jest złożona, ale w wielu przypadkach są one tylko stratą czasu.
Zawodzą, gdy błędy wynikają z interakcji między różnymi częściami kodu lub z systemem operacyjnym i użytkownikiem. Problemy, takie jak ustawienia wysokiego / niskiego DPI, zepsucia okna dialogowego lub zamiana ustawienia języka obcego na znak „.” i „,” zwykle nie są znalezione.


15
Myślę, że ta odpowiedź trochę mija się z celem. Testowanie jednostkowe i testowanie funkcjonalne nie są i nie powinny być tym samym.
Wedge

5
Brakuje elementu, który polega na tym, że testy jednostkowe to nie tylko jedna rzecz do zrobienia. Jeśli później dowiem się, że muszę naprawić błąd za pomocą funkcji fileopen () w udziale NFS, mogę dodać test do mojego zestawu testów w tym celu. Następnie, kiedy w przyszłości zajmie się bardziej programowaniem, przeprowadzam testy regresji.
Paul Osborne

2
Wiele błędów powstaje w wyniku interakcji poza kodem, o których programiści nie pomyśleli i nie można ich znaleźć, po prostu sprawdzając kod. Typowym problemem z GUI są maszyny z bardzo wysokimi / niskimi ustawieniami DPI - możesz przetestować funkcję dialogową, ale nie zauważysz tego.
Martin Beckett

5
nie jest to jednak funkcja testu jednostkowego, a interakcja między różnymi częściami kodu jest bardzo testowalna jednostkowo i rzeczywiście, jeśli te części są pisane przez oddzielne zespoły, testowanie jednostkowe kodu w odniesieniu do współużytkowanego interfejsu i mockowanie komponentu innego zespołu jest dobre praktyki.
Steven Evers

1
TDD radzi sobie z sfałszowanym testem „programista, który napisał kod, a następnie pisze testy”, zmuszając Cię do napisania testów przed napisaniem kodu.
Ophidian


15

Znalazłem wielu programistów, którzy nie są zainteresowani testowaniem jednostkowym. Na początku zawsze wydaje się, że jest to dużo pracy z niewielkim zyskiem. Nikt nie chce zapisywać się do dodatkowej pracy, więc stawiają opór. Kiedy ludzie zaczynają, zwykle entuzjastycznie się tego trzymają, ale rozpoczęcie ich może być trudne.


12

Pomijając kwestię przyjęcia testów jednostkowych, testy jednostkowe nie zawsze są warte zachodu, chociaż generalnie myślę, że tak jest, gdy są właściwie stosowane. W testach jednostkowych nie ma nic specjalnego, co uchroni je przed podatnością na słabą konstrukcję.

Testy jednostkowe wiążą się z kosztami (tworzenie, konserwacja i uruchamianie) i są opłacalne tylko wtedy, gdy zapewniają większe korzyści niż te koszty. Tworzenie testów to umiejętność jak każda inna, wymaga określonego doświadczenia i wiedzy, aby odnieść sukces. Bez wystarczającego doświadczenia bardzo łatwo jest nawet doświadczonym programistom tworzyć testy jednostkowe niskiej jakości, niskiej wartości i / lub kosztowne, które nie są opłacalne. Zwłaszcza biorąc pod uwagę, jak trudno jest ocenić wartość testu jednostkowego.

Ponadto testowanie jednostkowe to tylko jeden ze sposobów na poprawę jakości kodu, ale nie jedyny. W pewnych okolicznościach iw przypadku niektórych zespołów może to nie być najskuteczniejszy sposób na podniesienie jakości oprogramowania.

Należy pamiętać, że wkładanie wiele wysiłku w testowanie jednostkowe nie gwarantuje jakości oprogramowania. Możliwe jest również wytwarzanie oprogramowania najwyższej jakości bez jakichkolwiek testów jednostkowych.


To, co mówisz, jest prawdą w językach zapisywanych statycznie. W językach dynamicznie wpisywanych są absolutnie krytyczne. Mam na myśli to, że bez testów twój kod jest prawie bezwartościowy. Uważam, że jest to duża część tego, dlaczego niektórzy ludzie tak wysoko cenią testy jednostkowe.
Bill K

11

Cóż, moja firma nie poszła na TDD ani testy jednostkowe. Szczerze mówiąc, nie wiemy, jak to zrobić. Możemy to oczywiście zrobić dla głupich funkcji, takich jak CapitalizeString (), itp., Ale nie wiemy, jak to zrobić w przypadku bardzo złożonych systemów ze skomplikowanymi obiektami. Ponadto większość ankietowanych osób ma zerowe lub ograniczone doświadczenie. Wygląda na to, że testy jednostkowe są popularne wśród tłumu SO, ale nie są szczególnie duże w dostępnej puli zadań.

TDD to osobny temat. Jesteśmy moralnie przeciwni TDD. Nie jesteśmy programistami kowbojami, ale wierzymy, że ogranicza to kreatywność i elastyczność w projekcie. Co więcej, posiadanie kodera, który napisał funkcję testów jednostkowych, nie ma sensu. Kiedy coś robię, koduję wszystkie skrajne przypadki, które przychodzą mi do głowy. Potrzebuję innego mózgu do szukania rzeczy, które mogłem przegapić. Nie mamy tego. Zespoły są małe i samodzielne.

Krótko mówiąc, nie wierzymy w TDD, ale chcielibyśmy przeprowadzić testy jednostkowe. Po prostu nie mamy doświadczenia, aby to zrobić i nie możemy go łatwo znaleźć.


1
Kiedyś w miejscu, w którym pracuję, było wystarczająco dużo programistów, robiliśmy programowanie w parach. Zauważyłem, że bardzo efektywne jest pisanie testów tak, jak zakodowano drugą. Doprowadziło to również do bardzo inteligentnych pytań dotyczących kodu.
Zan Lynx

4
Punktem TDD, którego wydaje się brakować, jest to, że zapisujesz wszystkie przypadki graniczne w swoim teście jednostkowym. Dla każdego przypadku napisz asercję w teście jednostkowym. Następnie, jeśli twój rzeczywisty kod nie przejdzie przez asercję, wiesz, że twój kod zawiera błąd i nieprawidłowo zaimplementowałeś swoją logikę. Ponieważ jednostki są małe, a asercja testuje określony kod w jednostce, powinno być łatwo określić, gdzie jest błąd logiczny. Ważne jest, aby najpierw napisać swoje twierdzenia. Następnie przeprowadź kod. Czy możesz wskazać, gdzie ten proces hamuje cokolwiek poza rozwojem błędów?
Christopher Parker,

3
Próba przeprowadzenia testu jednostkowego bez uprzedniego napisania testów będzie bardzo trudna. Dzieje się tak, ponieważ twój kod będzie trudny do retrospektywnego wprowadzenia do wiązki testowej. Jest to jedna z głównych zalet pierwszego testowania: projekt jest testowalny od samego początku, ponieważ testy kierowały projektem.
Alan Christensen

3
Jak to możliwe, że nie masz pewności, jak przeprowadzić testy jednostkowe, ale uważasz, że TDD hamuje kreatywność i elastyczność?
jcorcoran

1
@Steve 6 lat później, byłoby miło wiedzieć, czy kiedykolwiek wprowadziłeś testy jednostkowe (lub nawet TDD) i czy nadal to robisz.
Luke Puplett

11

Istnieje wiele firm, które tak naprawdę nie robią nic zgodnie z najlepszymi praktykami. Żadnych recenzji kodu, żadnych testów jednostkowych, żadnych planów testowania, nic, tylko przy siedzeniu ich spodni.

Skorzystaj z okazji, aby skłonić ich do korzystania z platformy Continuous Integration i tworzenia testów jednostkowych! Łatwy sposób, aby zaimponować mocom i jednocześnie zwiększyć jakość i stabilność kodu

Edycja: Jeśli chodzi o powód, myślę, że po prostu nie są świadomi obecnych narzędzi, które sprawiają, że CI i testy jednostkowe są niezwykle łatwe.


Zazwyczaj jestem w sytuacji, w której nie mam żadnego wpływu na takie decyzje polityczne; Jestem młodszym senatorem i jestem zdominowany przez przewodniczących komisji.
jcollum

Uruchomienie Hudsona i napisanie testów jednostkowych zajmuje kilka minut. Jeśli testy jednostkowe znajdują się już na liście „TODO”, po prostu wykonujesz swoją pracę. Komitety są często pod wrażeniem fantazyjnych wykresów i zdjęć, więc pokaż im ładne wykresy trendów z Hudson;)
Allen Rice,

Tak! Posłuchajmy tego za prawdę. Mimo że my, programiści, spędzamy cały czas na omawianiu najlepszych praktyk, nie zawsze są one używane w prawdziwym świecie. Szkoda, naprawdę.
NeedHack

Lekarze nie pytają, czy powinni myć ręce, prawda?
ocodo

6

Z tego, co widziałem, wiele firm ma ogromne, wysoce powiązane bazy kodu, których praktycznie nie można testować jednostkowo. Nie mają również przyzwoitych testowalnych wymagań, więc testy jednostkowe będą testować pod kątem rzeczywistych wymagań „powykonawczych”.


To zasługuje na więcej głosów. Kod, który został zaprojektowany zgodnie z zasadą „jaki jest projekt” / „Po prostu zrób to !!” w wyniku czego duża kula błota nie będzie miała separacji / modułowości (tj. jednostek ), dlatego jest odporna na testy jednostkowe . Jedną z zalet pierwszego testowania jest to, że modułowość staje się automatyczna. Jedną z katastrofalnych konsekwencji braku testów jest to, że prawdopodobnie nie będzie możliwe przetestowanie kodu w przyszłości.
ocodo

6

Nie sądzę, by lenistwo było główną przyczyną złych testów jednostkowych. Dla mojej firmy ograniczenia czasowe i postawa „po prostu zrób to sam” są największymi przeszkodami dla przeprowadzania testów jednostkowych. Ponadto miejsca, w których nasze systemy zawodzą, są zwykle bardziej na poziomie integracji (usługi, dostęp do baz danych, złożone zapytania, które wymagają określonych danych do testowania), a nie na „poziomie jednostki”. Te rzeczy są po prostu trudniejsze do przetestowania, a jeśli ledwo masz wystarczająco dużo czasu, aby wykonać tę funkcję, prawdopodobnie nie będziesz miał czasu na wykonanie żadnych przydatnych testów w tym samym czasie.


To jest powszechne. Myślę, że argument jest taki, że jeśli myślisz, że kiedykolwiek zmienisz to w przyszłości, powinieneś mieć test, który upewni się, że działa po zmianie.
jcollum

6

Testowanie jednostkowe powinno być naturalną częścią przepływu pracy tworzenia kodu, podobnie jak kompilator.

Wymaga to jednak edukacji kierownictwa w zakresie korzyści płynących z testowania jednostkowego. Młodsi deweloperzy mają jednak stosunkowo niewielkie szanse na taki wpływ. Zatem to, czy firma jest zwolennikiem testów jednostkowych, zależy od tego, czy ma starszego programistę lub architekta, który jest zwolennikiem testów jednostkowych.

Myślę, że jest to odpowiedź na Twoje pytanie „czego brakuje i dlaczego nie więcej firm przeprowadza testy jednostkowe” . :-)


1
+1 dla „powinno być naturalną częścią przepływu pracy przy tworzeniu kodu”. Każdy profesjonalny programista powinien wykonywać tam własne testy jednostkowe, niezależnie od oficjalnego procesu. Jedynym uzasadnionym argumentem w tej kwestii jest definicja jednostki .
Dunk

1
@Dunk Jeśli nie zdefiniujesz „jednostki”, to mówisz tylko, że „profesjonalni programiści powinni przeprowadzać własne testy”.
ChrisW

1
@ChrisW - Tak, profesjonalni programiści powinni przeprowadzać własne testy. Nie ma powodu, dla którego programista kiedykolwiek oddałby kod, którego nie przetestował wystarczająco, aby mieć pewność, że działa poprawnie. Niestety, wielu programistów wydaje się tego wymagać zbyt wiele.
Dunk

1
Kiedy mówię, że definicja jednostki jest uzasadnionym argumentem, mówię o szczegółowości jednostki. Czy to klasa? Czy to zbiór zajęć? Czy to składnik? Myślę, że testowanie jednostkowe na poziomie klasy (z pewnymi wyjątkami) kosztuje więcej niż przynosi korzyści i prowadzi do wielu bezsensownych testów ...
Dunk,

które inni wskazali w tym wątku. Natomiast jeśli zdefiniuje się zbiór klas, które współpracują ze sobą jako jednostka, nadal można wykonywać testy automatyczne, a testy są generalnie bardziej znaczące, ponieważ mogą bardziej skupić się na wymaganej funkcjonalności wyższego poziomu.
Dunk

5

Prawdopodobnie jest to połączenie kilku rzeczy, o których już wspomniałeś. Trudno jest zmierzyć oszczędności kosztów TDD. Jeśli chcesz zlecić outsourcing IT, możesz pokazać, ile płacisz rocznie za pracowników, w porównaniu z kosztami zawarcia umowy; jest bardzo konkretny. Jak powiesz: „Och, ten test wykrył błąd, którego debugowanie i naprawianie zajęłoby mi 4 godziny…”?


Jak możesz się domyślić, ile czasu zajmie debugowanie i naprawianie błędu. Generalnie debugowanie jest bardziej losowe niż to z mojego doświadczenia - zdarza mi się mieć pojęcie, gdzie jest problem, a gdzie nie.
Dominic Rodger

1
Tak, dlatego powiedziałem, że tak trudno jest oszacować korzyści płynące z testowania.
Ovi Tisler

5

Powodem, dla którego w niektórych miejscach go nie używają, jest po prostu to, że zarówno rozpoczęcie, jak i kontynuacja wymagają dużo pracy. Fakt, że pisanie testów jednostkowych zajmuje mniej więcej tyle samo czasu, co pisanie rzeczywistej funkcjonalności, wydaje się niektórym menedżerom, że zmniejszasz produktywność programisty o połowę.

Oprócz tego budujesz zespół (lub kogoś), kto musi zainstalować infrastrukturę i ją utrzymywać.

Jak mówi Alan , wiele miejsc po prostu nie stosuje najlepszych praktyk - chcą po prostu zobaczyć coś namacalnego.


5

Myślę, że programista musi po prostu zacząć to robić. Kilka prostych testów na początek można łatwo uzasadnić jako część rozwoju.

Coś w rodzaju testu jednostkowego jest prawie zawsze konieczne, aby uzyskać szybki debugowanie. Po prostu wyjaśnij, o ile szybciej można uruchomić test, niż ustawić poprawne dane wejściowe, ustawić punkt przerwania debuggera, uruchomić aplikację itp.

Udokumentuj test w swoim kodzie. Po prostu umieść komentarz wyjaśniający, gdzie jest test i jak go uruchomić. Przyszli programiści zobaczą to i miejmy nadzieję, że testy się rozprzestrzenią!


4

Testy jednostkowe to jedno z tych terminów z czarnej skrzynki, które większość ludzi słyszała, ale nie wiem, co dokładnie składa się na test jednostkowy, od czego zacząć, jak je napisać, jak właściwie przeprowadzać testy, co dokładnie powinny testować itp. . itd itd.

W wielu przypadkach niepewnym programistom łatwiej jest po prostu odrzucić je jako niepotrzebne lub jako oblodzenie, którego potrzebują tylko „programiści na poziomie przedsiębiorstwa”.


4

Jestem wielkim fanem testów jednostkowych, a także partnerem w firmie realizującej projekty kontraktowe dla różnych typów klientów. Za miesiąc zajmiemy się 3-4 różnymi projektami o różnej wielkości.

Jeśli wydaje się, że projekt będzie jednorazowy, nie zamierzam dużo inwestować w testy jednostkowe, ponieważ te testy jednostkowe nie opłaca się mojej firmie. W tego typu projektach zamierzam przeprowadzić testy jednostkowe rzeczy, których nie jestem pewien / nie znam lub które mogą się często zmieniać (na przykład parser dla źródła danych, którego nie kontroluję).

Natomiast jeśli buduję coś, o czym wiem, że będzie miało długą żywotność, jest to większe dzieło, nad którym będę pracował przez wiele iteracji, lub będzie miało duży wpływ na moich klientów, jeśli wystąpi błąd , Zamierzam zainwestować w więcej testów jednostkowych. Ponownie priorytet testów obraca się wokół niepewnego / nieznanego / zmieniającego się kodu.

Myślę, że testy jednostkowe powinny kręcić się wokół złożoności zadania, a także tego, czy się opłacą. Nie ma sensu pisać dodatkowego kodu, który nie zostanie wykorzystany.


3

Z mojego doświadczenia wynika, że ​​tak naprawdę zależy to od oprogramowania, które piszesz. Zauważyłem, że pisanie testów jednostkowych dla interfejsu użytkownika jest niezwykle trudne. Używam testów jednostkowych tylko dla części systemu, które mają określone wejście / wyjście.


Zgadzam się. Jeśli używasz modelu / widoku / kontrolera, bardzo sensowne jest przetestowanie modelu i kontrolera. Interfejs użytkownika jest prawie zawsze najlepiej testowany przez człowieka.
Zan Lynx

Testy komponentów są odpowiednikiem testów jednostkowych w interfejsie użytkownika. Mogą również istnieć testy jednostkowe „logiki biznesowej” używanej przez interfejs użytkownika. Logika biznesowa w tym sensie jest zwykle logiką prezentacji. Tam, gdzie testy interfejsu użytkownika i testy jednostkowe nie są zgodne, znajduje się w obszarze renderowania i testowania renderowanych danych wyjściowych. np. jak mam przetestować ten generator kodów QR lub ten wykres kołowy? Odpowiedź brzmi: z całą pewnością nie będziesz tego testować jednostkowo. W takich przypadkach testy migawkowe mogą zapewnić wartość testów regresji.
ocodo

3

Brakuje mi testów jednostkowych - to po prostu ułatwia życie.

To nie jest naprawdę jest wystarczający powód, aby firma przyjęła testy jednostkowe.

Wystarczającym powodem może być „tańszy” (i / lub „lepszy”): co nie jest tak łatwe do udowodnienia w przypadku testów jednostkowych.

Jedynym dobrym powodem może być „pisanie testów jednostkowych to najlepsze wykorzystanie czasu programistów”, co jest naprawdę trudne do udowodnienia w IMO: i może być prawdą w niektórych miejscach, w przypadku niektórych programów, z niektórymi programistami, a nie w innych.

Jest wielu programistów, którzy nie myślą o świecie testów jednostkowych: w tym tacy, którzy uważają, że inne formy testowania (np. Zautomatyzowana integracja / testy funkcjonalne) mogą być tańsze i bardziej wartościowe, na przykład Czy jestem jedynym programistą, który tego nie robi? t jak testy jednostkowe?


3

Oczywiście w idealnym świecie nie można argumentować przeciwko przeprowadzaniu testu jednostkowego.

Jednak to, czy napiszesz test jednostkowy, zależy od wielu rzeczy:

  • W jaki sposób oprogramowanie będzie używane. Gdybyś pisał oprogramowanie tylko dla siebie, czy napisałbyś testy jednostkowe? Prawdopodobnie nie. Jeśli piszesz gotowe oprogramowanie do sprzedaży komercyjnej, prawdopodobnie tak.

  • Ile osób obsługuje kod… jeśli jesteś tylko Ty, możesz go znać na tyle dobrze, aby po wprowadzeniu zmiany mieć pewność, że szybkie przejrzenie kodu jest wystarczające, aby upewnić się, że nic się nie zepsuło. Jeśli inne osoby, które pierwotnie nie pisały kodu, muszą go teraz utrzymywać, test jednostkowy pomoże im przekonać się, że kiedy zaktualizują kod w celu naprawienia dużego (który oczywiście nie został przechwycony w teście jednostkowym!), Niczego nie zepsuli. .

  • złożoność kodu: tylko kod testowy, który wymaga testu. Metoda przypisywania zmiennych w jednym wierszu nie wymaga testowania. Prawdopodobnie działa metoda 50-liniowa z wieloma ścieżkami wykonania.

  • Praktyczne rozważania komercyjne: Faktem jest, że pisanie testów jednostkowych zajmuje więcej czasu niż nie. Jeśli piszesz oprogramowanie prototypowe, które ma niepewną komercyjną przyszłość, to jest opłacalne między szybkim posiadaniem kodu, który teraz działa wystarczająco dobrze, a posiadaniem kodu przetestowanego jednostkowo w 2 tygodnie, który działa lepiej. Czasami opłaca się szybko dowiedzieć się (apetyt konsumentów), czy oprogramowanie będzie miało krótką półkę i przejść do następnego projektu.

i jak zauważyli inni, test jest tak dobry, jak osoba, która go napisała.


3

Głównym powodem jest to, że wielu programistów i menedżerów ds. Rozwoju nie ma pojęcia, że ​​istnieją testy jednostkowe ani jak z nich korzystać.

Drugim powodem jest to, że testy jednostkowe można stosować (w rozsądny sposób) tylko z kodem, który już spełnia pewne standardy jakości. Są szanse, że jakaś istniejąca baza kodów nie należy do tej kategorii.

Trzeci powód to lenistwo i / lub taniość.


3

Ponieważ testy jednostkowe są przydatne tylko wtedy, gdy napiszesz testowalny kod. A pisanie testowalnego kodu jest trudne. A ludzie są leniwi i / lub tani.

EDYCJA: dopracowany „leniwy” jako „leniwy i / lub tani”; W rzadkich przypadkach ludzie mają umiejętności, zdolności i wolę pisania testów, ale mają coś innego do zrobienia, co bardziej bezpośrednio wpływa na wynik finansowy.


Głosowałbym za tym, ale nie uważam, że ludzie są „leniwi”. Myśl „programowanie”, tj. „Twój popularny język programowania i powiązane narzędzia, dokumenty, szkolenia, przepływy pracy, rzeczy” nigdy nie zostały zaprojektowane w sposób, który ułatwiłby pisanie testowalnego kodu. Aby napisać testowalny kod, zawsze musisz pójść o krok dalej. Bez nagrody „ponieważ już działa” w tym momencie (więc pisanie testów najpierw, kod później, TDD, ma praktyczny sens). Sądzę, że jest to raczej błąd poznawczy, który oszukuje nie tylko obecnych programistów, ale już oszukał autorów narzędzi „programistycznych”, na podstawie których programiści teraz budują.
n611x007,

1
Tak, oczywiście, czasami ludzie są tani / spłukani / mają lepsze rzeczy do roboty (lub, jak to grzecznie powiedzieliśmy, „mają kompromisy do zrobienia”). Zredagowano, aby to odzwierciedlić. (Już miałem żartobliwie dodać, że poza tym większość kodu jest bezużyteczna, więc testowanie go też jest bezużyteczne; ale to po prostu brak rozmawiania przez sen;))
phtrivier

2

Myślę, że część problemu polega na tym, że programiści oczekują od ludzi biznesu tego samego zestawu wartości i naprawdę zależy im na odpowiedzi na pytanie „czy powinniśmy testować jednostkowo, czy nie?”. Nie otrzymujemy wcześniej zgody firmy na używanie języka wysokiego poziomu zamiast języka asemblera - jest to zwykle rozsądny sposób na wykonanie pracy.

Chodzi o to, że jesteśmy jedynymi uprawnionymi do wykonania telefonu (co nie oznacza, że ​​wszyscy mamy taką samą wiedzę na dany temat). Co więcej, nawet jeśli Twój zespół, z powodów politycznych, nie przeprowadza testów jednostkowych (lub nie określa swojej-metody-dnia), generalnie nie oznacza to , że nie możesz tego zrobić.

Prawda jest taka, że ​​nie możemy naprawdę udowodnić zwrotu z inwestycji w większości rzeczy, które robimy ze zbyt dużą szczegółowością. Dlaczego testy jednostkowe są utrzymywane na tym nierozsądnym / nietypowym standardzie dowodu, jest poza mną ...


Potrzebujesz jednak zaangażowania kierownictwa, ponieważ musisz zaangażować swoich współtwórców, a najlepszym sposobem, aby to się stało, jest wymaganie odgórne.
John

2

Ludzie są leniwi i przyjmują zmianę tylko wtedy, gdy są do tego zmuszeni.


2

Moje 2 centy:

  • Wymaga pewnego wykształcenia i dyscypliny, ale nowi absolwenci przychodzą już z odpowiednią wiedzą.
  • Narzuty związane z testami można zmniejszyć dzięki lepszym narzędziom i to się również dzieje (refaktoryzacja itp.)

Więc to tylko kwestia czasu.

Trwa debata Martin-Coplien, w której Bob Martin twierdzi, że:

„obecnie nieodpowiedzialne jest wysyłanie przez programistę linii kodu, których nie wykonał w teście jednostkowym”.

[ http://www.infoq.com/interviews/coplien-martin-tdd]


2
Nie wierzę w istnienie złożonego, rzeczywistego systemu, w którym każda linia kodu byłaby objęta testami jednostkowymi.
quant_dev

2

Jeśli chcesz sprzedać wszystkim testowanie, wykonaj następujące czynności:

  1. Napisz kilka testów.
  2. Powiadom innych programistów, którzy zmieniają kod i nie zdają testu (-ów).
  3. Naprawią swój kod.
  4. Teraz możesz wydać bez tych konkretnych błędów.

Nawet kierownik mógłby to zrozumieć.


Testy jednostkowe nie spowodują, że Twoje wydanie będzie wolne od błędów. Może to zmniejszyć liczbę błędów, ale strasznie trudno jest zmierzyć liczbę błędów, które / nie trafiły / trafiły do ​​produkcji z powodu testów.
Tom

Nie wiem, czy zarząd byłby zadowolony, gdyby ktoś napisał kilka testów, podczas gdy mógłby kodować nowe funkcje. Jeśli nie ma ich na pokładzie TDD, prawdopodobnie będziesz mieć kłopoty z napisaniem testów obejmujących kod, którego nie napisałeś.
jcollum

@jcollum Jak zwykle zależy to od stosunku kosztów do zysków.
quant_dev

2

Firmy nie przeprowadzają testów jednostkowych z tego samego powodu, dla którego wiele stron internetowych jest napisanych źle - ignorancja i ludzie trzymający się starych nawyków. W mojej firmie, odkąd rozpoczęliśmy testy jednostkowe (z Nunit i Typemock ), osiągamy większe pokrycie kodu i wypuszczamy oprogramowanie w krótszym czasie na rynek.


2

Podobnie jak większość dobrych pomysłów, przyjęcie ma więcej wspólnego z zależnością od ścieżki organizacyjnej niż z jakością pomysłu.

W większości firm, które dostarczyły produkty, utworzono znaczący dział kontroli jakości z kierownikiem wyższego szczebla ds. Kontroli jakości. Testowanie to lenno zespołu ds. Kontroli jakości.

Zespół ds. Kontroli jakości raczej nie napisze kodu testów jednostkowych, ponieważ firma zazwyczaj nie zatrudnia zespołu ds. Kontroli jakości za pomocą zaawansowanych programistów.

Zespół programistów niechętnie pisze kod testowy, ponieważ powoduje to konflikt z zespołem QA.

Widziałem większe zainteresowanie i przyjęcie testów jednostkowych w grupach, w których kontrola jakości nie została wydzielona do oddzielnej funkcji zawodowej


1

Proste pisanie i aktualizowanie testów jednostkowych kosztuje. W większości firm poprzednie oprogramowanie nie ma testów jednostkowych i jego napisanie będzie zbyt drogie. Więc nie robią tego, a to wydłuża proces programowania, więc nie dodają go również do nowych funkcji.


Powinieneś przeczytać linki dotyczące zwrotu z inwestycji.
jcollum

1

Większość firm jest bezużyteczna. Oczywiście nie ten, dla którego ty (lub ja) pracujesz.


To nie daje odpowiedzi na pytanie. Aby skrytykować lub poprosić autora o wyjaśnienie, zostaw komentarz pod jego postem.
AlexVogel

P: „Dlaczego więcej firm nie przeprowadza [testów jednostkowych]?” O: „Ponieważ większość firm jest bezużyteczna”. Brzmi jak odpowiedź dla mnie ...
Roger Lipscombe
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.