Czy programiści są złymi testerami?


36

Wiem, że to brzmi jak inne pytania, które już zostały zadane, ale w rzeczywistości jest nieco inne. Wydaje się, że ogólnie uważa się, że programiści nie są dobrzy w wykonywaniu roli testowania aplikacji. Na przykład:

Joel on Software - Pięć najlepszych (błędnych) powodów, dla których nie masz testerów (moje wyróżnienie)

Nawet nie myśl o próbie powiedzenia absolwentom CS college'u, że mogą przyjść dla ciebie pracować, ale „zanim przejdziesz do kodowania, wszyscy muszą trochę przećwiczyć kontrolę jakości. Widziałem dużo tego. Programiści nie robią dobrych testerów , a stracisz dobrego programistę, którego znacznie trudniej wymienić.

I w tym pytaniu jedna z najpopularniejszych odpowiedzi mówi (ponownie, moje podkreślenie):

Programiści mogą być testerami, ale nie powinni być testerami. Programiści zwykle mimowolnie / nieświadomie unikają korzystania z aplikacji w sposób, który mógłby ją uszkodzić. To dlatego, że to napisali i przeważnie testują, w jaki sposób należy go używać.

Pytanie brzmi, czy programiści źle sprawdzają się podczas testowania? Jakie są dowody lub argumenty na poparcie tego wniosku? Czy programiści źle radzą sobie z testowaniem własnego kodu? Czy istnieją dowody sugerujące, że programiści są naprawdę dobrzy w testowaniu?

Co mam na myśli przez „testowanie”? Ja nie średnią testów jednostkowych lub niczego, co jest uważane za część metodologii stosowanej przez zespół oprogramowania do oprogramowania zapisu. Mam na myśli jakąś metodę zapewnienia jakości, która jest używana po zbudowaniu kodu i wdrożeniu go na czymkolwiek, co zespół oprogramowania nazwałby „środowiskiem testowym”.


17
@jshowter Programiści najgorzej testują własny kod, a genialni - testując inny kod. Testerzy (dobrzy testerzy) sami są programistami na swój sposób (ponieważ muszą zrozumieć logikę programowania i jego funkcjonalność), z tym wyjątkiem, że nie piszą zbyt dużo kodu. Uważam, że ma to więcej wspólnego z psychologią, ponieważ zawsze waham się przed wątpliwościami w mojej pracy, jakkolwiek by to nie było złe.
Ubermensch

6
@Ubermensch, domyślnie nie zgadzam się z tym, że programiści są świetnymi testerami kodu innych użytkowników. Niektórzy programiści są, ponieważ przez jakiś czas ćwiczyli testowanie. Wymaga to również innego sposobu myślenia i motywacji, co w ogóle nie jest oczywiste dla programistów. Wielu programistów skupia się na - i cieszy się najbardziej - części kodującej i może nie docenić, a nawet być świadomym, znaczenia innych działań w ramach pełnego SDLC.
Péter Török

1
@ jshowter Jeśli szukasz twardych faktów / danych z badań, nie mogę ich znaleźć. Większość literatury dotyczy rozwoju zwinnego i nie mogła znaleźć takiej, która pasowałaby do konkretnego przypadku. Możesz spróbować w Google Scholar lub Scirus.
Ubermensch

3
Nie jesteśmy złymi testerami! DZIAŁAŁO na moim komputerze! ;-)
Joris Timmermans

2
@MadKeithV Ha! To jest mój awatar JIRA (tracker problemów);)
yannis

Odpowiedzi:


39

Wydaje się, że pytanie dotyczy konkretnie testowania systemu , więc do tego mam na myśli w tej odpowiedzi.

Myślę, że należy wprowadzić rozróżnienie między byciem złym człowiekiem, który chce przeprowadzić testowanie, a byciem złym w testowaniu.

Dlaczego programiści źle radzą sobie z testowaniem:

  • Jeśli napisałeś kod, powinieneś (aś) pomyśleć o tak wielu możliwych sposobach, aby coś poszło nie tak, i poradziłeś sobie z nimi.
  • Jeśli znalezienie szczególnie drobnego błędu oznacza, że ​​musisz go naprawić, w bazie kodu, której możesz mieć dość, to nie pomoże twojej motywacji.

Dlaczego programiści są dobrzy w testowaniu:

  • Programiści są zwykle logicznymi myślicielami i dobrze pracują w sposób systematyczny.
  • Doświadczeni programiści będą bardzo dobrzy w szybkim identyfikowaniu przypadków skrajnych, a tym samym wymyślaniu przydatnych testów. (Jeśli istnieje sformalizowany proces testowania, większość wszystkich tych przypadków powinna już zostać zidentyfikowana i przetestowana przed testowaniem systemów).
  • Programiści są całkiem dobrzy w upewnianiu się, że wszystkie przydatne informacje trafiają do raportu o błędzie.

