Migrace z MSTest v3 na v4

Stabilní verze MSTest v4 je nyní k dispozici. Tento průvodce migrací zkoumá, co se změnilo v MSTest v4 a jak můžete migrovat na tuto verzi.

Note

Obecně řečeno, MSTest v4 není binární kompatibilní s MSTest v3. Všechny knihovny kompilované v3 musí být rekompilovány proti v4.

Změny způsobující chybu zdroje

Jedná se o zásadní změny, které můžou způsobit selhání kompilace testovacích projektů.

TestMethodAttribute zásadní změny

Změna metody TestMethodAttribute.Execute na TestMethodAttribute.ExecuteAsync

Pokud implementujete vlastní TestMethodAttribute, musíte změnit přepsání Execute na ExecuteAsync. Tato změna byla provedena kvůli opravě dlouhotrvajících chyb vzájemného zablokování, které jsou způsobeny synchronní blokující povahou rozhraní API.

Pokud jste například dříve měli následující:

public sealed class MyTestMethodAttribute : TestMethodAttribute
{
    public override TestResult[] Execute(ITestMethod testMethod)
    {
        // ...
        return result;
    }
}

Budete ho muset změnit na následující:

public sealed class MyTestMethodAttribute : TestMethodAttribute
{
    public override Task<TestResult[]> ExecuteAsync(ITestMethod testMethod)
    {
        // ...
        return Task.FromResult(result);
    }
}

TestMethodAttribute teď používá atributy informací volajícího.

Konstruktor TestMethodAttribute se změnil tak, aby měl parametry, které poskytují atributy informací o volajícím.

  • Pokud dědíte z TestMethodAttribute, měli byste také poskytnout takový konstruktor, který rozšíří informace do základní třídy.

    public class MyTestMethodAttribute : TestMethodAttribute
    {
        public MyTestMethodAttribute([CallerFilePath] string callerFilePath = "", [CallerLineNumber] int callerLineNumber = -1)
        : base(callerFilePath, callerLineNumber)
        {
        }
    }
    
  • Pokud máte aplikace atributů, například [TestMethodAttribute("Custom display name")], přepněte na [TestMethodAttribute(DisplayName = "Custom display name")].

Tip

Chystá se vám s touto migrací pomoct analyzátor s opravou kódu. Jediným kliknutím v integrovaném vývojovém prostředí se opraví všechny instance ve vašem řešení.

Výčet ClassCleanupBehavior je odstraněn

Nyní metody ClassCleanup běží pouze na konci testovací třídy. Podpora pro čištění třídy na konci sestavení byla odstraněna. Pokud je nutné spustit logiku vyčištění na konci sestavení, udělejte to v AssemblyCleanup místo ClassCleanup. Výchozí chování čištění tříd bylo dříve "EndOfAssembly", které uživatelé považovali za chybu.

Pokud jste dříve měli následující kód:

[ClassCleanup(ClassCleanupBehavior.EndOfClass)]
public static void ClassCleanup(TestContext testContext)
{
}

Budete ho muset změnit na následující:

[ClassCleanup]
public static void ClassCleanup(TestContext testContext)
{
}

TestContext.Properties je nyní řetězec IDictionary<, objekt>

Dříve bylo TestContext.PropertiesIDictionary. Chcete-li poskytnout lepší psaní, je to nyní IDictionary<string, object>.

Pokud máte hovory TestContext.Properties.Contains, aktualizujte je na TestContext.Properties.ContainsKey.

Výčet TestTimeout je odebrán.

Tento výčt měl pouze jeden člen, Infinitejehož hodnota byla int.MaxValue. Pokud jste měli použití [Timeout(TestTimeout.Infinite)], aktualizujte je na [Timeout(int.MaxValue)].

TestContext.ManagedType se teď odebere.

Vlastnost TestContext.ManagedType je odebrána. Místo toho použijte TestContext.FullyQualifiedTestClassName.

Typy, které nejsou určeny k veřejné spotřebě, jsou interní nebo odebrány

  • Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.Interface.ObjectModel.ITestMethod se stává interním.
    • Všimněte si, že toto rozhraní se liší od ITestMethod v sestavení TestFramework, které se nezměnily.
    • Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.Interface.ObjectModel.ITestMethod nemá žádné platné využití pro uživatele, takže byla interní.
  • Některé z již zastaralých typů byly učiněny interními. To zahrnuje:
    • MSTestDiscoverer
    • MSTestExecutor
    • AssemblyResolver
    • LogMessageListener
    • SprávceSpouštěníTestů
    • TestMethodInfo
    • TestResultExtensions
    • UnitTestOutcomeExtensions
    • GenericParameterHelper
    • Typy v sestavení služeb platformy

Změna podpisu rozhraní ASSERT API

  • Rozhraní API, která nyní přijímají pouze parametr message, a nikoliv oba object[] a message parametry. Místo toho použijte interpolaci řetězců. Tato změna byla nezbytná pro podporu výrazu argumentu volajícího pro asertní API.
  • Assert.AreEqual Odeberou se rozhraní API pro IEquatable<T> . Toto rozhraní API má velmi málo uživatelů a rozhraní API je zavádějící. Toto odebrání nemá vliv na většinu uživatelů, protože rozhraní API původně v MSTest v3 neexistuje a bylo zavedeno ve verzi 3.2.2.
    • Toto rozhraní API také způsobuje problémy pro uživatele jazyka F#. Například viz fsharp/fslang-suggestions/issues/905.
    • Pokud se vás to týká, zobrazí se chyba kompilace týkající se odvození obecného typu. Stačí jen explicitně zadat argument typu jako object.
  • Zastaralé Assert.ThrowsException rozhraní API je odstraněno. Analyzátor a oprava kódu v MSTest 3.10 vám pomůžou migrovat na novější rozhraní API.
  • Využití Assert.IsInstanceOfType<T>(x, out var t) by se teď mělo změnit na var t = Assert.IsInstanceOfType<T>(x).
    • Existující přetížení, která neměla parametr out, byla změněna tak, aby vracela instanci typu T místo void. Jedná se pouze o zásadní změnu pro jazyk F#.

