Dlaczego Cem Kaner uważa test nie ujawnienia błędu za stratę czasu?

15

A co z potwierdzeniem funkcjonalności w pozytywnych testach, udowodnieniem, że działa - czy powinienem powiedzieć, że to strata czasu? Jaka koncepcja kryje się za tym cytatem?

Nieudane testy, tj. Testy, które nie wykrywają błędów, są stratą czasu.

Inżynieria sieci: Dyscyplina systematycznego rozwoju aplikacji internetowych cytująca Cem Kaner .

John V.
źródło
2
Nie całkiem. Kaner twierdzi, że ogólnie testy powinny po prostu znaleźć defekty.
John V
4
To bardzo akademickie stanowisko. Pan Kaner i pan Schrödinger muszą kiedyś usiąść i napić się kawy.
Blrfl
2
@Blrfl jedynym problemem jest to, że pan Schrödinger nie żyje. Och, czekaj ... um ...
ikmac
1
To stwierdzenie bez kontekstu brzmi niesamowicie głupio ...
Przypomnienie z
1
„Potwierdzenie funkcjonalności w pozytywnych testach” - Jest to zasadniczo niemożliwe. Nie możesz udowodnić, że coś jest poprawne, możesz tylko udowodnić, że jest źle.
Konrad Rudolph

Odpowiedzi:

37

Większość testów oprogramowania komputerowego napisałem ponad 25 lat temu. Od tamtej pory wskazałem kilka części książki, które uważam za nieaktualne lub po prostu złe. Zobacz http://www.kaner.com/pdfs/TheOngoingRevolution.pdf

Możesz zobaczyć więcej (bieżące wyświetlenia, ale bez wyraźnych wskazówek z powrotem do TCS) na mojej stronie dla kursu testowania oprogramowania Black Box (filmy i slajdy dostępne za darmo), www.testingeducation.org/BBST

Kultura testowa była wówczas w dużej mierze potwierdzająca.

We współczesnych testach podejście do testów jednostkowych jest w dużej mierze potwierdzające - piszemy duże kolekcje testów automatycznych, które po prostu sprawdzają, czy oprogramowanie nadal działa zgodnie z przeznaczeniem. Testy służą jako detektory zmian - jeśli coś w innych częściach kodu i ta część ma teraz problemy, lub jeśli wartości danych, które kiedyś były niemożliwe w rzeczywistym świecie, docierają teraz do aplikacji, detektory zmian uruchamiają się, ostrzegając programista do problemu konserwacji.

Myślę, że sposób myślenia potwierdzającego jest odpowiedni do testowania jednostkowego, ale wyobraź sobie świat, w którym wszystkie testy systemu były potwierdzające (dla osób, które dokonują rozróżnienia, zinterpretuj „testy integracji systemu” i „testy akceptacji”, jak zawarto w moich komentarzach na temat systemu testowanie.) Punktem testowym było potwierdzenie, że program spełniał specyfikacje, a dominującym podejściem było zbudowanie zillionowych (lub co najmniej kilkuset) testów regresji na poziomie systemu, które odwzorowały części specyfikacji na zachowania programu. (Myślę, że potwierdzenie spec-to-zachowanie jest przydatne, ale myślę, że jest to niewielka część większego celu.)

Wciąż istnieją grupy testowe, które działają w ten sposób, ale nie jest to już dominujący pogląd. Tak było. Pisałem z naciskiem i rysowałem ostre kontrasty, aby zwrócić uwagę na ludzi, którzy byli konsekwentnie szkoleni w tym sposobie myślenia. Dzisiaj niektóre ostre kontrasty (w tym ten cytowany tutaj) są nieaktualne. Zostają źle zinterpretowani jako ataki na złe poglądy.

Moim zdaniem testowanie oprogramowania jest empirycznym procesem uczenia się związanych z jakością informacji o produkcie lub usłudze.

Test powinien być zaprojektowany w celu ujawnienia przydatnych informacji.

Nawiasem mówiąc, wtedy nikt nie mówił o testowaniu jako metodzie ujawniania „informacji”. W tamtych czasach testowanie polegało na wykrywaniu (niektórych wersji ...) błędów lub (niektórych wersjach ...) weryfikowaniu (sprawdzaniu) programu pod kątem specyfikacji. Nie sądzę, aby twierdzenie, że testy służą do ujawnienia użytecznych informacji, pojawiło się w słowniku testowym aż do tego wieku.

