Jak automatycznie generowane są testy jednostkowe Guava?


31

Guava ma automatycznie wygenerowane przypadki testowe :

Guawa ma zdumiewającą liczbę testów jednostkowych: od lipca 2012 r. Pakiet testów guawa obejmuje ponad 286 000 indywidualnych przypadków testowych. Większość z nich jest generowana automatycznie , a nie ręcznie, ale zakres testów Guava jest wyjątkowo dokładny, szczególnie w przypadku com.google.common.collect.

Jak zostały wygenerowane? Jakie techniki i technologie zostały użyte do ich zaprojektowania i wygenerowania?


Pamiętam, jak widziałem jakiegoś gościa Google, który poruszał ten temat. Nie wskazówka o nazwie choć rozmowa była w pewnym konwencji java myślę
Zavior

3
Pakiet com.google.common.collect.testing ma wiele klas z nazwami „Generator” - dzięki temu wygląda jak środowisko do generowania testów. Istnieją również podpakiety z klasami udokumentowanymi jako „szkielety” lub „klasy podstawowe” do testów ...
gnat

1
@gnat Tak, byłem pewien, że gdzieś to widziałem. com.google.common.collect.testing.features na przykład pokazuje tfeatures / ograniczenia, które klasa kolekcji powinna spełniać, a przypadek testowy jest ich kombinacją. W ten sposób mogą sparametryzować testowanie
dzieciou


Pytanie mam wiele uwagi ze strony społeczności, ale bez uzasadnionej odpowiedzi tak daleko, więc już po sugestię Martina i umieścić go tutaj: sqa.stackexchange.com/questions/5214/... .
dzieciou

Odpowiedzi:


8

Duża część tej masy testów dotyczy implementacji kolekcji Guava. Napisali ogólne testy, które wyczerpująco testują interfejsy kolekcji, a to generuje pakiet na implementację. Patrz, na przykład, zwanych klasach CollectionAddAllTester, ListIndexOfTester.

Wszystko to jest wspierane przez bibliotekę o nazwie testlib, która jest dostarczana jako część Guava. To jest dość ogólne. Obsługuje pisanie ogólnych testów dla dowolnego interfejsu (nie tylko kolekcji). Możesz określić Features możliwych implementacji i przetestować je (np. Jeśli twój zestaw jest niezmodyfikowany, oczekujesz innego wyniku set.add()), a po uruchomieniu testów określasz, które funkcje obsługuje twoja implementacja.

Opiera się na JUnit 3, a nie 4. Zwykle masz klasę rozszerzającą się TestCaseo nazwane metody testSomething(), a JUnit uruchamia je refleksyjnie. Biblioteka testlib łączy się z uruchomieniem tych testów, dzięki czemu cykl życia wygląda następująco:

  • Dla każdej implementacji, którą chcesz przetestować
  • Dla każdej (stosownej) metody badawczej
  • Utwórz TestCaseinstancję
  • Zainicjuj TestSubjectGenerator- jest to interfejs testlib, który rozszerzasz w miejscu, w którym faktycznie tworzysz obiekt testowy
  • Uruchom metodę refleksyjnie. Podczas tej metody getSubjectGenerator()daje dostęp do przedmiotu testu

Kluczem jest dodatkowy etap inicjalizacji, który umożliwia im wstrzyknięcie określonego obiektu testowego do ogólnego przypadku testowego.

I wypowiedział się o tym, jak napisać testlib apartamentów generujących dla własnych interfejsów.

(Wysłano również na to samo pytanie na stronie sqa .)


6

Istnieją generatory testów jednostkowych. Na przykład w świecie .NET może to zrobić coś takiego jak Microsoft Pex.

Na przykład Microsoft Pex próbuje w oparciu o analizę kodu wszystkie możliwe wartości jako argumenty dla metody. Oczekuje się, że niektóre argumenty pozwolą metodzie zgłosić wyjątek. Takie rzeczy mogą automatycznie testować utworzone dla. Wartości statyczne, takie jak pusty ciąg zwracany w niektórych przypadkach, mogą być również automatycznie testowane.


2
To losowe testowanie przydatne tylko do testowania negatywnych ścieżek (wyjątki, nieprawidłowe dane wejściowe, awarie, przekroczenie czasu). Wierzę, że wygenerowali testy również dla szczęśliwej ścieżki, a to wymaga więcej projektowania, a nie tylko uruchomienia narzędzia analizy statycznej.
dzieciou

Wiem, że istnieją sposoby i narzędzia do generowania testu szczęśliwej ścieżki (np. Zobacz tę odpowiedź ), ale jestem zainteresowany, jak to zrobiono w konkretnym przypadku Guava
dzieciou
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.