Je odebráno rozhraní API ExpectedExceptionAttribute

ExpectedExceptionAttribute Zastaralé rozhraní API bylo odebráno. Analyzátor (MSTEST0006) a oprava kódu v MSTest 3.2 vám pomůžou migrovat na Assert.Throws.

Pokud jste například měli následující kód:

[ExpectedException(typeof(SomeExceptionType))]
[TestMethod]
public void TestMethod()
{
    MyCall();
}

Vy (nebo analyzátor a oprava kódu) ho musíte změnit na následující:

[TestMethod]
public void TestMethod()
{
    Assert.ThrowsExactly<SomeExceptionType>(() => MyCall());
}

Vyřazené nepodporované cílové architektury

Podpora cílových architektur .NET Core 3.1 na .NET 7 se zahodí. Minimální podporovaná verze .NET je .NET 8. Tato změna nemá vliv na rozhraní .NET Framework. Rozhraní .NET Framework 4.6.2 je nadále minimální podporovaný cíl rozhraní .NET Framework.

Strategie rozkladání byla přesunuta z jednotlivých zdrojů dat na TestMethodAttribute

Vývoj strategie je nedávná funkce představená v MSTest 3.7, která se dá obejít se známými omezeními. Vlastnost byla přidána do jednotlivých zdrojů dat jako DataRowAttribute a DynamicDataAttribute. Tato vlastnost byla přesunuta do TestMethodAttribute.

ConditionBaseAttribute.ShouldRun Změna rozhraní API

Vlastnost ConditionBaseAttribute.ShouldRun byla přejmenována na IsConditionMet. To přehledněji ukazuje, že by se ConditionMode neměl používat v implementaci.

Několik analyzátorů je aktualizováno tak, aby ve výchozím nastavení generovalo varování.

Výchozí závažnost následujících analyzátorů se změnila z informací na upozornění:

Změny narušující chování

Jedná se o zásadní změny, které mohou ovlivnit chování aplikace během provozu.

DisableAppDomain teď při spuštění pod MTP ve výchozím nastavení nastaví hodnotu true.

Ve verzi 4 a při spuštění s MTP jsou AppDomains ve výchozím nastavení zakázány (když není specifikováno jinak), protože vlastní izolace neposkytuje ve většině případů žádné výhody a má zásadní negativní dopad na výkon (až o 30 % pomalejší při provozu v izolaci).

Tato funkce ale zůstane k dispozici. Pokud máte scénáře, které ho vyžadují, přidejte DisableAppDomain nastavení do runsettings.

Důležité

Pokud je povolena izolace AppDomain, MSTest uvolní AppDomain po dokončení všech testů, což způsobí ukončení všech vláken přidružených k AppDomain, včetně vláken na popředí. V důsledku toho, pokud jste měli foregroundní vlákno běžící navždy v MSTest v3, bude testovací běh úspěšně dokončen. Stejný scénář přestane reagovat v MSTest v4, což je očekávané chování, protože proces by se neměl ukončit, když je popřední vlákno stále spuštěné.

TestContext se vyvolá při nesprávném použití.

Typ TestContext se předává "AssemblyInitialize", "ClassInitialize" a testům, ale dostupné informace v každé fázi se liší. Nyní je vyvolána výjimka při přístupu k vlastnosti spojené s informacemi o testovacím spuštění jako součást AssemblyInitialize nebo ClassInitialize.

  • Nelze získat přístup k TestContext.FullyQualifiedTestClassName při inicializaci sestavení.
  • TestContext.TestName nelze získat přístup v metodě inicializace sestavení nebo inicializace třídy.

TestCase.Id se mění

Aby bylo možné řešit dlouho nevyřízené chyby, které mnoho uživatelů nahlásilo, byla změněna generace TestCase.Id. To má vliv na funkce Azure DevOps, například sledování selhání testů v průběhu času.

Funkce TreatDiscoveryWarningsAsErrors je nyní ve výchozím nastavení nastavena na hodnotu true.

V4 používá přísnější výchozí hodnoty. Výchozí hodnota TreatDiscoveryWarningsAsErrors je nyní true. Tato změna by měla být pro většinu uživatelů transparentní a měla by ostatním uživatelům pomoct odhalit skryté chyby.

MsTest.Sdk už při použití MTP nepřidá odkaz Microsoft.NET.Test.Sdk

Ve výchozím nastavení používá MSTest.Sdk protokol MTP. UseVSTest Pokud je vlastnost MSBuild nastavena na true, bude místo toho používat VSTest. V MSTest 3.x sada SDK přidala odkaz na Microsoft.NET. Test.Sdk (který přináší podporu VSTest) i při použití MTP. Tento odkaz na balíček není nutný při spuštění s MTP a byl odebrán v MSTest v4.

Pokud stále chcete mít podporu VSTest (například pokud chcete spustit s vstest.console), musíte do projektu ručně přidat odkaz na Microsoft.NET.Test.Sdk balíček NuGet.