Wyobraź sobie testy ratingowe pod względem ich wartości informacyjnej. Test, który prawdopodobnie nauczy nas czegoś, czego nie wiemy o oprogramowaniu, miałby bardzo wysoką wartość informacyjną. Test, który najprawdopodobniej potwierdzi coś, czego się już spodziewamy i który został już wielokrotnie udowodniony, miałby niską wartość informacyjną. Jednym ze sposobów ustalenia priorytetów testów jest przeprowadzenie testów o wyższej wartości informacji przed testami o niższej wartości.

Gdybym nadmiernie uprościł tę priorytetyzację, aby przyciągnęła uwagę programisty, kierownika projektu lub kierownika procesu, który nie ma pojęcia o testowaniu oprogramowania, powiedziałbym: „TEST, KTÓRY NIE JEST PRZEZNACZONY DO WYKRYWANIA BŁĘDU, TO STRATY CZASU . ” To nie jest idealne tłumaczenie, ale dla czytelników, którzy nie rozumieją żadnej subtelności lub kwalifikacji, jest to tak bliskie, jak to możliwe.

Wtedy, i widzę to ponownie tutaj, niektórzy ludzie, którzy nie rozumieją testowania, odpowiedzieliby, że test zaprojektowany w celu znalezienia narożnych skrzynek jest stratą czasu w porównaniu z testem dużego wykorzystania ważnej funkcji. Nie rozumieją dwóch rzeczy. Po pierwsze, zanim testerzy znajdą czas na sprawdzenie wartości granicznych, główne zastosowania głównych funkcji zostały już wykonane kilka razy. (Tak, są wyjątki i większość grup testowych zwróci szczególną uwagę na te wyjątki.) Po drugie, powodem testowania z ekstremalnymi wartościami jest to, że program jest bardziej podatny na niepowodzenia z ekstremalnymi wartościami. Jeśli to nie zawiedzie skrajnie, testujesz coś innego. To skuteczna zasada. Z drugiej strony, jeśli NIE powiedzie się to przy ekstremalnej wartości, tester może zatrzymać się i zgłosić błąd lub tester może rozwiązać dalsze problemy, aby sprawdzić, czy program zawiedzie w ten sam sposób przy bardziej normalnych wartościach. Kto zajmuje się rozwiązywaniem problemów (tester lub programista), jest kwestią kultury korporacyjnej. Niektóre firmy budżetują na to czas testera, niektóre programiści, a niektórzy oczekują, że programiści naprawią problemy z przypadkowymi przypadkami, niezależnie od tego, czy są one uogólnione, czy też nie, aby rozwiązywanie problemów nie było istotne. Powszechne nieporozumienie - że testerzy tracą czas (zamiast maksymalizować wydajność) przez testowanie ekstremalnych wartości, to kolejny powód, dla którego „test, który nie jest przeznaczony do ujawnienia błędu, to strata czasu” jest odpowiednią wiadomością dla testerów. Jest to kontrapunkt dla zachęty ze strony niektórych programistów, aby (w efekcie) nigdy nie uruchamiać testów, które mogłyby zakwestionować program. Wiadomość jest uproszczona, ale cała dyskusja jest uproszczona.

Nawiasem mówiąc, „wartość informacyjna” nie może być jedynym systemem ustalania priorytetów. To nie jest moja zasada, kiedy projektuję zestawy testów jednostkowych. To nie jest moja zasada, gdy projektuję testy weryfikacyjne kompilacji (inaczej sprawdzanie poprawności). W obu tych przypadkach bardziej interesują mnie rodzaje zasięgu niż moc poszczególnych testów. Istnieją inne przypadki (np. Duże automatyczne testy, które są tanie w konfiguracji, uruchamianiu i monitorowaniu), w których moc poszczególnych testów jest po prostu nieistotna dla mojego projektu. Jestem pewien, że możesz wymyślić dodatkowe przykłady.

Ale jako ogólna zasada, gdybym mógł podać tylko jedną zasadę (np. Rozmowę z dyrektorem, którego głowa eksploduje, gdy próbuje przetworzyć więcej niż jedno zdanie), byłoby tak, że test niskiej wartości informacyjnej jest zwykle stratą czasu.

