Czym jest automatyzacja testów? Proste, przejrzyste wprowadzenie
W świecie oprogramowania istnieją dwa rodzaje testów – ręczne i zautomatyzowane. Niektóre rodzaje testowania ręcznego, takie jak testowanie odkrywania i testowanie użyteczności, są nieocenione. Możesz wykonywać inne rodzaje testów – testy regresji i testy funkcjonalne – ręcznie, ale jest to dość marnotrawna praktyka dla ludzi, by robić w kółko to samo. To właśnie te rodzaje powtarzalnych testów nadają się do automatyzacji testów.
Automatyzacja testów jest praktyką automatycznego uruchamiania testów, zarządzania danymi testowymi i wykorzystywania wyników do poprawy jakości oprogramowania. Jest to przede wszystkim środek zapewnienia jakości, ale jej działania wymagają zaangażowania całego zespołu zajmującego się produkcją oprogramowania. Od analityków biznesowych do programistów i inżynierów DevOps, uzyskanie jak największych korzyści z automatyzacji testów wymaga zaangażowania wszystkich osób.
Ten post pozwoli Ci zrozumieć na wysokim poziomie, czym jest automatyzacja testów. Istnieją wszystkie rodzaje testów, ale nie wszystkie powinny być zautomatyzowane, dlatego też zacznijmy od ogólnych kryteriów automatyzacji testów.
Kryteria automatyzacji
Test musi spełniać pewne kryteria, aby mógł być zautomatyzowany – w przeciwnym razie, może skończyć się na tym, że będzie kosztował więcej niż zaoszczędzi. W końcu, jednym z głównych celów automatyzacji jest oszczędzanie czasu, wysiłku i pieniędzy. Oto kilka ogólnych kryteriów dla automatyzacji testów. To są punkty wyjścia. Twoje kryteria mogą się różnić w zależności od okoliczności.
Repeatable
Test musi być powtarzalny. Nie ma sensu automatyzować testu, który może być uruchomiony tylko raz. Powtarzalny test składa się z następujących trzech kroków:
- Ustawienie testu, w tym danych i środowiska.
- Wykonanie funkcji i zmierzenie wyniku.
- Wyczyszczenie danych i środowiska.
W pierwszym kroku chcemy być w stanie wprowadzić środowisko w spójny stan. Innymi słowy, jeśli mamy test na próbę dodania istniejącego użytkownika, musimy się upewnić, że użytkownik istnieje przed wykonaniem testu. Po zakończeniu testu, środowisko powinno wrócić do stanu bazowego.
Determinant
Gdy funkcja jest determinantą, oznacza to, że wynik jest taki sam za każdym razem, gdy jest uruchamiana z tymi samymi danymi wejściowymi. To samo jest prawdziwe w przypadku testów, które mogą być zautomatyzowane. Na przykład, powiedzmy, że chcemy przetestować funkcję dodawania. Wiemy, że 1 + 1 = 2 i że 394,19 + 5,81 = 400,00. Dodawanie jest funkcją wyznacznikową.
Z drugiej strony, oprogramowanie może używać tak dużej liczby zmiennych wejściowych, że trudno jest uzyskać ten sam wynik w czasie. Niektóre zmienne mogą być nawet losowe, co może utrudniać określenie konkretnego wyniku. Projektowanie oprogramowania może to zrekompensować, pozwalając na testowanie danych wejściowych za pomocą wiązki testowej.
Inne cechy aplikacji mogą być addytywne; na przykład tworzenie nowego użytkownika zwiększyłoby liczbę użytkowników. Przynajmniej, gdy dodajemy użytkownika, wiemy, że liczba użytkowników powinna wzrosnąć tylko o jeden. Jednakże, równoległe wykonywanie testów może spowodować nieoczekiwane rezultaty. Izolacja może zapobiec tego rodzaju fałszywym pozytywom.
Unopinionated
Nie można zautomatyzować spraw związanych z opiniami. To jest miejsce, gdzie testy użyteczności, testy beta i tak dalej naprawdę błyszczą. Opinie użytkowników są ważne, ale po prostu nie mogą być zautomatyzowane … przepraszam!
Typy testów automatycznych
Jest tak wiele rodzajów testów, z których wiele może być zautomatyzowanych, że nie możemy naprawdę umieścić ich wszystkich w jednym poście. Ale tutaj jest ich wystarczająco dużo, aby dać ci dobry punkt wyjścia.
Analiza kodu
Właściwie istnieje wiele różnych typów narzędzi do analizy kodu, włączając w to analizę statyczną i dynamiczną. Niektóre z tych testów szukają błędów bezpieczeństwa, inne sprawdzają styl i formę. Testy te są uruchamiane, gdy programista sprawdza kod. Poza konfiguracją reguł i utrzymywaniem narzędzi na bieżąco, nie ma zbyt wiele do zrobienia z tymi automatycznymi testami.
Testy jednostkowe
Możesz również zautomatyzować zestaw testów jednostkowych. Testy jednostkowe są zaprojektowane do testowania pojedynczej funkcji lub jednostki działania w izolacji. Zazwyczaj są one uruchamiane na serwerze kompilacji. Testy te nie zależą od baz danych, zewnętrznych interfejsów API czy przechowywania plików. Muszą być szybkie i są zaprojektowane do testowania tylko kodu, a nie zewnętrznych zależności.
Testy integracyjne
Testy integracyjne są innym rodzajem zwierzęcia, jeśli chodzi o automatyzację. Ponieważ testy integracyjne – czasami nazywane testami end-to-end – muszą wchodzić w interakcję z zewnętrznymi zależnościami, są bardziej skomplikowane do skonfigurowania. Często najlepiej jest tworzyć fałszywe zasoby zewnętrzne, zwłaszcza gdy mamy do czynienia z zasobami poza naszą kontrolą.
Jeśli, na przykład, masz aplikację logistyczną, która zależy od usługi internetowej od dostawcy, Twój test może niespodziewanie zawieść, jeśli usługa dostawcy nie działa. Czy to oznacza, że Twoja aplikacja jest uszkodzona? Może, ale powinieneś mieć wystarczającą kontrolę nad całym środowiskiem testowym, aby stworzyć każdy scenariusz w sposób jednoznaczny. Nigdy nie należy polegać na czynniku zewnętrznym, aby określić wynik scenariusza testowego.
Automatyzowane testy akceptacyjne
W dzisiejszych czasach istnieje kilka praktyk, które wykorzystują zautomatyzowane testy akceptacyjne (AAT), ale w zasadzie robią one to samo. Rozwój sterowany zachowaniem (BDD) i rozwój sterowany zautomatyzowanymi testami akceptacyjnymi (AATDD) są podobne. Oba stosują tę samą praktykę tworzenia testów akceptacyjnych, zanim funkcja zostanie opracowana.
Na koniec, zautomatyzowany test akceptacyjny działa, aby określić, czy funkcja dostarcza to, co zostało uzgodnione. Dlatego też, bardzo ważne jest, aby programiści, biznes i QA pisali te testy razem. Służą one jako testy regresji w przyszłości, i zapewniają, że funkcja trzyma się tego, czego się oczekuje.
Testy regresji
Bez AAT na miejscu, musisz pisać testy regresji po fakcie. Podczas gdy obie te formy są formą testów funkcjonalnych, to sposób ich pisania, czas ich pisania i osoby, które je piszą, znacznie się różnią. Podobnie jak AAT, mogą być one przeprowadzane przez API za pomocą kodu lub UI. Istnieją narzędzia do pisania tych testów za pomocą GUI.
Testy wydajności
Istnieje wiele rodzajów testów wydajności, ale wszystkie one testują jakiś aspekt wydajności aplikacji. Czy wytrzyma ona ekstremalne ciśnienie? Czy testujemy system na wysokie temperatury? Czy chodzi nam o prosty czas reakcji pod obciążeniem? A co ze skalowalnością?
Czasami testy te wymagają emulacji ogromnej liczby użytkowników. W tym przypadku ważne jest, aby mieć środowisko, które jest w stanie wykonać taki wyczyn. Zasoby w chmurze są dostępne, aby pomóc w tego rodzaju testach, ale możliwe jest również korzystanie z zasobów lokalnych.
Testy dymne
Co to jest test dymny? Jest to podstawowy test, który jest zwykle wykonywany po wdrożeniu lub oknie konserwacji. Celem testu dymnego jest upewnienie się, że wszystkie usługi i zależności są sprawne i działają. Test dymny nie jest przeznaczony do całościowego testu funkcjonalnego. Może być uruchomiony jako część zautomatyzowanego wdrożenia lub wywołany przez ręczny krok.
Ogólny proces automatyzacji testów
Teraz, gdy widzieliśmy kryteria automatyzacji i wystarczająco dużo typów zautomatyzowanych testów, aby mieć poczucie rzeczy, oto ogólny proces automatyzacji testów. Istnieją trzy główne kroki do automatyzacji testów: przygotowanie, podjęcie działania, raportowanie wyników.
Przygotowanie
Po pierwsze, musimy przygotować stan, dane testowe i środowisko, w którym odbywają się testy. Jak już widzieliśmy, większość testów wymaga, aby środowisko było w pewnym stanie, zanim nastąpi akcja. W typowym scenariuszu wymaga to pewnej konfiguracji. Albo dane będą musiały być manipulowane, albo aplikacja będzie musiała być wprowadzona w określony stan, albo jedno i drugie!
Podejmij akcję
Gdy stan i/lub środowisko jest w predefiniowanym stanie, nadszedł czas na podjęcie akcji! Sterownik testowy wykona test, albo poprzez wywołanie API aplikacji lub interfejsu użytkownika, albo poprzez bezpośrednie uruchomienie kodu. Sterownik testowy jest odpowiedzialny za „prowadzenie” testów, ale system zarządzania testami bierze na siebie odpowiedzialność za koordynowanie wszystkiego, włączając w to raportowanie wyników.
Raportowanie wyników
System automatyzacji testów będzie rejestrował i raportował wyniki. Wyniki te mogą pojawić się w wielu różnych formatach i mogą nawet tworzyć bilety problemów lub błędy w systemie śledzenia pracy. Podstawowym wynikiem jest jednak wynik pozytywny lub negatywny. Zazwyczaj, istnieje zielony lub czerwony wskaźnik dla każdego scenariusza testowego, aby wskazać wynik pozytywny lub negatywny.
Czasami, testy są niejednoznaczne lub nie działają z jakiegoś powodu. Kiedy tak się stanie, system automatyzacji będzie posiadał pełny log danych wyjściowych dla programistów do wglądu. Log ten pomaga im w śledzeniu problemu. W idealnym przypadku, będą oni w stanie odtworzyć scenariusz po wprowadzeniu poprawki.
Dolna linia
Dolna linia jest następująca: automatyzacja testów pomaga poprawić jakość z szybkością. Ale nie wszystkie testy mogą być zautomatyzowane. Na pewno trzeba w to zainwestować. Przy tak wielu rodzajach testów, ważne jest, aby dobrać odpowiednią mieszankę. Piramida testów jest prostą zasadą, która pomaga to osiągnąć. Mówi ona, że większość testów powinna być testami jednostkowymi, następnie testami usług, a na końcu testami UI.
System automatyzacji testów koordynuje kwestie związane z testowaniem, w tym zarządzanie danymi testowymi, uruchamianie testów i śledzenie wyników. Automatyzacja testów jest kolejnym krokiem dla zespołów, które stają się przytłoczone ciężarem powtarzania tych samych testów manualnych, które powinny być zautomatyzowane.
Biogram autora: Ten post został napisany przez Phila Vuolleta. Phil wykorzystuje oprogramowanie do automatyzacji procesów w celu poprawy wydajności i powtarzalności. Pisze na tematy związane z technologią i biznesem, od czasu do czasu prowadzi wykłady na te same tematy, a także jest człowiekiem rodzinnym, który lubi grać w piłkę nożną i gry planszowe ze swoimi dziećmi.
.