Jakie są wady testów automatycznych?


49

Na tej stronie znajduje się wiele pytań, które zawierają wiele informacji na temat korzyści, jakie można uzyskać dzięki automatycznym testom. Ale nie widziałem niczego, co reprezentowałoby drugą stronę medalu: jakie są wady? Wszystko w życiu jest kompromisem i nie ma srebrnych kul, więc z pewnością muszą istnieć ważne powody, aby nie przeprowadzać automatycznych testów. Czym oni są?

Oto kilka, które wymyśliłem:

  • Wymaga więcej początkowego czasu programisty dla danej funkcji
  • Wymaga wyższego poziomu umiejętności członków zespołu
  • Zwiększ potrzeby w zakresie oprzyrządowania (biegacze testowi, struktury itp.)
  • Wymagana jest kompleksowa analiza w przypadku napotkania nieudanego testu - czy ten test jest przestarzały z powodu mojej zmiany, czy mówi mi, że popełniłem błąd?

Edytuj
Powinienem powiedzieć, że jestem wielkim zwolennikiem testowania automatycznego i nie chcę się do tego przekonać. Chcę zrozumieć, jakie są wady, więc kiedy idę do mojej firmy, aby to uzasadnić, nie wyglądam, jakbym rzucił się wokół kolejnej wymyślonej srebrnej kuli.

Poza tym, ja nie szukam nikogo, kto by podważył powyższe przykłady. Przyjmuję za prawdę, że muszą być pewne wady (wszystko ma kompromisy) i chcę zrozumieć, co to są.


18
„Wymagana złożona analiza ...” test nie jest przyczyną niepowodzenia, jest wskaźnikiem. Powiedzenie, że nie ma testów oznacza, że ​​nie jest wymagana złożona analiza awarii, nie jest lepsze niż wbicie głowy w błoto.
P.Brian.Mackey

1
* dłuższy czas kompilacji, gdy testy są uruchamiane przy każdej kompilacji, i powtarzany kod, gdy testy są na bardzo niskim poziomie (testery pobierające i ustawiające)
maniak zapadkowy

2
1. Jeśli programista używa czasu do testowania nowych funkcji, ryzyko ich awarii spadło, co oznacza, że ​​Twój produkt jest bardziej stabilny. 2. Szkolenie członków zespołu w zakresie podejścia skoncentrowanego na testach jest dobrą rzeczą, mogą wykorzystać tę wiedzę do innych celów w pracy (i życiu). 3. Utwórz automatyczną instalację dla środowiska testowego 4. To mówi mi, że 1 test robi za dużo.
CS01

1
Jeśli ten sam programista koduje testy, tak jak koduje rzeczywisty kod, wówczas pomyślą tylko o tych samych testowych przypadkach do napisania testów, o których myślały podczas kodowania.
Paul Tomblin,

Właśnie opublikowałem odpowiedź na powiązane pytanie i czuję, że muszę przynajmniej skomentować to pytanie . IMO, prawie wszystkie wady wymienione tutaj (i w odpowiedziach) wyglądają na fałszywe i mylące, jeśli mówimy o prawdziwym projekcie na żywo, a nie o czymś, co szybko piszesz i zapominasz. Obawiam się, że takie pytanie może być pretekstem do opracowania bez testów automatycznych, aw wielu przypadkach doprowadzi to do śmierci projektu lub kompletnego połączenia.
Boris Serebrov

Odpowiedzi:


26

