Udostępnij przez


Omówienie narzędzia Microsoft IntelliTest

Narzędzie IntelliTest umożliwia wczesne znajdowanie usterek i zmniejsza koszty konserwacji testów. Korzystając z zautomatyzowanego i przezroczystego podejścia do testowania, narzędzie IntelliTest może wygenerować zestaw testów dla kodu platformy .NET. Generowanie zestawu testów może być dalej sterowane określonymi właściwościami poprawności . Narzędzie IntelliTest będzie nawet automatycznie rozwijać zestaw testów w miarę rozwoju kodu testowego.

Uwaga / Notatka

Narzędzie IntelliTest jest przestarzałe w programie Visual Studio 2026. W programie Visual Studio 2022 narzędzie IntelliTest jest obsługiwane tylko dla programu .NET Framework i jest ograniczone do programu Visual Studio Enterprise. Obsługa platformy .NET 6 była ograniczona tylko do wersji zapoznawczej.

Uwaga / Notatka

W programie Visual Studio 2022 narzędzie IntelliTest jest obsługiwane tylko dla programu .NET Framework i jest ograniczone do programu Visual Studio Enterprise. Obsługa platformy .NET 6 była ograniczona tylko do wersji zapoznawczej.

Testy scharakteryzacyjne Narzędzie IntelliTest umożliwia określenie zachowania kodu pod względem zestawu tradycyjnych testów jednostkowych. Taki zestaw testów może służyć jako pakiet regresji, tworząc podstawę do walki ze złożonością związaną z refaktoryzowaniem starszego lub nieznanego kodu.

Generowanie sterowanych danych wejściowych testu IntelliTest używa analizy kodu otwartego i podejścia do rozwiązywania ograniczeń w celu automatycznego generowania dokładnych wartości wejściowych testów, zwykle bez konieczności interwencji użytkownika. W przypadku złożonych typów obiektów automatycznie generuje fabryki. Generowanie danych wejściowych testowych można poprowadzić, rozszerzając i konfigurując fabryki zgodnie z wymaganiami. Właściwości poprawności, określone jako asercje w kodzie, są automatycznie wykorzystywane do lepszego kierowania generowaniem danych wejściowych do testów.

Integracja środowiska IDE Narzędzie IntelliTest jest w pełni zintegrowane ze środowiskiem IDE programu Visual Studio. Wszystkie informacje zebrane podczas generowania zestawu testów (takie jak automatycznie wygenerowane dane wejściowe, dane wyjściowe z kodu, wygenerowane przypadki testowe i ich stan powodzenia lub niepowodzenia) są wyświetlane w środowisku IDE programu Visual Studio. Możesz łatwo iterować między naprawianiem kodu i ponownym uruchamianiem środowiska IntelliTest bez opuszczania środowiska IDE programu Visual Studio. Testy można zapisywać w rozwiązaniu jako projekt testów jednostkowych i automatycznie wykrywać je później przez Eksploratora testów programu Visual Studio.

Uzupełnienie istniejących rozwiązań testowych Użyj narzędzia IntelliTest, aby uzupełnić wszelkie istniejące rozwiązania testowe, które mogą być już przestrzegane.

Jeśli chcesz przetestować:

  • Algorytmy dotyczące danych pierwotnych lub tablic danych pierwotnych:
  • Algorytmy dotyczące złożonych danych, takich jak kompilator:
    • pozwól intelliTest najpierw wygenerować abstrakcyjną reprezentację danych, a następnie przekaż je do algorytmu
    • pozwól, aby IntelliTest tworzył wystąpienia przy użyciu niestandardowego tworzenia obiektów i niezmiennych danych, a następnie wywołaj algorytm.
  • Kontenery danych:
  • Istniejąca baza kodu:

The Hello World of IntelliTest

Narzędzie IntelliTest znajduje dane wejściowe istotne dla przetestowanego programu, co oznacza, że można go użyć do wygenerowania słynnego ciągu Hello World! . Przyjęto założenie, że utworzono projekt testowy oparty na języku C# MSTest i dodano odwołanie do platformy Microsoft.Pex.Framework. Jeśli używasz innej platformy testów, utwórz bibliotekę klas języka C# i zapoznaj się z dokumentacją platformy testowej, aby dowiedzieć się, jak skonfigurować projekt.

Poniższy przykład tworzy dwa ograniczenia dotyczące parametru o nazwie value , aby narzędzie IntelliTest wygenerowało wymagany ciąg:

using System;
using Microsoft.Pex.Framework;
using Microsoft.VisualStudio.TestTools.UnitTesting;

[TestClass]
public partial class HelloWorldTest {
    [PexMethod]
    public void HelloWorld([PexAssumeNotNull]string value) {
        if (value.StartsWith("Hello")
            && value.EndsWith("World!")
            && value.Contains(" "))
            throw new Exception("found it!");
    }
}

Po skompilowaniu i wykonaniu narzędzie IntelliTest generuje zestaw testów, takich jak następujący zestaw:

  1. ""
  2. "\0\0\0\0\0"
  3. "Witaj"
  4. "\0\0\0\0\0\0"
  5. Cześć\0
  6. Cześć\0\0
  7. "Hello\0World!"
  8. "Hello World!"

Uwaga / Notatka

