Generowanie testów jednostkowych na potrzeby testowania rozmytego przy użyciu funkcji IntelliTest

Narzędzie IntelliTest eksploruje kod platformy .NET w celu generowania danych testowych i zestawu testów jednostkowych. Dla każdej instrukcji w kodzie generowane są dane wejściowe testowe, które będą wykonywać instrukcję . Analiza przypadku jest wykonywana dla każdej gałęzi warunkowej w kodzie. Na przykład instrukcje if , asercji i wszystkie operacje, które mogą zgłaszać wyjątki, są analizowane. Ta analiza służy do generowania danych testowych dla sparametryzowanego testu jednostkowego dla każdej z metod, tworząc testy jednostkowe z wysokim pokryciem kodu. Pomyśl o tym jako inteligentne testowanie rozmyte, które przycina dane wejściowe i przypadki testowe do tego, co wykonuje wszystkie gałęzie logiki i sprawdza wyjątki.

Po uruchomieniu narzędzia IntelliTest można łatwo sprawdzić, które testy kończą się niepowodzeniem, i dodać dowolny niezbędny kod, aby je naprawić. Możesz wybrać, które z wygenerowanych testów mają być zapisywane w projekcie testowym, aby zapewnić pakiet regresji. Podczas zmiany kodu uruchom ponownie narzędzie IntelliTest, aby zachować zsynchronizowanie wygenerowanych testów ze zmianami kodu.

Dostępność i rozszerzenia

Polecenia menu Create IntelliTest and Run IntelliTest (Tworzenie narzędzi IntelliTest i Run IntelliTest ):

  • Są dostępne tylko w wersji Enterprise w programie Visual Studio.

  • Obsługa tylko kodu w języku C#, który jest przeznaczony dla platformy .NET Framework.

    Uwaga

    Aby uzyskać obsługę platformy .NET 6 z funkcją IntelliTest, możesz zainstalować wersję zapoznawcza programu Visual Studio Enterprise i zobaczyć ogłoszenie .

  • rozszerzalne i obsługują emitowanie testów w formacie MSTest, MSTest V2, NUnit i xUnit.

  • Nie obsługują konfiguracji x64.

Eksplorowanie: korzystanie z narzędzia IntelliTest do eksplorowania kodu i generowania testów jednostkowych

Aby wygenerować testy jednostkowe, typy muszą być publiczne.

  1. Otwórz rozwiązanie w programie Visual Studio, a następnie otwórz plik klasy zawierający metody, które chcesz przetestować.

  2. Kliknij prawym przyciskiem myszy metodę i wybierz polecenie Uruchom narzędzie IntelliTest , aby wygenerować testy jednostkowe dla kodu w metodzie.

    Screenshot of right click on method to generate unit tests.

    Screenshot of right click on method to generate unit tests.

    Narzędzie IntelliTest uruchamia kod wiele razy z różnymi danymi wejściowymi. Każde uruchomienie jest reprezentowane w tabeli zawierającej dane wejściowe testu i wynikowe dane wyjściowe lub wyjątek.

    Screenshot of Exploration Results window.

    Screenshot of Exploration Results window.

Aby wygenerować testy jednostkowe dla wszystkich metod publicznych w klasie, wystarczy kliknąć prawym przyciskiem myszy klasę, a nie określoną metodę, a następnie wybrać polecenie Uruchom IntelliTest. Użyj listy rozwijanej w oknie Wyniki eksploracji, aby wyświetlić testy jednostkowe i dane wejściowe dla każdej metody w klasie.

Screenshot of test results to view from list.

Screenshot of test results to view from list.

W przypadku testów, które przeszły, sprawdź, czy zgłoszone wyniki w kolumnie wyników są zgodne z oczekiwaniami dotyczącymi kodu. W przypadku testów, które kończą się niepowodzeniem, popraw kod zgodnie z potrzebami. Następnie uruchom ponownie narzędzie IntelliTest, aby zweryfikować poprawki.

Utrwalanie: zapisywanie testów jednostkowych jako zestawu regresji

  1. Wybierz wiersze danych, które chcesz zapisać przy użyciu sparametryzowanego testu jednostkowego w projekcie testowym.

    Screenshot of Save test results.

    Screenshot of Save test results.

    Można wyświetlić projekt testowy i sparametryzowany test jednostkowy, który został utworzony — poszczególne testy jednostkowe, odpowiadające poszczególnym wierszom, są zapisywane w pliku g.cs w projekcie testowym, a sparametryzowany test jednostkowy jest zapisywany w odpowiednim pliku cs . Możesz uruchomić testy jednostkowe i wyświetlić wyniki w Eksploratorze testów tak samo jak w przypadku wszystkich testów jednostkowych utworzonych ręcznie.

    Screenshot of saved tests in Solution Explorer.

    Screenshot of saved tests in Solution Explorer.

    Wszystkie niezbędne odwołania są również dodawane do projektu testowego.

    Jeśli kod metody ulegnie zmianie, uruchom ponownie narzędzie IntelliTest, aby zachować synchronizację testów jednostkowych ze zmianami.