Prawie przybiłeś najważniejsze. Mam kilka drobnych dodatków, a także wadę udanych testów - kiedy tak naprawdę nie chcesz (patrz poniżej).

  • Czas programowania: w przypadku programowania opartego na testach jest to już obliczane dla testów jednostkowych, ale nadal potrzebujesz testów integracyjnych i systemowych, które również mogą wymagać kodu automatyzacji. Raz napisany kod jest zwykle testowany na kilku późniejszych etapach.

  • Poziom umiejętności: oczywiście narzędzia muszą być obsługiwane. Ale to nie tylko twój własny zespół. W większym projekcie możesz mieć oddzielny zespół testujący, który pisze testy w celu sprawdzenia interfejsów między produktem twojego zespołu a innymi. Tak wiele osób musi mieć więcej wiedzy.

  • Potrzeby w zakresie narzędzi: jesteś na miejscu. Nie wiele do dodania do tego.

  • Nieudane testy: To jest prawdziwy robal (dla mnie i tak). Istnieje kilka różnych powodów, z których każdy może być postrzegany jako wada. A największą wadą jest czas niezbędny do podjęcia decyzji, który z tych powodów faktycznie dotyczy twojego nieudanego testu.

    • nie powiodło się z powodu faktycznego błędu. (tylko dla kompletności, ponieważ jest to oczywiście korzystne)
    • nie powiodło się, ponieważ kod testowy został napisany z tradycyjnym błędem.
    • nie powiodło się, ponieważ kod testowy został napisany dla starszej wersji produktu i nie jest już zgodny
    • nie powiodło się, ponieważ wymagania uległy zmianie, a testowane zachowanie jest teraz uważane za „prawidłowe”
  • Testy zakończone niepowodzeniem: Są to również wady i mogą być dość złe. Dzieje się tak głównie wtedy, gdy zmieniasz rzeczy i zbliżasz się do odpowiedzi Adama. Jeśli zmienisz coś w kodzie produktu, ale test w ogóle go nie uwzględnia, daje to „fałszywe poczucie bezpieczeństwa”.

    Ważnym aspektem niezakończonych testów jest to, że zmiana wymagań może spowodować, że wcześniejsze zachowanie stanie się nieważne. Jeśli masz przyzwoitą identyfikowalność, zmianę wymagań można dopasować do kodu testowego i wiesz, że nie możesz już ufać temu testowi. Oczywiście utrzymanie tej identyfikowalności to kolejne wady. A jeśli tego nie zrobisz, zakończysz testem, który nie zawiedzie, ale faktycznie sprawdzi, czy Twój produkt działa nieprawidłowo . Gdzieś w dół drogi to cię uderzy ... zwykle kiedy / gdzie najmniej się tego spodziewasz.

  • Dodatkowe koszty wdrożenia: Nie uruchamiasz testów jednostkowych jako programista na własnym komputerze. Dzięki automatycznym testom chcesz wykonywać je na zleceniach innych osób w jakimś centralnym miejscu, aby dowiedzieć się, kiedy ktoś zepsuł twoją pracę. Jest to miłe, ale należy je także skonfigurować i utrzymywać.


1
W przypadku nieudanych testów, jeśli wymagania zmienią się, powodując, że bieżące testy zakończą się niepowodzeniem, test
kończy się pomyślnie,

W tym przypadku chodzi o rozwój oparty na testach: przypadek 4 (b): piszesz test zakończony niepowodzeniem, następnie rozszerzasz produkt, a następnie weryfikujesz, czy ta zmiana powoduje, że test się powiedzie. To chroni przed błędnie napisanym testem, który zawsze kończy się sukcesem lub zawsze kończy się niepowodzeniem.
Kilian Foth

@Dziękujemy za odpowiedź. Jest tam wiele wglądu. Szczególnie doceniłem rozróżnienie różnych przyczyn nieudanych testów. Dodatkowe koszty wdrożenia to kolejny doskonały punkt.
RationalGeek

Zabawną rzeczą, którą znalazłem, jest to, że mój błąd w stosunku do LOC jest znacznie gorszy w testach niż w prawdziwym kodzie. Spędzam więcej czasu na znajdowaniu i naprawianiu błędów testowych niż prawdziwych. :-)
Brian Knoblauch,

nie powiodło się, ponieważ kod testowy został napisany dla starszej wersji produktu i nie jest już zgodny - jeśli z tego powodu testy się psują, prawdopodobnie testy testują szczegóły implantacji, a nie zachowanie. CalculateHighestNumber v1 powinien nadal zwracać ten sam wynik co CalculateHighestNumber v2
Tom Squires

29