Dlaczego programiści są złymi testerami:

  • Programiści są drożsi niż testerzy (w zdecydowanej większości przypadków).
  • Sposób myślenia jest zasadniczo inny: „Zbuduj (działający) produkt” w porównaniu z „Ta rzecz nie wychodzi za drzwi z żadnymi (nieznanymi) błędami”.
  • Testerzy zazwyczaj będą bardziej wydajni - tj. Wykonają więcej testów w tym samym czasie.
  • Programiści specjalizują się w programowaniu. Specjaliści ds. Kontroli jakości specjalizują się w testowaniu.

4
Zauważ, że logiczne myślenie programistów może być szkodliwe dla bycia dobrym testerem. Ile razy widziałeś programistę, który reagował „ale to niemożliwe!” w obliczu znalezionego błędu? Tylko po to, by dowiedzieć się, że przeoczyli coś poważnego w swoim rozumowaniu, które sprawiło, że błąd był „niemożliwy”.
Joris Timmermans

2
@CraigYoung - jasne jest, że jest to błędne myślenie logiczne, ale jest to bardzo częste (systemy są złożone). Chodzi o to, że podczas testowania nie powinieneś używać logicznego myślenia, aby wyeliminować „niepotrzebne” testy, i deweloperom trudno jest uniknąć tego rodzaju myślenia.
Joris Timmermans

3
+1 Świetna, zrównoważona odpowiedź. Wyjaśnia również, dlaczego kombinacja między automatycznymi testami jednostkowymi a testami integracyjnymi napisanymi przez programistów wraz z testowaniem systemu przez kontrolę jakości jest najlepszą kombinacją.
Danny Varod

1
+1 za „sposób myślenia jest zasadniczo inny”. Są to w końcu różne role z powiązanymi (ale różnymi) zestawami umiejętności.
joshin4colours

3
@MadKeithV Logiczne myślenie ma zasadnicze znaczenie w testowaniu, podobnie jak eliminowanie niepotrzebnych testów. Czy myślisz o testach typu black-box vs. white-box? W testach czarnych skrzynek opracowujesz testy na podstawie wymagań bez wiedzy o implementacji. Aby sprawdzić błędne założenia, błędną logikę itp. Programiści IMHO są w tym dobrzy , pod warunkiem, że nie znają implementacji. W szczególności, jeśli napisali kod i popełnili błędy, są nieuchronnie skłonni do popełniania tych samych błędów w testach. Testowanie systemu powinno być testem czarnej skrzynki.
MarkJ

19

Myślę, że programiści źle sprawdzają swój kod .

Chcemy wierzyć, że nasz kod działa idealnie zgodnie z wymaganiami i testujemy go jako taki. W moim przypadku testujemy własny kod, a następnie testujemy siebie nawzajem, zanim przejdziemy do rzeczywistego cyklu testowego, i wykryto w ten sposób znacznie więcej błędów niż tylko testowanie własnego kodu


1
Moje dwa centy. Programiści zwykle testują tylko ostatnie zmiany, ostatnią poprawkę, ostatnią funkcję, zrobili (ja zrobiłem), aw niektórych przypadkach oni (my) są trochę ślepi lub leniwi, aby przetestować inną funkcję.
Andrea Girardi

11

Programiści są zdecydowanie właściwymi ludźmi do testowania niektórych części systemu - w niektórych miejscach są jedynymi, którzy mogą to zrobić skutecznie.

Jedno miejsce, w którym programiści są bardzo źli w testowaniu, to cały bit „używaj interfejsu użytkownika jak zwykły użytkownik” - nie są zwykłymi użytkownikami i nie zachowują się tak jak oni. Na przykład:

  • Programiści zazwyczaj bardzo dobrze radzą sobie z wpisywaniem tekstu. Dość częstym problemem, który widzę, są spacje wiodące lub szczególnie końcowe. Większość ludzi nie wydaje się im, ale dobrzy programiści prawdopodobnie religijnie podchodzą do tego, aby ich ciągi były odpowiednie dla siebie, bez obcych przestrzeni.
  • Programiści są zazwyczaj klawiszowcami, wykorzystując tabulatory i inne skróty, aby przyspieszyć pracę. Zwykli użytkownicy chwytają mysz między polami.
  • Programiści zwykle rozumieją, co mówi im system, zamiast ignorować komunikaty o błędach i po prostu klikając OK.

Zatem normalni użytkownicy robią wiele rzeczy, których nie robią programiści. UAT nie może całkowicie polegać na zespole deweloperów.


