Pachnie jak zadanie domowe.
Czy potrzebne są testy w dziedzinie oprogramowania?
Tak. Absolutnie. Na wszystkich poziomach. Poza kilkoma wyspecjalizowanymi domenami nie jesteśmy jeszcze na etapie, w którym możemy matematycznie udowodnić, że nasz kod jest poprawny względem określonych błędów (przynajmniej w rozsądnym terminie), więc musimy rzucić w niego kamieniami, aby sprawdzić, czy i gdzie się psuje.
Jeśli tworzymy oprogramowanie z wielką starannością, to dlaczego powinniśmy testować?
Testowanie nie polega tylko na wykrywaniu błędów kodowania. Chodzi również o upewnienie się, że wszystkie wymagania zostały spełnione, a cały system działa zgodnie z oczekiwaniami. Jeśli mam wymaganie, aby nieudana transakcja zwróciła określony kod błędu, muszę napisać test, aby sprawdzić, czy funkcjonalność istnieje i czy działa poprawnie.
A wszystko to zakłada, że specyfikacja i projekt są kompletne, poprawne i wewnętrznie spójne, co często nie jest prawdą. Nawet jeśli spełniasz specyfikację do litery i postępujesz zgodnie z projektem aż do ostatniej kropki i średnika, jeśli specyfikacja lub projekt jest zły, wtedy będą problemy w czasie integracji. Często testy systemu lub integracji odbywają się, gdy dowiadujesz się, że sama specyfikacja jest błędna i wymaga aktualizacji (patrz historia wojny poniżej).
Czy po przetestowaniu możemy być pewni, że osiągnęliśmy ten cel (produkt / oprogramowanie działa zgodnie z przeznaczeniem), ponieważ przeprowadziliśmy dla niego testy? Czy to możliwe?
Nie, nie do 100%. Nie możemy przetestować każdej możliwej kombinacji danych wejściowych lub ścieżek wykonania w żadnym innym, niż najprostszym kodzie. Nie możemy uwzględnić wszystkich czynników środowiskowych. Nie możemy sobie wyobrazić wszystkich możliwych trybów awarii.
Możemy przetestować do tego stopnia, że jesteśmy dość pewni, że nie ma żadnych dużych problemów. Ponownie dlatego musimy testować na wszystkich poziomach. Napisz zestaw testów, aby upewnić się, że kod poprawnie obsługuje warunki brzegowe (złe dane wejściowe, nieoczekiwane wyniki, wyjątki itp.). Test jednostkowy w celu sprawdzenia, czy kod spełnia jego wymagania. Test systemu w celu weryfikacji przetwarzania od końca do końca. Test integracji w celu sprawdzenia, czy wszystkie komponenty poprawnie się ze sobą komunikują. Przeprowadź testy użyteczności, aby upewnić się, że całość działa w taki sposób, że klienci nie chcą cię zastrzelić.
Scenariusz w świecie rzeczywistym - pracowałem nad systemem zaplecza, który od czasu do czasu wysyłał aktualizacje usługi GUI do wyświetlenia w tabeli na ekranie. Podczas projektu dodano wymaganie dodania filtrowania do wyświetlacza (np. Operator mógł wybrać opcję wyświetlania podzestawu wpisów w tabeli). Błąd projektowy nr 1 - filtrowanie powinno zostać wykonane przez usługę GUI (mam to dziwne, antykwarskie przekonanie, że funkcje zarządzania wyświetlaniem powinny być odpowiedzialne za oprogramowanie do zarządzania wyświetlaniem), ale z powodu polityki i mojej niezdolności do rozpoznania problemów, zanim one staną się problemy , wymóg ten został nałożony na usługę zaplecza. No dobra, nie ma problemu, mogę to zrobić. Filtruj zmiany stanu, otrzymuję wiadomość, a następnie wysyłam wiadomość tworzenia lub usuwania wiadomościkażdy wiersz w tabeli , ponieważ tak działa interfejs (błąd projektowy nr 2 - nie ma możliwości wysłania aktualizacji do wielu wierszy w jednym komunikacie; nie możemy nawet wysłać pojedynczej wiadomości „wyczyść” lub „usuń” do wyczyszczenia cały stół).
Cóż, wszystko działa dobrze podczas programowania; testy jednostkowe, systemowe i integracyjne pokazują, że przesyłam odpowiednie informacje i poprawnie obsługuję zmiany filtrów. Następnie przechodzimy do testów użyteczności, a całość mocno spada , ponieważ ilość danych była przytłaczająca. Opóźnienie sieci między moją usługą zaplecza a GUI było rzędu od 0,15 do 0,25 sekundy. Nieźle, jeśli musisz wysyłać aktualizacje tylko dla kilkunastu wierszy. Śmiertelny, gdy musisz wysłać aktualizacje za kilkaset. Zaczęliśmy otrzymywać raporty o błędach, że GUI zamarzało po zmianie stanu filtra; no nie, działo się tak, że trwało to kilka minut zaktualizować wyświetlacz, ponieważ protokół wiadomości z aktualizacją jeden wiersz na raz nie był w stanie poradzić sobie ze scenariuszem w świecie rzeczywistym.
Zauważ, że wszystko to mogło i powinno być oczekiwane przez wszystkich, od głównego wykonawcy aż do małego starego mnie, gdybyśmy wcześniej zadali sobie trud nawet najbardziej podstawowej analizy. Jedyną obroną, którą zaoferuję, jest to, że zamykamy drugi rok sześciomiesięcznego projektu, który zostanie zniszczony niemal natychmiast po dostawie, i wszyscy desperacko czekamy na jego powrót.
Co prowadzi nas do ostatniego powodu testowania - CYA. Realne projekty zawodzą z różnych powodów, wiele z nich ma charakter polityczny i nie wszyscy działają w dobrej wierze, gdy coś pójdzie nie tak. Wskazujcie palcami, wysuwajcie oskarżenia i pod koniec dnia musicie być w stanie wskazać zapis pokazujący, że przynajmniej wasze rzeczy działały tak, jak powinny.
If we create a software with care in during its development period then why should we go for Test?
- ponieważ bez względu na wszystko nawet najbardziej wykwalifikowany programista popełnia błędy.