Po prostu zrób to ...
Jesteś proszony o wykonanie testów ręcznych, ponieważ nie pomogłeś zautomatyzować testów. Ciesz się, że jest to bolesne i coś, czego nie lubisz robić. Miejmy nadzieję, że wszyscy inni deweloperzy w Twoim zespole czują to samo. Po cierpieniu związanym z ręcznym testowaniem, zadaj sobie pytanie: „Dlaczego programiści w innych firmach nie muszą przechodzić przez wszystkie te ręczne testy?” Zapewniam Cię, że wiele firm dostarcza wysokiej jakości oprogramowanie bez obszernych testów ręcznych. Odpowiedź brzmi: automatyzacja.
... Następnie zautomatyzuj to
Jeśli masz już dobre pokrycie testów jednostkowych, to świetnie! Jak blisko jest do 100%? Czy masz testy integracyjne, które łączą moduły Twojego oprogramowania i sprawdzają koordynację? Nie? To kolejny krok w automatyzacji. Będziesz musiał wykorzystać swój osąd, aby zdecydować, które moduły wymagają szczególnej uwagi.
Wreszcie, czy masz testy akceptacyjne? Jeśli twoje oprogramowanie jest oparte na interfejsie użytkownika, będziesz potrzebować czegoś takiego jak Selenium / FitNesse / itp. Jeśli jest zorientowany na usługi i można go przetestować za pomocą prostego żądania internetowego, proponuję coś, co może być niestandardowe, ale okazało się bardzo przydatne: napisz testy akceptacyjne jako testy wydajnościowe, używając Gatling. Ok, to brzmi szalenie, ale wysłuchaj mnie ...
Gatling Tests
Gatling jest potężny, ponieważ piszesz specyfikację testu w Scali. Jeśli Scala nie jest Twoim językiem programistycznym, będziesz musiał nauczyć się podstaw, aby pisać testy. Ale zaufaj mi, warto zainwestować! Aby przeprowadzić test wydajności, chcesz skonstruować szereg dość reprezentatywnych żądań dotyczących Twojej usługi, a Gatling ułatwia to. Możesz odczytywać dane z plików konfiguracyjnych i generować dowolny obiekt żądania. Następnie możesz uderzyć w testowaną usługę tak mocno, jak Twoja stacja robocza testującego może wysyłać żądania i przetwarzać odpowiedzi (co jest generalnie znacznie szybsze niż usługa może obsłużyć żądania).
Teraz przeprowadzam zarówno testy dymu, jak i testy wydajności. Są dokładnie takie same. Jedyna różnica polega na tym, że testy dymu działają dokładnie N razy, dla małych N (powiedzmy 3), podczas gdy testy wydajności trwają przez czas T (około 15 m). Oba rodzaje testów generują żądania losowo. Niektórzy ludzie będą sprzeciwiać się temu, że determinizm jest lepszy ze względu na odtwarzalność, a argument ten ma swoje uzasadnienie. Ale lubię generowanie losowe dla pokrycia, ponieważ czasami otrzymujesz „interesujące” żądania, które wywołują niejasny błąd i pozostawi ślad w dzienniku, który możesz zbadać.
Wydajność jako akceptacja
Ale musisz wiedzieć, czy Twoje oprogramowanie działa ... a nie czy jest szybkie . Co to ma wspólnego z poprawnością ? Cóż, wszystko! Widzisz, jest jedna zabawna rzecz, która dzieje się w dużych firmach, które mają dedykowanych testerów. W końcu testerzy wyszukują i wywołują w kodzie nieprawidłowe / problematyczne warunki, aby zobaczyć, co się stanie. Ale tak naprawdę programiści powinni również wykrywać te warunki . Najlepiej byłoby, gdyby przynajmniej zarejestrowali BŁĄD, gdy dzieje się coś, co spowodowałoby, że SDET / SET zgłosiłby błąd. Co oznacza, że dobre SDE i dobre SDET powinny robić pewne zbędne rzeczy względem siebie, co w rzeczywistości jest stratą bardzo kosztownego czasu.
Zamiast pisać zewnętrzny test, który wyraźnie sprawdza te warunki błędów, znacznie lepiej jest, aby usługa była bardzo agresywna w sprawdzaniu poprawności danych na wszystkich etapach obliczeń i rejestrowała wszelkie nieprawidłowości. Następnie część testu wydajności będzie obejmować sprawdzenie dzienników (mam nadzieję, że masz skonfigurowane przekazywanie dzienników, np. Splunk lub podobne). W szczególności chcesz sprawdzić, czy podczas testów wystąpił błąd lub HTTP 5xx (zarówno smoke, jak i perf). Jeśli tak, to wiesz, że masz problem, który warto zbadać.
Teraz to, co zrobiłeś, zmieniło twój test perfekcji w generator testów akceptacyjnych . Aby to działało dobrze, generator żądań musi mieć dobre pokrycie. W idealnym przypadku powinno trafiać do wszystkich części domeny dla każdego pola żądania, nawet jeśli określisz dystrybucję jako „realistyczną”. Na przykład załóżmy, że uruchamiasz Twittera i musisz sprawdzić, czy usługa TweetService działa poprawnie. Żądaniem będzie prawdopodobnie coś takiego: (nazwa użytkownika, wiadomość). Oczywiście musisz sprawdzić pełen zakres możliwych nazw użytkowników (długość, dozwolone znaki itp.), A także wiadomości (ponownie, długość, dozwolone znaki, osadzone linki itp.). Twój generator może preferować tworzenie średnio krótszych wiadomości, ale nadal powinien tworzyć wiadomości o maksymalnej długości czasami (co oznacza, że powinny pojawiać się wiele razy w trakcie wykonywania perf).
Testowanie interfejsu użytkownika
Chociaż korzystałem zarówno z Selenium, jak i Fitnesse, testowanie interfejsu użytkownika nie jest moją mocną stroną i nie mogę tutaj podać szczegółowych wskazówek. Niestety nie sądzę, aby można było generować losowe testy dla UI tak, jak można to zrobić dla usług. To sprawia, że jest to zupełnie inna bestia. Mimo to automatyzacja >>> testowanie ręczne. Znajdź framework, uzyskaj wpisowe od swojego zespołu, zautomatyzuj testy, zysk $$$ $$$!