3
Dodatkowy przykład twojego pierwszego punktu: Nasi użytkownicy mają tendencję do kopiowania z MS Word, który wstawia dziwne rzeczy, takie jak em-dash i inteligentne cytaty - co czasami psuje biblioteki, których nie napisaliśmy. Nikt z nas nigdy nie jest nawet w Słowie, więc przypadek użycia prawie nie przychodzi nam do głowy, a co dopiero testowany.
Izkata

1

Na poziomie technicznym (testy jednostkowe, testy integracyjne, testy regresji) programiści są prawdopodobnie jedynymi wykwalifikowanymi osobami, które mogą być testerami, ponieważ tego rodzaju testy są zautomatyzowane i dlatego powinny być zautomatyzowane, co wymaga programowania.

Ale nie sądzę, że o tym mówisz, i jestem prawie pewien, że nie to też oznacza Joel Spolsky - pozostaje ta część, faktyczne ręczne testowanie: przekształcenie dokumentu wymagań i specyfikacji funkcjonalnej w skrypt testowy, a następnie skrupulatnie wykonujący ten skrypt na gotowym produkcie.

Bycie dobrym testerem wymaga cech, które są w większości ortogonalne w stosunku do tych, które są dobrym programistą. Jest trochę nakładania się - musisz być w stanie myśleć analitycznie, potrzebujesz pewnego pokrewieństwa z komputerami w ogóle - ale poza tym umiejętności testera są bardzo różne. To samo w sobie nie oznacza, że ​​możesz mieć oba zestawy umiejętności, a tak naprawdę całkiem sporo osób prawdopodobnie ma. Jednak bycie naprawdę dobrym programistą wymaga pewnego lenistwa (chęci zautomatyzowania obowiązków), podczas gdy naprawdę dobry tester potrzebuje wytrwałości (sprawdź wszystkie trzy tysiące pól formularza pod kątem niespójności), aw konsekwencji nawet tych programistów, którzy mieć to, czego potrzeba, aby zostać testerem, zwykle brzydzi się tym pomysłem.

A potem jest selektywne uprzedzenie: programista, który jest już zaangażowany w projekt, nawet jeśli tylko marginalnie, ma już pewną wiedzę wewnętrzną na temat bazy kodu i będzie miał trudności z podejściem do niego z pustym umysłem, z perspektywy użytkownika końcowego . Nie musi to być nawet wyraźne, ponieważ w „Wiem, że ten przycisk działa, więc po prostu zauważę„ pass ”; może być znacznie bardziej subtelny, a te subtelne efekty mogą prowadzić do pominięcia krytycznych przypadków krawędziowych w testach.


1

Z mojego doświadczenia wynika, że ​​tak, programiści są złymi testerami. Zbyt często widziałem, jak inni i ja mówili „Huh, ale przetestowałem to, zanim się zameldowałem!” gdy skonfrontowany przez testera odtwarzającego błąd przed tobą.

Czemu? Cóż, nie jestem pewien, dlaczego tak jest, ale może dlatego, że chcemy, aby wszystko działało. Lub chcemy po prostu przejść przez testowanie tej lub innej funkcji już.

W każdym razie, testowanie nie jest umiejętnością, której się nauczyliśmy i nie pracujemy jako programista, ponieważ jesteśmy dobrzy w łamaniu funkcji. Możemy również nie mieć pojęcia, jak właściwie zaplanować testy lub wykonać inne czynności związane z kontrolą jakości. Nie jesteśmy już wykwalifikowani do wykonywania pracy testera, niż tester jest uprawniony do wdrożenia nowego potoku renderowania 3D.

Jak w pytaniu, testowanie nie oznacza niczego zautomatyzowanego, ale testowanie za pomocą programu.


1

Istnieje kilka poziomów testowania. Testy „niskiego poziomu” mogą i muszą być wykonywane przez programistów. Myślę na testach jednostkowych.

Z drugiej strony, testy „wysokiego poziomu” to zupełnie inna sprawa. Ogólnie rzecz biorąc, myślę, że programiści są złymi testerami, nie dlatego, że brakuje im umiejętności, ale dlatego, że bardzo trudno zmienić sposób myślenia i sposób pracy za kilka razy.

Próbuję testować jak najszersze kody, ale po co najmniej 10 minutach wykonanych przez testera pojawia się coś, co można rozważyć pod kątem błędu lub ulepszenia. Oznacza to, że testowanie czegoś, co tworzysz, jest ciężką pracą. Wiesz, gdzie kliknąć, wiesz, kiedy kliknąć, znasz logikę biznesową, prawdopodobnie wiesz, jak dane są utrwalane. Jesteś bogiem, którego nigdy nie upadniesz.


0

Jakie masz na myśli testy? Jeśli masz na myśli kompleksowe, wyczerpujące testy, to mógłbym zobaczyć kilka uzasadnień dla powiedzenia tak, ale podejrzewam, że większość ludzi byłaby uboga w tej kategorii, gdyby wziąć pod uwagę wszystkie możliwe kombinacje danych wejściowych jako wymóg dla takich testów.