Właśnie zacząłem wypróbowywać automatyczne testy w naszym zespole, największą wadą, jaką widziałem, jest to, że bardzo trudno jest zastosować stary kod, który nie został zaprojektowany z myślą o automatycznych testach. Bez wątpienia poprawiłoby to nasz kod w dłuższej perspektywie, ale poziom refaktoryzacji potrzebny do zautomatyzowanego testowania przy jednoczesnym zachowaniu naszego rozsądku stanowi bardzo wysoką barierę wejścia na rynek w krótkim okresie, co oznacza, że ​​będziemy musieli być bardzo wybiórczy w kwestii wprowadzenia zautomatyzowanego testy jednostkowe w celu spełnienia naszych krótkoterminowych zobowiązań. Innymi słowy, o wiele trudniej jest spłacić karty kredytowe, gdy już jesteś głęboko zadłużony.


2
Jako ktoś, kto pracuje w 80% z bardzo dużej bazy kodu, nie mogłem się zgodzić. Jednak, aby to złagodzić, skorzystałem z niektórych z tego w [link] amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/... są warte obejrzenia.
DevSolo,

1
To naprawdę dobra książka, mam z tego wiele. Trzy główne punkty, spróbuj, trochę na raz. Niektóre dobre testy są lepsze niż brak testów. Pozostań w zasięgu, nie refaktoryzuj wszystkiego, co wymaga refaktoryzacji na raz. Wyraźnie określ, gdzie są granice między kodem testowalnym a testowalnym. Upewnij się, że wszyscy inni też to wiedzą.
Tony Hopkinson

21

Być może najważniejszą wadą jest ... testy to kod produkcyjny . Każdy napisany test dodaje kod do bazy kodu, który należy utrzymywać i obsługiwać. Niezastosowanie się do tego prowadzi do testów, w które nie wierzysz, więc nie masz innego wyjścia. Nie zrozum mnie źle - jestem wielkim zwolennikiem automatycznych testów. Ale wszystko ma swój koszt, a to jest duży.


Dobrze, Ross, to ciekawy sposób.
RationalGeek

Zgadzam się, chociaż i tak z mojego doświadczenia wynika, że ​​czas zaoszczędzony dzięki testom jednostkowym, które pozwalają na natychmiastowe wykrycie potencjalnych błędów w nowo napisanym kodzie (tj. Testach regresyjnych), przewyższył ten dodatkowy czas konserwacji.
dodgy_coder

15

Nie powiedziałbym, że są to wady, które można w pełni zastosować, ale te, na które najbardziej uderzyłem, to:

  • Czas potrzebny na skonfigurowanie testu w złożonej aplikacji dla przedsiębiorstw.
  • Obsługa starych testów, które nie powiedzie się poprawnie, innymi słowy, system ewoluował, a teraz testy są nieprawidłowe.
  • Fałszywa pewność wynikająca z niejednolitego lub nieznanego pokrycia testowego.

Nieprawidłowy zasięg testu może prowadzić do fałszywego poczucia bezpieczeństwa. Jeśli zrobisz refaktoryzację i użyjesz testów, aby udowodnić ich ważność, co dowiodło, że twoje testy są w stanie to udowodnić?

Czas potrzebny na utworzenie testu jest czasem dla nas problemem. Nasze zautomatyzowane testy obejmują nie tylko testy jednostkowe, ale także testy przypadków. Są one zwykle szersze i wymagają kontekstu.

Oczywiście moja perspektywa dotyczy aplikacji starszej niż testy jednostkowe.


OP zawierał już czas i przestarzały kod w pytaniu.
P.Brian.Mackey

@ P.Brian.Mackey faktycznie element czasu jest subiektywny. Czas potrzebny na kodowanie testu jest inny niż czas potrzebny na zrozumienie wymagań testu i poprawne kodowanie testu.
Adam Houldsworth

@AdamHouldsworth Dziękuję, to są dobre przykłady wad. Tak naprawdę nie zastanawiałem się nad kątem fałszywej pewności siebie.
RationalGeek

9

Powiedziałbym, że głównym problemem z nimi jest to, że mogą zapewnić fałszywe poczucie bezpieczeństwa . Tylko dlatego, że masz testy jednostkowe, nie oznacza to, że w rzeczywistości coś robią, co obejmuje również prawidłowe testowanie wymagań.

