Jakie strategie można zastosować do automatyzacji tworzenia przypadków testowych? Na jakie aspekty należy zwrócić uwagę w każdej klasie, aby móc wygenerować przynajmniej porządny szkielet przypadku testowego?
Zdaję sobie sprawę, że kompleksowe automatyczne rozwiązanie nie jest praktyczne, ale chciałbym przyspieszyć tworzenie testu przynajmniej przez utworzenie szkieletu. Nie szukam przykładów kodu, może tylko sugestii, od czego zacząć lub przykładów, gdzie coś takiego zostało zrobione, abym mógł zobaczyć, jak do nich podeszli i co może być możliwe.
Szczególnie interesują mnie metody tworzenia szkieletów testów jednostkowych w PHP, które nie zapewniają wszystkich narzędzi dostępnych w innych językach, na przykład pełne podpowiedzi typu .
php
unit-testing
VirtuosiMedia
źródło
źródło
Odpowiedzi:
Twoja strategia i szkielet zależy, nie trywialnie, od rodzaju testów, które chcesz wygenerować, jakiego rodzaju zasięgu szukasz oraz od języka / środowiska, w którym pracujesz.
Napisanie generatora testowego, który dla języków takich jak C lub Java, odczytuje podpisy klas i automatycznie generuje testy dla standardowych przypadków narożnych (przekazanie 0, 2 losowych wartości, MAX_INT, MIN_INT, do argumentu liczb całkowitych, wartości zerowe dla wartości zerowych jest dość proste. itp.). Następnie można uruchomić wygenerowane testy, zapisać wyniki dla każdego testu i ręcznie je przefiltrować, aby usunąć niepotrzebne testy, zatwierdzić akceptowalne wyniki testów, które pomyślnie przejdą (aby mogły automatycznie przejść od tego momentu), i oznaczyć jako nieprawidłowe testy, które się nie powiodą .
Możesz to rozszerzyć o dodawanie tagów / komentowanie / refaktoryzację klas, aby pomóc generatorowi z dodatkowymi wskazówkami. Może istnieć znacznik, który zawiera listę wszystkich możliwych wyjątków, które może wywoływać wywołanie metody, lub daje ograniczony zakres prawidłowych liczb całkowitych dla argumentu liczby całkowitej. Spójrz na nie jako na krótkie przygotowanie do samodzielnego napisania testów.
Oto niektóre elementy, na które chcesz spojrzeć:
Istnieje wiele frameworków testowych, które już zawierają fragmenty tej funkcjonalności dla różnych języków i platform. Chociaż dość łatwo jest rozpocząć wykonywanie tej pracy samemu i rozwinąć tego rodzaju ramy organicznie wewnętrznie, jest to również niekończący się długoterminowy projekt, który prawdopodobnie będzie powielał istniejącą pracę. Polecam poświęcić dużo czasu, aby najpierw sprawdzić, co jest dostępne, a następnie zdecydować, czy warto poświęcić czas.
źródło
Nie miałem jeszcze okazji użyć go w aplikacji o znacznych rozmiarach lub złożoności, ale istnieją narzędzia, w tym Google CodePro AnalytiX , które automatyzują generowanie testów jednostkowych dla aplikacji Java . Znalazłem również produkt komercyjny, Parasoft's C ++ Test , który wydaje się pozwalać na generowanie testów jednostkowych C ++
Aplikacje te używały heurystyki do generowania przypadków testowych. Nie jestem pewien, czy istnieje jeden szkielet, którego można użyć do stworzenia szkieletu, ale istnieją konstrukty, których można szukać. Koncentruję się na pętlach, instrukcjach warunkowych (
if
blokachswitch
/case
instrukcjach) i wyjątkach oraz tworzę przypadki testowe, które wymuszają wykonanie różnych ścieżek wykonania.Nie skupiałbym się na przyspieszaniu pisania testów, próbując stworzyć szkielet lub szablon, ale raczej ulepszając analizę specyfikacji i / lub implementacji i pisząc testy wysokiej jakości. Możliwość wczesnego określenia, które testy mają największą wartość dodaną, napisanie ich, a następnie wypełnienie dziur później, miałoby większy wpływ na produktywność i jakość.
Aby zapewnić nieco więcej reklamy, Falcon wypróbował CodePro w projekcie i napisał trochę o swoich doświadczeniach .
źródło
Kilka lat temu napisałem generator, aby przyspieszyć testowanie jednostek dla projektu .NET. Istniała duża baza kodów bez testów jednostkowych, której celem było szybkie zwiększenie podstawowego zasięgu. Oto kilka wskazówek, które mogą być pomocne:
data-driven testing
pomaga, jeśli twoja baza kodu na to pozwala. Środowisko testowe utworzyło tabelę bazy danych dla każdego testu jednostkowego do przechowywania danych testowych, dzięki czemu każdy wiersz w tej tabeli był osobnym testem i nie był wymagany żaden dodatkowy kod ( reguła reprezentacji ). Od tego momentu rzeczywiste testy mogą być łatwo tworzone automatycznie lub wprowadzane ręcznie.smoke test
przynajmniej jako s. Dla obszarów o podwyższonym ryzyku napisano dodatkowe testy ręczne.Podsumowując, zgadzam się, że ogólne rozwiązanie byłoby niepraktyczne (jeśli to możliwe). Wierzę, że szanse są większe, jeśli podstawa kodu jest odpowiednia do generowania testów, a środowisko testowe może skorzystać z jego struktury.
(Na marginesie, istnieje Pex , ale to jest dla .NET)
źródło