Cem Kaner
źródło
4
+1 za poświęcenie czasu, aby odpowiedzieć na pytanie, jesteś miarodajnym źródłem, a także sprawdzania moje użycie terminu „budować testów sprawdzających”, które tak wielu ludzi patrzy na mnie krzywo za korzystanie ... zawsze miło zobaczyć ludzi twojego wzrostu wymaga czasu, aby pomagać ludziom w okolicy
Jimmy Hoffa
1
Eric G: Myślę, że jeśli ponownie przeczytasz, zobaczysz, że Cem stwierdza, że ​​jako część czytelników rozumie, że jego pogląd na ten temat ewoluował z czasem. Lub możesz po prostu kontynuować i zignorować subtelność i kwalifikacje, parafrazując Cem. (i biorę „kwalifikacje” nie za jego referencje, ale jako wyjątki.)
Jim Holmes
Twój cytat przypomina mi coś, co zaobserwowałem w nauce: nie można udowodnić (ani nawet w znaczący sposób poprzeć) teorii naukowej, przeprowadzając eksperymenty, które powinny przynieść wyniki zgodne z teorią; sposobem na poparcie teorii jest podjęcie prawdziwego wysiłku w celu przeprowadzenia eksperymentów na urządzeniach, które jej nie poprą, ale nie będą w stanie tego zrobić.
supercat
@ supercat możesz wesprzeć teorię testem na coś spójnego z teorią, jeśli test nie pojawiłby się przed teorią (np. pokazanie przyspieszenia obiektu spadającego w próżni jest takie, jak można by to obliczyć mówi więcej niż pokazuje, że spada). Testy krawędziowe są analogiczne; Mogę oczekiwać, że oprogramowanie będzie działało poprawnie podczas radzenia sobie z ekstremalnymi wartościami, ale daje większą pewność co do jakości, aby zobaczyć, że tak się dzieje, niż powtarzanie wartości wejściowych, które prawdopodobnie widział podczas projektowania, a także większe prawdopodobieństwo znalezienia błędu.
Jon Hanna
@JonHanna: Moje sformułowania były kiepskie: problemem nie są oczekiwania, ale wysiłek. Nie można udowodnić teorii, próbując znaleźć testy, które przejdzie; trzeba podjąć prawdziwy wysiłek, aby znaleźć testy, których nie udałoby się, gdyby były nieważne.
supercat
11

Według Kanera chodzi o to, że „ponieważ skończy Ci się czas, zanim zabraknie przypadków testowych, ważne jest, aby maksymalnie wykorzystać dostępny czas”.

Koncepcja kryjąca się za cytatem została przedstawiona i szczegółowo wyjaśniona w artykule Testing Computer Software autorstwa Cem Kanera , Jacka Falka, Hung Quoc Nguyena, w rozdziale „CELE I OGRANICZENIA TESTOWANIA”:

DLACZEGO TEST?

Nie możesz znaleźć wszystkich błędów. Nie możesz udowodnić, że program jest poprawny i nie chcesz. Jest drogi, frustrujący i nie wygrywa żadnych konkursów popularności. Po co więc męczyć się testowaniem?

CELEM TESTOWANIA PROGRAMU JEST ZNALEZIENIE W NIM PROBLEMÓW

Znalezienie problemów jest podstawą twojej pracy. Powinieneś chcieć znaleźć jak najwięcej; im poważniejszy problem, tym lepiej.

Ponieważ skończy Ci się czas, zanim zabraknie przypadków testowych, ważne jest, aby wykorzystać dostępny czas tak skutecznie, jak to możliwe. Rozdziały 7,8,12 i 13 szczegółowo omawiają priorytety. Zasada przewodnia może być po prostu:


Test ujawniający problem jest sukcesem. Test, który nie ujawnił problemu, był stratą czasu.


Rozważ następującą analogię z Myers (1979). Załóżmy, że coś jest z tobą nie tak. Idziesz do lekarza. Powinien przeprowadzić testy, dowiedzieć się, co jest nie tak, i zalecić działania naprawcze. Prowadzi test za testem za testem. Na koniec nie może znaleźć nic złego. Czy jest świetnym testerem, czy niekompetentnym diagnostą? Jeśli naprawdę jesteś chory, jest niekompetentny, a wszystkie te drogie testy były stratą czasu, pieniędzy i wysiłku. W oprogramowaniu jesteś diagnostą. Program to (zapewne) chory pacjent ...


Widzisz, chodzi o to, że powinieneś mądrze ustalić priorytety swoich testów. Oczekuje Testowanie wziąć ograniczoną ilość czasu i niemożliwe do testu wszystko w danym czasie.

