Co to jest testowanie funkcjonalne?
- 10 min
W tej sekcji dołączysz do zespołu Tailspin, definiując testy funkcjonalne dla swojego potoku. Testy funkcjonalne sprawdzają, czy każda funkcja oprogramowania wykonuje to, co powinno.
Zespół najpierw definiuje, co obejmuje test funkcjonalny. Badają niektóre typy testów funkcjonalnych. Następnie wybierają pierwszy test, który dodadzą do swojego przepływu.
Cotygodniowe spotkanie
Zespół ma swoje tygodniowe spotkanie. Andy demonstruje łańcuch wydawniczy. Zespół obserwuje pomyślną kompilację przechodzącą przez proces z jednego etapu do drugiego. Na koniec aplikacja webowa jest promowana do Staging.
Amita: Jestem tak zadowolona z rurociągu. To sprawia, że moje życie jest znacznie łatwiejsze. Po pierwsze, automatycznie otrzymuję wersję wdrożoną w środowisku testowym. Oznacza to, że nie muszę ręcznie pobierać i instalować artefaktów kompilacji na serwerach testowych. To znaczna oszczędność czasu.
Ponadto testy jednostkowe, które napisali Mara i Andy, wyeliminowały wszystkie błędy regresji, zanim otrzymam wydanie. To usuwa główne źródło frustracji. Nie poświęcam czasu na znajdowanie i dokumentowanie błędów regresji.
Ale obawiam się, że wszystkie moje testy są nadal ręczne. Proces jest powolny i nie możemy pokazać niczego zarządowi, dopóki nie skończę. Trudno jest, ponieważ testowanie jest ważne. Testowanie gwarantuje, że użytkownicy otrzymają właściwe wrażenia. Ale presja wzrasta, aby szybciej dostarczać.
Andy: Jestem pewien, że możemy ci pomóc. Jakiego rodzaju testy zajmują większość czasu?
Amita: Myślę, że testy interfejsu użytkownika działają. Muszę kliknąć każdy krok, aby upewnić się, że otrzymuję poprawny wynik i muszę to zrobić dla każdej obsługiwanej przeglądarki. To bardzo czasochłonne. Wraz ze wzrostem złożoności witryny internetowej testowanie interfejsu użytkownika nie będzie praktyczne w dłuższej perspektywie.
Mara: Testy interfejsu użytkownika są uważane za testy funkcjonalne .
Tim: A czego dotyczą niefunkcjonalne testy?
Mara: Dokładnie. Niefunkcjonalne testy to coś, na czym tobie w szczególności zależy.
Tim: Dobrze, jestem zdezorientowany.
Co to są testy funkcjonalne i niefunkcjonalne?
Mara:Testy funkcjonalne sprawdzają, czy każda funkcja oprogramowania robi to, co powinno. W jaki sposób oprogramowanie implementuje każdą funkcję, nie jest ważne w tych testach. Ważne jest, aby oprogramowanie działało prawidłowo. Podajesz dane wejściowe i sprawdzasz, czy dane wyjściowe są oczekiwane. W ten sposób Amita testuje interfejs użytkownika. Jeśli na przykład wybierze najlepszego gracza w rankingu, spodziewa się, że zobaczy profil tego gracza.
Testy niefunkcjonalne sprawdzają cechy, takie jak wydajność i niezawodność. Przykładem testu niefunkcjonalnego jest sprawdzenie, ile osób może jednocześnie zarejestrować się w aplikacji. Testowanie obciążenia to kolejny przykład niefunkcjonalnego testu. Te problemy z wydajnością i niezawodnością to rzeczy, o które dbasz, Tim.
Tim: Są, rzeczywiście. Muszę myśleć o tym trochę. Chciałbym też dodać trochę automatyzacji do procesu, ale nie jestem pewien, co chcę zrobić. Jakiego rodzaju testy automatyczne można uruchomić?
Mara: Na razie skoncentrujmy się na testach funkcjonalnych. Jest to rodzaj testowania, który robi Amita i brzmi jak obszar, w którym chcemy się poprawić.
Jakiego rodzaju testy funkcjonalne można uruchomić?
Istnieje wiele rodzajów testów funkcjonalnych. Różnią się one w zależności od funkcjonalności, które należy przetestować, oraz czasu lub nakładu pracy, które zwykle wymagają uruchomienia.
W poniższych sekcjach przedstawiono niektóre często używane testy funkcjonalne.
Testy dymne
Testowanie dymne sprawdza najbardziej podstawową funkcjonalność aplikacji lub usługi. Te testy są często uruchamiane przed bardziej kompletnymi i wyczerpującymi testami. Testy dymne powinny być uruchamiane szybko.
Załóżmy na przykład, że tworzysz witrynę internetową. Test weryfikacyjny może używać curl
do sprawdzenia, czy witryna jest dostępna i czy pobranie strony głównej powoduje wygenerowanie statusu HTTP 200 (OK). Jeśli pobieranie strony głównej powoduje wygenerowanie innego kodu stanu, takiego jak 404 (Nie znaleziono) lub 500 (wewnętrzny błąd serwera), wiesz, że witryna internetowa nie działa. Wiesz również, że nie ma powodu do uruchamiania innych testów. Zamiast tego należy zdiagnozować błąd, naprawić go i ponownie uruchomić testy.
Testowanie jednostek
Pracowałeś z testami jednostkowymi w module Uruchamianie testów jakości w potoku kompilacji przy użyciu Azure Pipelines.
Krótko mówiąc, testowanie jednostkowe weryfikuje najbardziej podstawowe składniki programu lub biblioteki, takie jak pojedyncza funkcja lub metoda. Należy określić jeden lub więcej danych wejściowych wraz z oczekiwanymi wynikami. Tester wykonuje każdy test i sprawdza, czy rzeczywiste wyniki są zgodne z oczekiwanymi wynikami.
Załóżmy na przykład, że masz funkcję, która wykonuje operację arytmetyczną obejmującą dzielenie. Możesz określić kilka wartości, które mają zostać wprowadzone przez użytkowników. Należy także określić wartości przypadków brzegowych, takie jak 0 i -1. Jeśli oczekujesz, że określone dane wejściowe spowodują wystąpienie błędu lub wyjątku, możesz sprawdzić, czy funkcja generuje ten błąd.
Testy interfejsu użytkownika, które zostaną uruchomione w dalszej części tego modułu, to testy jednostkowe.
Testowanie integracji
Testowanie integracji sprawdza, czy wiele składników oprogramowania współdziała ze sobą w celu utworzenia kompletnego systemu. Na przykład system handlu elektronicznego może obejmować witrynę internetową, bazę danych produktów i system płatności. Możesz napisać test integracji, który dodaje elementy do koszyka zakupów, a następnie kupuje elementy. Test sprawdza, czy aplikacja internetowa może połączyć się z bazą danych produktów, a następnie spełnić zamówienie.
Możesz połączyć testy jednostkowe i testy integracji, aby utworzyć strategię testowania warstwowego. Na przykład można uruchamiać testy jednostkowe na poszczególnych składnikach przed uruchomieniem testów integracji. Jeśli wszystkie testy jednostkowe przechodzą pomyślnie, możesz przejść do testów integracji z większą pewnością.
Testowanie regresji
Regresja ma miejsce, gdy istniejące zachowanie zmienia się lub przestaje działać po dodaniu lub modyfikacji funkcji. Testowanie regresji pomaga określić, czy kod, konfiguracja lub inne zmiany wpływają na ogólne zachowanie oprogramowania.
Testowanie regresji jest ważne, ponieważ zmiana w jednym składniku może mieć wpływ na zachowanie innego składnika. Załóżmy na przykład, że optymalizujesz bazę danych pod kątem wydajności zapisu. Wydajność odczytu tej bazy danych, która jest obsługiwana przez inny składnik, może nieoczekiwanie spaść. Spadek wydajności odczytu to regresja.
Aby przetestować regresję, można użyć różnych strategii. Te strategie zwykle różnią się w zależności od liczby uruchomionych testów, aby sprawdzić, czy nowa funkcja lub poprawka usterek nie przerywa istniejących funkcji. Jednak podczas automatyzowania testów testowanie regresji może obejmować tylko uruchamianie wszystkich testów jednostkowych i testów integracji za każdym razem, gdy oprogramowanie ulegnie zmianie.
Testowanie sensowności
Testowanie poczytalności obejmuje testowanie każdego głównego składnika oprogramowania w celu sprawdzenia, czy oprogramowanie działa poprawnie i może przejść bardziej szczegółowe testy. Testy jakościowe można traktować jako mniej dokładne niż testy regresji lub testy jednostkowe, ale testy jakościowe są szersze niż testy dymne.
Mimo że testowanie zasadności można zautomatyzować, często odbywa się to ręcznie w odpowiedzi na zmianę funkcji lub poprawkę usterek. Na przykład tester oprogramowania, który weryfikuje poprawkę usterek, może również sprawdzić, czy inne funkcje działają, wprowadzając niektóre typowe wartości. Jeśli oprogramowanie wydaje się działać zgodnie z oczekiwaniami, może przejść przez bardziej szczegółowy test.
Testowanie interfejsu użytkownika
Testowanie interfejsu użytkownika weryfikuje zachowanie interfejsu użytkownika aplikacji. Testy interfejsu użytkownika pomagają sprawdzić, czy sekwencja lub kolejność interakcji użytkownika prowadzi do oczekiwanego wyniku. Te testy pomagają również zweryfikować, czy urządzenia wejściowe, takie jak klawiatura lub mysz, wpływają prawidłowo na interfejs użytkownika. Możesz uruchomić testy interfejsu użytkownika, aby zweryfikować zachowanie natywnej aplikacji systemu Windows, macOS lub Linux. Możesz też użyć testów interfejsu użytkownika, aby sprawdzić, czy interfejs użytkownika działa zgodnie z oczekiwaniami w przeglądarkach internetowych.
Test jednostkowy lub test integracji może sprawdzić, czy interfejs użytkownika prawidłowo odbiera dane. Jednak testowanie interfejsu użytkownika pomaga sprawdzić, czy interfejs użytkownika jest poprawnie wyświetlany i czy wynik działa zgodnie z oczekiwaniami dla użytkownika.
Na przykład test interfejsu użytkownika może sprawdzić, czy prawidłowa animacja pojawia się w odpowiedzi na kliknięcie przycisku. Drugi test może sprawdzić, czy ta sama animacja jest wyświetlana poprawnie po zmianie rozmiaru okna.
W tym module pracujesz z testami interfejsu użytkownika, które są kodowane ręcznie. Można jednak również użyć systemu przechwytywania i odtwarzania w celu automatycznego kompilowania testów interfejsu użytkownika.
Testowanie użyteczności
Testowanie użyteczności to forma testowania ręcznego, która weryfikuje zachowanie aplikacji z perspektywy użytkownika. Zespół, który tworzy oprogramowanie, zwykle wykonuje testy użyteczności.
Podczas gdy testowanie interfejsu użytkownika koncentruje się na tym, czy funkcja działa zgodnie z oczekiwaniami, testowanie użyteczności pomaga sprawdzić, czy oprogramowanie jest intuicyjne i spełnia potrzeby użytkownika. Innymi słowy, testowanie użyteczności pomaga sprawdzić, czy oprogramowanie jest "użyteczne".
Załóżmy na przykład, że masz witrynę internetową zawierającą link do profilu użytkownika. Test interfejsu użytkownika może sprawdzić, czy link jest obecny i czy wyświetla profil użytkownika po wybraniu linku. Jeśli jednak ludzie nie mogą łatwo zlokalizować tego linku, mogą stać się sfrustrowani, gdy próbują uzyskać dostęp do swojego profilu.
Testowanie akceptacji użytkowników
Testowanie akceptacyjne użytkownika (UAT), takie jak testowanie użyteczności, koncentruje się na zachowaniu aplikacji z perspektywy użytkownika. W przeciwieństwie do testowania użyteczności funkcja UAT jest zwykle wykonywana przez rzeczywistych użytkowników końcowych.
W zależności od oprogramowania użytkownicy końcowi mogą zostać poproszeni o wykonanie określonych zadań. Mogą też mieć możliwość eksplorowania oprogramowania bez przestrzegania określonych wytycznych. W przypadku oprogramowania niestandardowego funkcja UAT zwykle odbywa się bezpośrednio z klientem. Zespoły mogą przeprowadzać testy beta dla oprogramowania ogólnego przeznaczenia. W testach beta użytkownicy z różnych regionów geograficznych lub osoby z określonymi zainteresowaniami otrzymują wczesny dostęp do oprogramowania.
Opinie testerów mogą być bezpośrednie lub pośrednie. Bezpośrednie opinie mogą pojawić się w formie komentarzy słownych. Pośrednie opinie mogą pochodzić w postaci pomiaru języka ciała testerów, ruchów oczu lub czasu potrzebnych do wykonania określonych zadań.
Omówiliśmy już znaczenie pisania testów. Ale po prostu podkreślić, oto krótki film, w którym Abel Wang, ambasador chmury w firmie Microsoft, wyjaśnia, jak zapewnić jakość planu DevOps.
Zapytaj Abela
Co wybierze zespół?
Tim: Wszystkie te testy są ważne. Z czym powinniśmy się najpierw zmierzyć?
Andy: Mamy już działające testy jednostkowe. Nie jesteśmy jeszcze gotowi do przeprowadzania testów akceptacyjnych użytkownika. Na podstawie tego, co słyszę, myślę, że powinniśmy skupić się na testach interfejsu użytkownika. W tej chwili jest to najwolniejsza część naszego procesu. Amita, czy zgadzasz się?
Amita: Tak, zgadzam się. W tym spotkaniu pozostało jeszcze trochę czasu. Andy lub Mara, czy chcesz mi pomóc zaplanować zautomatyzowany test interfejsu użytkownika?
Mara: Absolutnie. Załatwmy kilka kwestii wstępnych. Chciałbym omówić, jakiego narzędzia powinniśmy użyć i jak uruchomimy testy.
Jakich narzędzi można używać do pisania testów interfejsu użytkownika?
Mara: Jeśli chodzi o pisanie testów interfejsu użytkownika, jakie są nasze opcje? Wiem, że jest ich wiele. Niektóre narzędzia to open source. Inni oferują płatne wsparcie komercyjne. Oto kilka opcji, które przychodzą na myśl:
- Sterownik aplikacji systemu Windows (WinAppDriver): Usługa WinAppDriver ułatwia automatyzowanie testów interfejsu użytkownika w aplikacjach systemu Windows. Te aplikacje można pisać na Platformie uniwersalnej systemu Windows (UWP) lub w Windows Forms (WinForms). Potrzebujemy rozwiązania, które działa w przeglądarce.
- Selenium: Selenium to przenośna platforma do testowania oprogramowania typu open source dla aplikacji internetowych. Działa on w większości systemów operacyjnych i obsługuje wszystkie nowoczesne przeglądarki. Testy Selenium można napisać w kilku językach programowania, w tym C#. W rzeczywistości można użyć pakietów NuGet, które ułatwiają uruchamianie testów Selenium za pomocą NUnit. Do testów jednostkowych używamy już narzędzia NUnit.
- SpecFlow: SpecFlow jest przeznaczony dla projektów .NET. Jest inspirowany narzędziem o nazwie Ogórk. Zarówno SpecFlow, jak i Cucumber obsługują rozwój oparty na zachowaniu (BDD). Usługa BDD używa analizatora języka naturalnego o nazwie Gherkin, aby pomóc zarówno zespołom technicznym, jak i zespołom nietechncznym definiować reguły biznesowe i wymagania. Aby utworzyć testy interfejsu użytkownika, można połączyć SpecFlow lub Cucumber z Selenium.
Andy patrzy na Amitę.
Andy: Wiem, że te opcje są dla Ciebie nowe, więc czy masz na myśli, jeśli wybierzemy Selenium? Mam pewne doświadczenie z nim i obsługuje języki, które już znam. Selenium zapewnia również automatyczną obsługę wielu przeglądarek.
Amita: Na pewno. Lepiej jest, jeśli jeden z nas ma pewne doświadczenie.
Jak mogę uruchomić testy funkcjonalne w pipeline?
W usłudze Azure Pipelines uruchamiasz testy funkcjonalne tak samo jak w przypadku każdego innego procesu lub testu. Zadaj sobie pytanie:
- W którym etapie zostaną uruchomione testy?
- W jakim systemie zostaną uruchomione testy? Czy będą one uruchamiane na agencie lub w infrastrukturze, która hostuje aplikację?
Dołączmy do zespołu, gdy będą odpowiadać na te pytania.
Mara: Jedną z rzeczy, o której jestem podekscytowana, jest to, że teraz możemy testować w środowisku, które jest jak produkcja, gdzie aplikacja rzeczywiście działa. Testy funkcjonalne, takie jak testy interfejsu użytkownika, mają sens w tym kontekście. Możemy uruchomić je na Test etapie naszego procesu.
Amita: Zgadzam się. Możemy zachować ten sam przepływ pracy, jeśli uruchamiamy zautomatyzowane testy interfejsu użytkownika na tym samym etapie, w którym uruchamiam testy ręczne. Testy automatyczne pozwolą nam zaoszczędzić czas i pozwolić mi skupić się na użyteczności.
Tim: Amita testuje witrynę internetową z laptopa z systemem Windows, ponieważ tak większość naszych użytkowników odwiedza witrynę. Jednak bazujemy na systemie Linux, a następnie wdrażamy usługę aplikacja systemu Azure w systemie Linux. Jak to zrobić?
Mara: Wielkie pytanie. Mamy również wybór miejsca, w którym przeprowadzamy testy. Możemy je uruchomić:
- Na agencie: agent firmy Microsoft lub agent, który jest przez nas hostowany.
- Infrastruktura testowa: lokalna lub w chmurze.
Nasz istniejący etap testowy obejmuje jedno zadanie. To zadanie wdraża witrynę internetową w usłudze App Service z poziomu agenta systemu Linux. Możemy dodać drugie zadanie uruchamiające testy interfejsu użytkownika z agenta systemu Windows. Agent systemu Windows hostowany przez firmę Microsoft jest już skonfigurowany do uruchamiania testów Selenium.
Andy: Ponownie trzymajmy się tego, co wiemy. Użyjmy agenta systemu Windows hostowanego przez firmę Microsoft. Później możemy uruchomić te same testy z agentów, które działają na macOS i Linux, jeśli potrzebujemy dodatkowego zasięgu testów.
Plan
Mara: OK. Oto, co chcemy zrobić:
- Uruchom testy interfejsu użytkownika Selenium z agenta systemu Windows hostowanego przez firmę Microsoft.
- Niech testy pobierają zawartość internetową z aplikacji uruchomionej w usłudze App Service, na etapie Test.
- Uruchom testy we wszystkich przeglądarkach, które obsługujemy.
Andy: Będę pracować z Amitą nad tym. Amita, spotkajmy się jutro rano. Chciałbym zrobić trochę badań przed spotkaniem.
Amita: Wielki! Do zobaczenia wtedy.
Tworzenie funkcjonalnego planu testu
Widzieliśmy, jak zespół decyduje o tym, jak zaimplementują swoje pierwsze testy funkcjonalne. Jeśli twój zespół dopiero zaczyna włączać testy funkcjonalne do potoku pracy (lub nawet jeśli już to robisz), pamiętaj, że zawsze musisz mieć plan.
Wiele razy, gdy ktoś pyta członków zespołu o ich plan testowania wydajności, zwykle odpowiadają listą narzędzi, z których zamierzają korzystać. Jednak lista narzędzi nie jest planem. Należy również dowiedzieć się, jak będą konfigurowane środowiska testowe. Należy określić procesy do użycia i określić, jak wygląda powodzenie lub niepowodzenie.
Upewnij się, że masz plan:
- Uwzględnia oczekiwania firmy.
- Uwzględnia oczekiwania użytkowników docelowych.
- Definiuje używane metryki.
- Definiuje kluczowe wskaźniki wydajności, których będziesz używać.
Testy wydajnościowe muszą być częścią planowania, od samego początku. Jeśli używasz scenariusza lub tablicy Kanban, możesz rozważyć posiadanie obszaru w pobliżu, w którym można zaplanować strategię testowania. W ramach planowania iteracji należy wyróżnić luki w strategii testowania. Ważne jest również, aby dowiedzieć się, jak monitorować wydajność po wdrożeniu aplikacji, a nie tylko mierzyć wydajność przed jej wydaniem.