Automatyzacja tworzenia testów jednostkowych

11

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 .

VirtuosiMedia
źródło
Najnowsze Visual Studio to wszystko, czego potrzebujesz ...
Job

Odpowiedzi:

5

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ć:

  • Komponent do automatycznego analizowania kodu źródłowego / podpisów funkcji / adnotacji ręcznych, tworzenia standardowych przypadków testowych lub konturów / podpisów dla przypadków testowych, które czekają na zakończenie wprowadzania danych.
  • Nieustannie rosnący / zmieniający się język znaczników / adnotacji / komentarzy, który może przechodzić na dowolny poziom szczegółowości (metoda / klasa / podpis / pętle while / etc ...) reprezentujący wskazówki dla automatycznego konstruktora testów. Idealnie powinieneś być w stanie grać z tym językiem bez konieczności przekodowywania swojego frameworka lub fragmentów w nim
  • Zautomatyzowany tester z możliwością identyfikowania nowych / starych testów i rejestrowania / testowania pod kątem „akceptowalnych” odpowiedzi dla każdego testu. Idealnie, ten biegacz zbuduje bazę danych uruchomień testowych, wyników zaakceptowanych / odrzuconych oraz bieżących akceptowalnych wyników dla każdego testu.
  • Zautomatyzowany „fałszerstwo obiektów”, który, biorąc pod uwagę nazwę klasy i mapę nazw-> wartości, może wygenerować obiekt naśladujący klasę, zwracający konfigurowalne dane dla wywołań funkcji, akcesoriów, publicznych gniazd danych itp.

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.

Blueberryfields
źródło
5

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 ( ifblokach switch/ caseinstrukcjach) 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 .

Thomas Owens
źródło
CodePro Analytix firmy Google brzmi interesująco. Ale „Quis custodiet ipsos custodes?” Kto testuje testy? Można tego użyć tylko do utworzenia kopii zapasowej istniejącego projektu za pomocą testów jednostkowych i prawdopodobnie nie wykryje on awarii, raczej założy, że wady są prawidłowe.
Falcon
@Falcon Nie możesz ślepo ufać żadnemu narzędziu - spowoduje to więcej bólów głowy. Myślę, że ma tu zastosowanie wskazówka Pragmatycznego programisty „dbać o swój statek”. CodePro zawiera edytor testów, dzięki czemu trywialne jest sprawdzanie, jakie wartości są przekazywane i jaki jest oczekiwany wynik, a następnie wprowadzanie w nim zmian (a następnie aktualizowanie wygenerowanego kodu testowego, aby odzwierciedlić te zmiany).
Thomas Owens
Zastanawiam się tylko, co jest bardziej niezawodne w tym przypadku, od człowieka czy maszyny. Myślę, że wygenerowane testy spowodują więcej problemów niż testy napisane ręcznie. W każdym razie najlepiej byłoby napisać test jako pierwszy. Ale na pewno spróbuję. Chciałbym zobaczyć narzędzie, które może generować testy w oparciu o wymagania formalne i klej do metadanych, aby pewnego dnia połączyć się z systemem.
Falcon
@ Falcon Tak, najlepiej niektóre testy powinny być najpierw napisane, ale dopóki nie będziesz mieć implementacji i nie będziesz mógł przeprowadzić testów białych skrzynek, niekoniecznie zobaczysz wszystkie różne przypadki brzegowe, które możesz zobaczyć po wdrożeniu. Jeśli masz szansę zagrać z funkcjami generowania testów CodePro, czy mógłbyś gdzieś opublikować swoje przemyślenia i w jakiś sposób uzyskać link? Interesuje mnie, jak dobrze to działa i doświadczenia innych ludzi.
Thomas Owens
Przetestuję to w przyszłym tygodniu za pomocą średniej wielkości aplikacji J2EE (120 bloków), która zawiera kilka naprawdę trudnych reguł biznesowych i opowiem o moich doświadczeniach tutaj.
Falcon
1

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:

  • Miałem szansę, że podstawowy szkielet, na którym opracowano projekt, zapewniał standardowe operacje i nazewnictwo klas. Jeśli myślisz o napisaniu własnej, taka standardowa struktura bardzo pomoże.
  • Używanie bardzo data-driven testingpomaga, 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.
  • Wynikowe testy jednostkowe były proste, ale służyły smoke testprzynajmniej 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)

henginy
źródło