Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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.ITestMethodse 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.ITestMethodnemá žá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 obaobject[]amessageparametry. 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.AreEqualOdeberou se rozhraní API proIEquatable<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.ThrowsExceptionrozhraní 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 navar t = Assert.IsInstanceOfType<T>(x).- Existující přetížení, která neměla parametr
out, byla změněna tak, aby vracela instanci typuTmísto void. Jedná se pouze o zásadní změnu pro jazyk F#.
- Existující přetížení, která neměla parametr
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í:
- MSTEST0001
- MSTEST0007
- MSTEST0017
- MSTEST0023
- MSTEST0024
- MSTEST0025
- MSTEST0030
- MSTEST0031
- MSTEST0032
- MSTEST0035
- MSTEST0037
- MSTEST0045
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.FullyQualifiedTestClassNamepři inicializaci sestavení. -
TestContext.TestNamenelze 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.