W przypadku problemów z kompilacją spróbuj zastąpić odwołania Microsoft.VisualStudio.TestPlatform.TestFramework i Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions odwołaniem do elementu Microsoft.VisualStudio.QualityTools.UnitTestFramework.

Przeczytaj Generowanie testów jednostkowych za pomocą narzędzia IntelliTest , aby zrozumieć, gdzie są zapisywane wygenerowane testy. Wygenerowany kod testowy powinien zawierać test, taki jak następujący kod:

[TestMethod]
[PexGeneratedBy(typeof(global::HelloWorldTest))]
[PexRaisedException(typeof(Exception))]
public void HelloWorldThrowsException167()
{
    this.HelloWorld("Hello World!");
}

To takie proste!

Dodatkowe zasoby:

Ważne atrybuty

using Microsoft.Pex.Framework;

[..., PexClass(typeof(Foo))]
public partial class FooTest {
    [PexMethod]
    public void Bar([PexAssumeNotNull]Foo target, int i) {
        target.Bar(i);
    }
}
[assembly: PexAssemblyUnderTest("MyAssembly")] // also instruments "MyAssembly"
[assembly: PexInstrumentAssembly("Lib")]

Ważne statyczne klasy pomocnicze

  • PexAssume ocenia założenia (filtrowanie danych wejściowych)
  • PexAssert ocenia asercji
  • PexChoose generuje nowe opcje (dodatkowe dane wejściowe)
  • PexObserve rejestruje wartości na żywo w wygenerowanych testach
[PexMethod]
void StaticHelpers(Foo target) {
    PexAssume.IsNotNull(target);

    int i = PexChoose.Value<int>("i");
    string result = target.Bar(i);

    PexObserve.ValueForViewing<string>("result", result);
    PexAssert.IsNotNull(result);
}

Ograniczenia

W tej sekcji opisano ograniczenia funkcji IntelliTest:

Nieokreśloność

IntelliTest zakłada, że analizowany program jest deterministyczny. Jeśli tak nie jest, narzędzie IntelliTest cykluje do momentu osiągnięcia ograniczenia eksploracji.

Narzędzie IntelliTest uważa program za nieokreślityczny, jeśli opiera się na danych wejściowych, których narzędzie IntelliTest nie może kontrolować.

IntelliTest steruje danymi wejściowymi dostarczonymi do sparametryzowanych testów jednostkowych i uzyskanymi z aplikacji PexChoose. W tym sensie wyniki wywołań niezarządzanego lub nieinstrumentowanego kodu są również traktowane jako "dane wejściowe" do instrumentowanego programu, ale narzędzie IntelliTest nie może ich kontrolować. Jeśli przepływ sterowania programu zależy od określonych wartości pochodzących z tych źródeł zewnętrznych, narzędzie IntelliTest nie może "kierować" programem w kierunku wcześniej odkrytych obszarów.

Ponadto program jest uznawany za niedeterministyczny, jeśli wartości ze źródeł zewnętrznych zmieniają się podczas ponownego uruchamiania programu. W takich przypadkach narzędzie IntelliTest traci kontrolę nad wykonywaniem programu, a jego wyszukiwanie staje się nieefektywne.

Czasami nie jest oczywiste, gdy tak się stanie. Rozważ następujące przykłady:

  • Wynik metody GetHashCode() jest dostarczany przez niezarządzany kod i nie jest przewidywalny.
  • Klasa System.Random używa bieżącego czasu systemowego do dostarczania prawdziwie losowych wartości.
  • Klasa System.DateTime udostępnia bieżącą godzinę, która nie jest pod kontrolą funkcji IntelliTest.

Concurrency

Narzędzie IntelliTest nie obsługuje programów wielowątkowych.

Kod natywny

Narzędzie IntelliTest nie rozumie kodu natywnego, takiego jak instrukcje x86 wywoływane z wykorzystaniem P/Invoke. Nie wie, jak przetłumaczyć takie wywołania na ograniczenia, które można przekazać do modułu rozwiązywania ograniczeń. Nawet w przypadku kodu platformy .NET może on analizować tylko kod, który instrumentuje. Narzędzie IntelliTest nie może instrumentować niektórych części biblioteki mscorlib, w tym biblioteki odbicia. Nie można instrumentować elementu DynamicMethod.

Sugerowanym obejściem jest tryb testowy, w którym takie metody znajdują się w typach w zestawie dynamicznym. Jednak nawet jeśli niektóre metody nie sąinstrumentowane, narzędzie IntelliTest próbuje uwzględnić jak najwięcej instrumentowanego kodu.

Platforma

Narzędzie IntelliTest jest obsługiwane tylko w 32-bitowym środowisku X86. NETframework.

Język

W zasadzie narzędzie IntelliTest może analizować dowolne programy .NET napisane w dowolnym języku platformy .NET. Jednak w programie Visual Studio obsługuje tylko język C#.

Wnioskowanie symboliczne

Narzędzie IntelliTest używa automatycznego modułu rozwiązywania ograniczeń w celu określenia, które wartości są istotne dla testu i testowego programu. Jednak możliwości modułu rozwiązywania ograniczeń są i zawsze będą ograniczone.

Nieprawidłowe stack traces

Ponieważ IntelliTest przechwytuje i ponownie wyrzuca wyjątki w każdej instrumentowanej metodzie, numery wierszy w śladach stosu nie będą poprawne. Jest to ograniczenie wynikające z założenia instrukcji "rethrow".