Sdílet prostřednictvím


Přehled nástroje Microsoft IntelliTest

IntelliTest vám umožňuje brzy najít chyby a snížit náklady na údržbu testů. Pomocí automatizovaného a transparentního testovacího přístupu může IntelliTest vygenerovat kandidátskou sadu testů pro váš kód .NET. Generování sady testů se dá dále řídit pomocí vlastností správnosti, které zadáte. IntelliTest také umí automaticky vyvíjet sadu testů, jak se vyvíjí kód v rámci testu.

Poznámka:

IntelliTest je k dispozici pouze v edici Enterprise. Podporuje se pro kód jazyka C#, který cílí na rozhraní .NET Framework. Pro podporu .NET 6 s IntelliTestem nainstalujte verzi Preview sady Visual Studio Enterprise a podívejte se na oznámení .

Charakterizační testy: IntelliTest umožňuje určit chování kódu v rámci sady tradičních testů jednotek. Taková sada testů může být použita jako regresní sada, která tvoří základ pro řešení složitosti spojené s refaktoringem staršího nebo neznámého kódu.

Generování vstupu pro testy s asistencí: IntelliTest používá otevřený přístup k analýze kódu a řešení omezení, aby mohl automaticky generovat přesné vstupní hodnoty testů – a to obvykle bez nutnosti zásahu uživatele. U složitých objektových typů automaticky generuje objekty pro vytváření (factory). Vytváření vstupu pro testy můžete vést tak, že rozšíříte a nakonfigurujete objekty factory tak, aby vyhovovaly vašim požadavkům. Vlastnosti správnosti zadané jako kontrolní výrazy v kódu se automaticky používají k dalšímu průvodci generováním vstupu testu.

Integrace do IDE: IntelliTest je plně integrovaný do integrovaného vývojového prostředí (IDE) sady Visual Studio. V integrovaném vývojovém prostředí sady Visual Studio se zobrazí všechny informace shromážděné během generování sady testů (například automaticky generované vstupy, výstup z vašeho kódu, vygenerované testovací případy a jejich stav – úspěch nebo neúspěch). Můžete snadno iterovat mezi opravou kódu a spouštěním IntelliTestu, aniž byste opustili integrované vývojové prostředí sady Visual Studio. Testy je možné uložit do řešení jako projekt testování jednotek a následně je automaticky rozpozná Průzkumník testů sady Visual Studio.

Doplňování stávajících postupů testování: IntelliTest můžete používat k doplňování stávajících postupů testování, podle kterých už možná postupujete.

Pokud chcete testovat:

Řetězec Hello World u funkce IntelliTest

IntelliTest najde vstupy relevantní pro testovaný program, což znamená, že ho můžete použít k vygenerování slavného řetězce Hello World! . Předpokladem je, že jste vytvořili projekt testů v C# založený na MSTestu a přidali jste odkaz na Microsoft.Pex.Framework. Pokud používáte jinou testovací architekturu, vytvořte knihovnu tříd jazyka C# a projděte si dokumentaci k testovacímu rozhraní o nastavení projektu.

Následující příklad vytvoří dvě omezení pro parametr pojmenovanou hodnotu , aby IntelliTest vygeneroval požadovaný řetězec:

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 kompilaci a provedení IntelliTest vygeneruje sadu testů, jako je následující sada:

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

Poznámka:

V případě problémů se sestavením zkuste nahradit odkazy Microsoft.VisualStudio.TestPlatform.TestFramework a Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions odkazem na Microsoft.VisualStudio.QualityTools.UnitTestFramework.

Přečtěte si Vygenerování testů jednotek pomocí IntelliTestu, ať víte, kam se vygenerované testy ukládají. Vygenerovaný testovací kód by měl zahrnovat test, jako je například následující kód:

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

Tak je to snadné!

Další prostředky:

Důležité atributy

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")]

Důležité třídy statických pomocných rutin

  • PexAssume vyhodnocuje předpoklady (filtrování vstupu).
  • PexAssert vyhodnocuje kontrolní výrazy.
  • PexChoose generuje nové volby (další vstupy).
  • PexObserve zaznamenává živé hodnoty do vygenerovaných testů.
[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);
}

Omezení

Tato část popisuje omezení IntelliTestu:

Bez determinismu

IntelliTest předpokládá, že analyzovaný program je deterministický. Pokud tomu tak není, IntelliTest se cykluje, dokud nedosáhne hranice průzkumu.

IntelliTest považuje program za ne-determistický, pokud spoléhá na vstupy, které IntelliTest nemůže řídit.

IntelliTest řídí vstupy poskytované pro parametrizované testy jednotek a získané z PexChoose. V takovém případě se výsledky volání nespravovaného nebo nespravovaného kódu považují za vstupy do instrumentovaného programu, ale IntelliTest je nedokáže ovládat. Pokud tok řízení programu závisí na konkrétních hodnotách pocházejících z těchto externích zdrojů, IntelliTest nemůže program "řídit" směrem k dříve odhaleným oblastem.

Kromě toho je program považován za nedetermisticný, pokud se při opětovném spuštění programu změní hodnoty z externích zdrojů. V takových případech IntelliTest ztratí kontrolu nad spuštěním programu a jeho hledání se stává neefektivní.

Někdy to není zřejmé, když k tomu dojde. Zvažte následující příklady:

  • Výsledek metody GetHashCode() je poskytován nespravovaným kódem a není předvídatelný.
  • Třída System.Random používá aktuální systémový čas k zajištění skutečně náhodných hodnot.
  • Třída System.DateTime poskytuje aktuální čas, který není pod kontrolou IntelliTest.

Souběžnost

IntelliTest nezpracuje vícevláknové programy.

Nativní kód

IntelliTest nerozumí nativnímu kódu, jako jsou instrukce x86 volané prostřednictvím volání nespravovaného kódu. Neví, jak přeložit taková volání na omezení, která je možné předat řešiteli omezení. I pro kód .NET může analyzovat jenom kód, který instrumentuje. IntelliTest nemůže instrumentovat určité části knihovny mscorlib, včetně knihovny reflexe. DynamicMethod nejde instrumentovat.

Navrhované alternativní řešení je mít testovací režim, ve kterém se tyto metody nacházejí v typech v dynamickém sestavení. I když jsou však některé metody neinstrumentované, IntelliTest se pokusí pokrýt co nejvíce instrumentovaného kódu.

Platforma

IntelliTest je podporovaný jenom v 32bitové architektuře .NET X86.

Jazyk

IntelliTest v zásadě dokáže analyzovat libovolné programy .NET napsané v jakémkoliv jazyce .NET. V sadě Visual Studio však podporuje jenom C#.

Symbolické zdůvodnění

IntelliTest používá k určení, které hodnoty jsou relevantní pro test a testovaný program, automatického řešitele omezení. Nicméně možnosti řešitele omezení jsou a vždycky budou omezené.

Nesprávná trasování zásobníků

Vzhledem k tomu, že IntelliTest zachytává výjimky a výjimky "rethrows" v každé instrumentované metodě, nebudou čísla řádků v trasování zásobníku správná. Toto omezení je součástí instrukce „opětovného vypouštění“ (rethrow).