Pomoc: używanie narzędzia IntelliTest do koncentracji uwagi na eksploracji kodu

  1. Jeśli masz bardziej złożony kod, narzędzie IntelliTest ułatwia skoncentrowanie się na eksploracji kodu. Jeśli na przykład masz metodę, która ma interfejs jako parametr, i istnieje więcej niż jedna klasa, która implementuje ten interfejs, IntelliTest odnajduje te klasy i zgłasza ostrzeżenie.

    Wyświetl ostrzeżenia, aby zdecydować, co chcesz zrobić.

    Screenshot of View warnings.

    Screenshot of View warnings.

  2. Po zbadaniu kodu i zrozumieniu, co chcesz przetestować, możesz naprawić ostrzeżenie, aby wybrać klasy używane do testowania interfejsu.

    Screenshot of Fix warning.

    Screenshot of Fix warning.

    Ten wybór zostanie dodany do pliku PexAssemblyInfo.cs .

    [assembly: PexUseType(typeof(Camera))]

  3. Teraz możesz ponownie uruchomić narzędzie IntelliTest, aby wygenerować sparametryzowany test jednostkowy i przetestować dane tylko przy użyciu naprawionej klasy.

    Screenshot of Rerun IntelliTest after fix.

    Screenshot of Rerun IntelliTest after fix.

Określ: Użyj narzędzia IntelliTest, aby zweryfikować właściwości poprawności określone w kodzie

Określ ogólną relację między danymi wejściowymi i wyjściowymi, które mają zostać zweryfikowane przez wygenerowane testy jednostkowe. Ta specyfikacja jest hermetyzowana w metodzie, która wygląda jak metoda testowa, ale jest powszechnie kwantyfikowana. Jest to sparametryzowana metoda testu jednostkowego i wszelkie asercji, które należy przechowywać dla wszystkich możliwych wartości wejściowych, które może wygenerować intelliTest.

Pytania i odpowiedzi

Pyt.: Czy można użyć narzędzia IntelliTest do niezarządzanych kodów?

1: Nie, narzędzie IntelliTest działa tylko z kodem zarządzanym.

Pyt.: Kiedy wygenerowany test kończy się powodzeniem lub niepowodzeniem?

1: Przebieg przebiegnie podobnie jak każdy inny test jednostkowy, jeśli nie wystąpią żadne wyjątki. Nie powiedzie się, jeśli jakiekolwiek potwierdzenie zakończy się niepowodzeniem lub jeśli kod w ramach testu zgłasza nieobsługiwany wyjątek.

Jeśli masz test, który może przejść, jeśli zostały zgłoszone określone wyjątki, możesz ustawić jeden z następujących atrybutów na podstawie wymagań na poziomie metody testowej, klasy testowej lub zestawu:

  • PexAllowedExceptionAttribute

  • PexAllowedExceptionFromTypeAttribute

  • PexAllowedExceptionFromTypeUnderTestAttribute

  • PexAllowedExceptionFromAssemblyAttribute

Pyt.: Czy mogę dodać założenia do sparametryzowanego testu jednostkowego?

O: Tak, użyj założeń, aby określić, które dane testowe nie są wymagane dla testu jednostkowego dla określonej metody. PexAssume Użyj klasy , aby dodać założenia. Można na przykład dodać założenie, że zmienna lengths nie ma wartości null w następujący sposób:

PexAssume.IsNotNull(lengths);

W przypadku dodania założenia i ponownego uruchomienia narzędzia IntelliTest dane testowe, które nie są już istotne, zostaną usunięte.

Pyt.: Czy mogę dodać asercji do sparametryzowanego testu jednostkowego?

Odpowiedź: Tak, narzędzie IntelliTest sprawdzi, czy to, co potwierdzasz w instrukcji, jest w rzeczywistości poprawne po uruchomieniu testów jednostkowych. PexAssert Użyj klasy lub interfejsu API asercji dostarczanego ze strukturą testową, aby dodać asercji. Można na przykład dodać potwierdzenie, że dwie zmienne są równe.

PexAssert.AreEqual(a, b);

Jeśli dodasz asercji i uruchom ponownie narzędzie IntelliTest, sprawdzi, czy potwierdzenie jest prawidłowe, a test zakończy się niepowodzeniem, jeśli tak nie jest.

Pyt.: Czy mogę wygenerować sparametryzowane testy jednostkowe bez wcześniejszego uruchomienia narzędzia IntelliTest?

1: Tak, kliknij prawym przyciskiem myszy klasę lub metodę, a następnie wybierz polecenie Utwórz intelliTest.

Screenshot of Create IntelliTest.

Screenshot of Create IntelliTest.

Zaakceptuj format domyślny, aby wygenerować testy lub zmienić sposób, w jaki projekt i testy są nazwane. Możesz utworzyć nowy projekt testowy lub zapisać testy w istniejącym projekcie.

Screenshot of Create IntelliTest with MSTest default.

Screenshot of Create IntelliTest with MSTest default.

Pyt.: Czy mogę używać innych struktur testów jednostkowych z funkcją IntelliTest?

1: Tak, wykonaj następujące kroki, aby znaleźć i zainstalować inne platformy. Rozszerzenia platformy testowej są również dostępne w witrynie Visual Studio Marketplace, na przykład w generatorze testów NUnit.

Po ponownym uruchomieniu programu Visual Studio i ponownym otwarciu rozwiązania kliknij prawym przyciskiem myszy klasę lub metodę, a następnie wybierz polecenie Utwórz narzędzie IntelliTest. Wybierz zainstalowaną platformę tutaj:

Screenshot of Select other unit test framework for IntelliTest.

Screenshot of Select other unit test framework for IntelliTest.

Następnie uruchom narzędzie IntelliTest, aby wygenerować poszczególne testy jednostkowe w odpowiednich plikach g.cs .

Pyt.: Czy mogę dowiedzieć się więcej na temat sposobu generowania testów?

1: Tak, aby uzyskać ogólne omówienie, przeczytaj ten wpis w blogu.