Ponadto zautomatyzowane testy mogą również zawierać same błędy , co stawia pytanie, czy testy jednostkowe wymagają samodzielnego testowania, więc niekoniecznie osiągnięcie niczego.


Test Driven Development pomaga w pierwszym, wymagając nieudanego testu przed napisaniem kodu opcji. Teraz wiesz, że jeśli funkcja się zepsuje, test się zepsuje. Po drugie, skomplikowanym kodem testowym jest zapach kodu. Ponownie, pisząc najpierw test, możesz starać się go uprościć i włożyć trudną pracę w kod funkcji, który naprawia test.
David Harkness

Trudny do przetestowania kod nie jest zapachem kodu. Najłatwiejszym do przetestowania kodem jest gigantyczny łańcuch wywołań funkcji udających klasę.
Erik Reppen

4

Chociaż testy automatyzacji mają wiele zalet, mają również swoje wady. Niektóre z wad to:

  • Wymagana jest biegłość w pisaniu skryptów testowych automatyzacji.
  • Debugowanie skryptu testowego jest poważnym problemem. Jeśli w skrypcie testowym występuje jakikolwiek błąd, czasami może to prowadzić do śmiertelnych konsekwencji.
  • Konserwacja testu jest kosztowna w przypadku metod odtwarzania. Mimo niewielkiej zmiany w graficznym interfejsie użytkownika skrypt testowy musi zostać ponownie zarejestrowany lub zastąpiony nowym skryptem testowym.
  • Utrzymanie plików danych testowych jest trudne, jeśli skrypt testowy testuje więcej ekranów.

Niektóre z powyższych wad często odejmują korzyści z automatycznych skryptów. Chociaż testy automatyzacji mają zalety i odciski, są szeroko dostosowane na całym świecie.


dzięki. Słuszne uwagi. Zredagowałem twój post pod kątem gramatyki i formatowania. Mam nadzieję, że nie masz nic przeciwko.
RationalGeek

3

Niedawno zadałem pytanie na temat testów w tworzeniu gier - oto BTW, skąd o tym wiedziałem. Odpowiedzi wskazywały na pewne ciekawe, konkretne wady:

  1. To jest kosztowne, gdy twój kod powinien być wysoce sprzężony .
  2. Trudno to zrobić, gdy trzeba być świadomym różnych platform sprzętowych, kiedy należy przeanalizować dane wyjściowe dla użytkownika, a wynik kodu ma sens tylko w szerszym kontekście .
  3. Testowanie interfejsu użytkownika i interfejsu użytkownika jest bardzo trudne .
  4. Co więcej, zautomatyzowane testy mogą być droższe i mniej skuteczne niż kilka bardzo tanich (lub bezpłatnych) beta testerów .

Czwarty punkt przypomina mi o moich doświadczeniach. Pracowałem w bardzo szczupłej, zorientowanej na XP firmie Scrum, w której wysoce zalecane były testy jednostkowe. Jednak na drodze do bardziej szczupłego, mniej biurokratycznego stylu firma po prostu zaniedbała budowę zespołu ds. Kontroli jakości - nie mieliśmy testerów. Tak często klienci znajdowali trywialne błędy przy użyciu niektórych systemów, nawet przy pokryciu testowym> 95%. Chciałbym więc dodać kolejny punkt:

  • Zautomatyzowane testy mogą sprawić, że poczujesz, że kontrola jakości i testowanie nie są ważne.

Pomyślałem też o dokumentacji i wysunąłem hipotezę, która może być ważna (w mniejszym stopniu) do testów dwóch. Po prostu czułem, że kod ewoluuje tak szybko, że bardzo trudno jest stworzyć dokumentację zgodną z taką prędkością, dlatego bardziej cenne jest spędzanie czasu na tworzeniu kodu niż pisanie ciężkiej, łatwo przestarzałej dokumentacji. (Oczywiście nie dotyczy to interfejsów API, ale tylko wewnętrznej implementacji.) Test cierpi z powodu tego samego problemu: może być zbyt wolny, aby pisać w porównaniu z testowanym kodem. OTOH, jest to mniejszy problem, ponieważ testy ostrzegają, że są nieaktualne, a twoja dokumentacja pozostanie cicha, dopóki nie przeczytasz jej bardzo, bardzo ostrożnie .