Mogę przyznać, że twórca oprogramowania, który projektuje oprogramowanie, może mieć wizję tunelową, jeśli chodzi o obsługę kodu i zignorować niektóre możliwe przypadki graniczne, których po prostu nie wzięto pod uwagę. Na przykład, jeśli zbuduję formularz internetowy, który przyjmuje liczbę, n, a następnie drukuje od 1 do n na ekranie, mogę przegapić pewne szczególne przypadki, takie jak jeśli nic nie zostanie wprowadzone lub coś, co nie jest liczbą naturalną, np. E lub pi . To, co program ma zrobić w takich przypadkach, może budzić wątpliwości.

Rozwój oparty na testach byłby przykładem metodologii programistycznej, która stawia testy w innym świetle, co może dać inny pogląd tutaj.


Dzięki, że o to pytasz. Zaktualizowałem swoje pytanie, aby powiedzieć, co uważam za testowanie. Zasadniczo testowanie to rzeczy, które mają miejsce po zbudowaniu i wdrożeniu oprogramowania, a nie podczas programowania (jak testowanie jednostkowe) lub jako część metodologii programistycznej (jak przegląd partnerski).
jhsowter

0

Programiści dobrze definiują testy, gdy definiują testy przed napisaniem kodu. Z praktyką stają się jeszcze lepsi.

Jednak podczas definiowania testów napisanego kodu nie radzą sobie zbyt dobrze. Będą mieli te same martwe punkty podczas testowania, co podczas pisania kodu.

Używanie programistów do ręcznego testowania jest po prostu głupie. Testowanie ręczne jest samo w sobie głupie; zmuszanie programistów do robienia tego jest wyjątkowo głupie. Jest drogi i odstrasza kompetentnych programistów.


Chociaż opowiadam się za pisaniem testów jednostkowych i integracyjnych, nie widzę, jak TDD (lub pisząc najpierw testy) to rozwiązuje. Jeśli napiszesz główne scenariusze sukcesu przed kodem, prawdopodobnie nie znajdziesz większości błędów. Musisz pomyśleć o wszystkich rzeczach, które mogą pójść nie tak. Napisałem kod, który może pomóc w znalezieniu niektórych z nich, ponieważ możesz przeglądać gałęzie i metody, które wywołujesz, aby zobaczyć, co może je złamać.
Danny Varod

Ponadto wiele błędów, które zauważyłem przez programistów, były związane z kolejnością wywołań API. Coś, czego nie obejmuje większość testów jednostkowych, zwłaszcza jeśli nie wiesz, jakie inne metody można by nazwać, które mogą mieć wpływ na testowaną (i która nie została jeszcze zaimplementowana).
Danny Varod

@ Danny: w TDD powinieneś pisać gałęzie lub metody tylko w odpowiedzi na test zakończony niepowodzeniem, i pisać tylko kod niezbędny do zaliczenia testu zakończonego niepowodzeniem.
kevin cline

Znam metodologię TDD, po prostu nie zgadzam się z wnioskami.
Danny Varod

0

Jednym z rodzajów testów, na których szczególnie widziałem devloperów, jest testowanie, czy warunek został spełniony. To, co devlopers uważają za coś wymaganego, a co testerzy uważają za to, to często dwie zupełnie różne rzeczy.

Mogę pomyśleć o jednym niedawno, w którym develoepr został poproszony o dokonanie eksportu delta, a twórca pomyślał, że oznacza to uzyskanie wszelkich rekordów, które nie zostały wysłane ani razu, a testerzy uznali, że oznacza to uzyskanie nowych zapisów i zmian. Musieli wrócić do klienta, aby dowiedzieć się, kto miał rację. Dokonałem przeglądu kodu i przyjąłem takie samo założenie, jak deweloper odnośnie do wymagań. Ponieważ logicznie, jeśli chcesz uwzględnić aktualizacje, wspomniałbyś o nich. I zazwyczaj jestem dobry w wykrywaniu tych dwuznacznych rzeczy, ponieważ kiedyś byłem po stronie użytkownika.

Więc inni deweloperzy przeprowadzający testy mieliby tendencję do przyjmowania wielu takich samych założeń, ponieważ oni również przyjmowali pewne założenia, takie jak: „mieliby więcej szczegółów, gdyby mieli na myśli X vice Y, ponieważ jest tyle szczegółów, na które należy odpowiedzieć, zanim będę mógł to zrobić Ale twórcy wymagań nie myślą w ten sposób. Więc ktoś, kto myśli bardziej jak twórcy wymagań, musi przetestować założenia programisty, a osoba, która nie jest programistą, jest lepszym człowiekiem, aby nawet dostrzec, że jest jakiś problem.

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.