Wyobraź sobie, że spędziłeś dzień (tydzień, miesiąc) na przeprowadzaniu testów, nie znajdź żadnych błędów i pozwól, aby jakiś błąd przeszedł, ponieważ nie miałeś czasu na przeprowadzenie testu, który by to ujawnił. Jeśli tak się stanie, nie możesz po prostu powiedzieć „to nie moja wina, ponieważ byłem zajęty przeprowadzaniem innych testów”, aby uzasadnić tę chybienie - jeśli tak powiesz, nadal będziesz pociągany do odpowiedzialności.

Zmarnowałeś czas na przeprowadzanie testów, które nie ujawniły błędów, i z tego powodu przegapiłeś test, który znalazłby błąd.

(W przypadku Jeśli zastanawiasz się, tęskni, jak powyżej są zazwyczaj nieuniknione bez względu na to, jak spróbować, a tam sposoby radzenia sobie z nimi, ale to byłoby bardziej temat na oddzielną pytanie ... i prawdopodobnie lepsze dopasowanie do SQA. SE.)

komar
źródło
12
Ta odpowiedź poprawnie reprezentuje jego pozycję, ale warto zauważyć, że wiele osób uważa, że ​​jego pozycja jest błędna. Biorąc pod uwagę wybór między testem, który pokazuje, że najważniejsza funkcja w aplikacji działa poprawnie (test akceptacji, jeśli chcesz), a testem, który wykrył trywialny błąd (wyrównanie o jeden piksel) w rzadko używanym rogu aplikacji, I wiem, co wybrałbym w moim ograniczonym czasie. I dla analogii doktora: jeśli idę NA KONTROLĘ, a nie w odpowiedzi na objawy, potwierdzenie serca jest dobre, płuca są dobre itp. Itd. To dobry wynik. Więc tam
Kate Gregory
@KateGregory Zgadzam się, myślę tak samo. Osobiście uważam, że jego opinia jest błędna, testujemy głównie w celu zebrania informacji ...
John V
2
@KateGregory zgadza się - nie sądzę, aby dokładne zaliczenie jakiegokolwiek zaliczonego testu było całkowitym marnotrawstwem. Chociaż wydaje mi się, że jeden punkt, który wysuwa, jest ponadczasowy : jeśli błąd prześlizgnie się przez testowanie wersji, QA potrzebowałoby czegoś więcej niż „och, ale byliśmy zajęci przeprowadzaniem innych testów”, aby zakryć ich plecy. Przeszedłem przez to jako tester w przeszłości i widzę to teraz, gdy jestem programistą, i nie sądzę, żeby to kiedykolwiek zniknęło
gnat
4

Nie znam pana Canera, ale IMHO

testy, które potencjalnie nie znajdują błędów

są stratą czasu. Obejmuje to sytuację, w której masz już niektóre testy (nie ma znaczenia, czy są one automatyczne, czy tylko na liście kontrolnej) i dodajesz nowe testy, które potwierdzają zasadniczo te same przypadki, które już masz. Twoje nowe testy nie wykryją więcej błędów niż istniejące.

Taka sytuacja może się zdarzyć, na przykład, jeśli przejrzysz listę losowo - mógłbym również powiedzieć „bezmyślnie” (wybacz mi to słowo) - wybrałeś przypadki testowe w twoim programie, nie zastanawiając się, czy sprawdzą nowy przypadek krawędzi, nową równoważność klasy danych wejściowych lub jeśli zwiększają pokrycie kodu w stosunku do już napisanych testów.

Doktor Brown
źródło
-1

Moim zdaniem ten cytat odnosi się do testów zbyt ogólnych lub nieobciążonych.

Jeśli wykonasz test funkcji sprawdzającej poprawność wiadomości e-mail, a podczas testu podasz tylko prawidłowe wiadomości e-mail, test ten będzie całkowicie bezużyteczny. Musisz przetestować tę funkcję pod kątem „dowolnych” ciągów możliwych, nieprawidłowych wiadomości e-mail, zbyt długich wiadomości e-mail, znaków Unicode (áêñç ....)

Jeśli kodujesz test, który sprawdza tylko, czy [email protected] zwraca wartość prawda, a nazwa @ com zwraca wartość fałsz, test ten jest taki sam, jak żaden test.

Juanmi Rodriguez
źródło