Omówienie narzędzia Microsoft IntelliTest

Narzędzie IntelliTest umożliwia wczesne znajdowanie usterek i zmniejsza koszty konserwacji testów. Stosując zautomatyzowane i przejrzyste podejście do testowania, narzędzie IntelliTest może generować kandydujący pakiet testów dla kodu platformy .NET. Generowaniem zestawu testów można dokładniej sterować za pomocą właściwości poprawności określonych przez użytkownika. Narzędzie IntelliTest będzie nawet automatycznie rozwijać zestaw testów w miarę rozwoju testowanego kodu.

Uwaga

Narzędzie IntelliTest jest dostępne tylko w wersji Enterprise. Jest on obsługiwany w przypadku kodu w języku C#, który jest przeznaczony dla platformy .NET Framework. Aby uzyskać obsługę platformy .NET 6 z funkcją IntelliTest, zainstaluj wersję zapoznawcza programu Visual Studio Enterprise i zapoznaj się z ogłoszeniem .

Testy charakterystyki Narzędzie IntelliTest umożliwia ustalanie zachowania kodu pod względem zestawu tradycyjnych testów jednostkowych. Taki zestaw testów może służyć jako zestaw regresji, stanowiący podstawę do rozwiązywania problemów ze złożonością podczas refaktoryzacji starszego lub nieznanego kodu.

Sterowane generowanie danych wejściowych testów Narzędzie IntelliTest stosuje podejście oparte na otwartej analizie kodu i rozwiązywaniu ograniczeń, aby automatycznie generować precyzyjne wartości wejściowe testów, zwykle bez konieczności interwencji użytkownika. W przypadku złożonych typów obiektów automatycznie generuje ono fabryki. Można sterować generowaniem danych wejściowych testów, rozszerzając i konfigurując fabryki w celu dopasowania do własnych wymagań. Właściwości poprawności określone jako asercji w kodzie są używane automatycznie do dalszego kierowania generowaniem danych wejściowych testowych.

Integracja ze środowiskiem 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) pojawiają się w środowisku IDE programu Visual Studio. Można łatwo iterować między poprawianiem kodu i ponownym uruchamianiem narzędzia 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łnianie istniejących metod testowania Narzędzie IntelliTest może uzupełniać istniejące metody testowania, które mogą być już stosowane.

Jeśli chcesz przetestować:

Przykład Hello world w narzędziu 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 tu założenie, że został utworzony projekt testowy w języku C# oparty na narzędziu MSTest oraz zostało dodane odwołanie do struktury 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 uruchomieniu narzędzie IntelliTest wygeneruje zestaw testów, taki jak następujący zestaw:

  1. ""
  2. "\0\0\0\0\0"
  3. „Hello” (Witaj)
  4. "\0\0\0\0\0\0"
  5. "Hello\0"
  6. "Hello\0\0"
  7. "Hello\0World!"
  8. "Hello World!"

Uwaga

W przypadku problemów z kompilacją spróbuj zamienić odwołania Microsoft.VisualStudio.TestPlatform.TestFramework i Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions na odwołanie Microsoft.VisualStudio.QualityTools.UnitTestFramework.

Przeczytaj temat Generowanie testów jednostkowych za pomocą narzędzia IntelliTest, aby dowiedzieć się, gdzie są zapisywane wygenerowane testy. Wygenerowany kod testu powinien zawierać test taki jak w następującym kodzie:

[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 asercje
  • PexChoose — generuje nowe opcje (dodatkowe dane wejściowe)
  • PexObserve — rejestruje wartości na żywo w generowanych 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 narzędzia IntelliTest:

Niedeterminizm

Narzędzie IntelliTest zakłada, że analizowany program jest deterministyczny. Jeśli tak nie jest, narzędzie IntelliTest cykle 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ć.

Narzędzie IntelliTest steruje danymi wejściowymi dostarczanymi dla sparametryzowanych testów jednostkowych i uzyskanymi z elementu 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ę przy ponownym uruchamianiu programu. W takich przypadkach narzędzie IntelliTest traci kontrolę nad wykonywaniem programu i 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 rzeczywiście losowych wartości.
  • Klasa System.DateTime udostępnia bieżącą godzinę, która nie jest pod kontrolą funkcji IntelliTest.

Współbieżność

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 za pośrednictwem wywołania P/Invoke. Nie wie ono, jak przekształcić takie wywołania w ograniczenia, które można przekazać do modułu rozwiązywania ograniczeń. Nawet w przypadku kodu .NET może ono 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 .

Sugerowane obejście polega na użyciu trybu testów, 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 na 32-bitowej platformie .NET Framework w architekturze x86.

Język

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

Wnioskowanie symboliczne

Narzędzie IntelliTest używa automatycznego modułu rozwiązywania ograniczeń, aby określać, które wartości są istotne dla testu i testowanego programu. Jednak możliwości modułu rozwiązywania ograniczeń są (i zawsze będą) ograniczone.

Nieprawidłowe ślady stosu

Ponieważ funkcja IntelliTest przechwytuje i wyjątki "rethrows" w każdej metodzie instrumentowanej, numery wierszy w śladach stosu nie będą poprawne. Jest to ograniczenie zgodne z projektem instrukcji „rethrow”.