Wreszcie pojawia się problem: automatyczne testowanie może zależeć od narzędzi, a narzędzia te mogą być źle napisane. Jakiś czas temu zacząłem projekt przy użyciu XUL, a pisanie testów jednostkowych dla takiej platformy jest po prostu bolesne. Uruchomiłem inną aplikację przy użyciu Objective-C, Cocoa i Xcode 3, a model testowy na niej był w zasadzie mnóstwem obejść.

Mam inne doświadczenia na temat wad automatycznego testowania, ale większość z nich wymieniono w innych odpowiedziach. Niemniej jednak jestem zagorzałym zwolennikiem zautomatyzowanych testów. Pozwoliło to zaoszczędzić dużo pracy i bólu głowy i zawsze domyślnie go polecam. Uważam, że te wady są jedynie szczegółami w porównaniu z korzyściami z automatycznych testów. (Ważne jest, aby zawsze głosić swoją wiarę po skomentowaniu herezji, aby uniknąć auto da fé.)


3

Dwa nie wymienione to:

  • Czas potrzebny na uruchomienie dużego pakietu testowego

Brałem udział w automatycznych działaniach związanych z kontrolą jakości, w których testowanie trwało pół dnia, ponieważ testy były powolne. Jeśli nie jesteś ostrożny w pisaniu testów, Twój zestaw testów może się również okazać w ten sposób. To nie brzmi jak wielka sprawa, dopóki nie zarządzasz tym razem: „Och, właśnie dokonałem poprawki, ale udowodnienie poprawności zajmie 4 godziny”.

  • Słabość niektórych metod pisania testów

Niektóre metody testowania (takie jak zautomatyzowanie interfejsu użytkownika) wydają się łamać za każdym razem, gdy się odwracasz. Szczególnie bolesne, jeśli na przykład skrypt zawiesza proces testowania, ponieważ czeka na pojawienie się przycisku - ale jego nazwa została zmieniona.

Są to dwie rzeczy, nad którymi możesz się obejść, stosując dobrą praktykę testowania: znajdź sposoby na szybkie utrzymanie pakietu testowego (nawet jeśli musisz wykonywać sztuczki, takie jak dystrybucja przebiegów testowych między maszynami / procesorami). Podobnie, należy zachować ostrożność, aby uniknąć słabych metod pisania testów.


2

Chcę dodać jeszcze jedno, fałszywe poczucie bezpieczeństwa.

Poza bardzo małymi, dobrze zdefiniowanymi zestawami problemów, nie jest możliwe stworzenie kompleksowych testów. W naszym oprogramowaniu mogą nadal występować błędy, których automatyczne testy po prostu nie sprawdzają. Po zautomatyzowanym teście zbyt często zakładamy, że w kodzie nie ma błędów.


0

Trudno przekonać zarządzającego / venture capital

  • testautomation zwiększa koszty początkowe.
  • testautomation wydłuża czas wprowadzania na rynek.
  • korzyść z testautomacji pojawia się w połowie i logterm. zacięta konkurencja skupia się bardziej na krótkoterminowych korzyściach.

szczegółowe informacje można znaleźć w części Testowanie jednostek zależnych od rynku .


-1

Jedną z głównych wad można pokonać, stosując testy samokształcenia. W tej sytuacji oczekiwane wyniki są przechowywane jako dane i mogą być aktualizowane przy minimalnym przeglądzie przez użytkownika zestawu testów w trybie samouczenia się (pokazują różnice między starym oczekiwanym wynikiem a nowym faktycznym wynikiem - aktualizacja oczekiwana po naciśnięciu y). Tego trybu uczenia się testsuite należy używać ostrożnie, aby nie wykryć zachowania błędnego jako akceptowalnego.

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.