Dela via


Migrera från MSTest v3 till v4

Den stabila versionen MSTest v4 är nu tillgänglig. Den här migreringsguiden utforskar vad som har ändrats i MSTest v4 och hur du kan migrera till den här versionen.

Note

I allmänhet är MSTest v4 inte binärt kompatibelt med MSTest v3. Alla bibliotek som kompileras mot v3 måste omkompileras mot v4.

Icke-bakåtkompatibla källändringar

Dessa är ändringar som bryter bakåtkompatibilitet och kan leda till att dina testprojekt inte kan kompileras.

TestMethodAttribute – ändringar som bryter bakåtkompatibilitet

Ändra TestMethodAttribute.Execute till TestMethodAttribute.ExecuteAsync

Om du implementerar din egen TestMethodAttributemåste du ändra åsidosättningen Execute till ExecuteAsync. Den här ändringen gjordes för att åtgärda långvariga dödlägesbuggar som orsakas av API:ets synkrona blockering.

Om du till exempel tidigare hade följande:

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

Du måste ändra det till följande:

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

TestMethodAttribute använder nu anroparinformationsattribut

Konstruktorn TestMethodAttribute har ändrats så att den har parametrar som tillhandahåller anroparinformationens attribut.

  • Om du ärver från TestMethodAttributebör du också ange en sådan konstruktor som sprider informationen till basklassen.

    public class MyTestMethodAttribute : TestMethodAttribute
    {
        public MyTestMethodAttribute([CallerFilePath] string callerFilePath = "", [CallerLineNumber] int callerLineNumber = -1)
        : base(callerFilePath, callerLineNumber)
        {
        }
    }
    
  • Om du har attributprogram som [TestMethodAttribute("Custom display name")]växlar du dem till [TestMethodAttribute(DisplayName = "Custom display name")].

Tip

En analysator med ett kodfix kommer snart för att hjälpa dig med den här migreringen. Ett enda klick i IDE åtgärdar alla instanser i din lösning.

Enumerationen ClassCleanupBehavior tas bort

Nu körs ClassCleanup-metoderna endast i slutet av testklassen. Stöd för klassrensning som ska köras i slutet av sammansättningen tas bort. Om du måste köra slutrensningslogik för sammansättningen, gör det i AssemblyCleanup istället för i ClassCleanup. Standardbeteendet för klassrensning var tidigare "EndOfAssembly", som användarna ansåg vara en bugg.

Om du tidigare hade följande kod:

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

Du måste ändra det till följande:

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

TestContext.Properties är nu IDictionary-sträng<, objekt>

Tidigare var TestContext.Properties en IDictionary. För att förbättra skrivupplevelsen är det nu IDictionary<string, object>.

Om du har anrop till TestContext.Properties.Containsuppdaterar du dem till TestContext.Properties.ContainsKey.

TestTimeout-uppräkning tas bort

Den här uppräkningen hade bara en enda medlem, Infinite, vars värde var int.MaxValue. Om du hade användning av [Timeout(TestTimeout.Infinite)]uppdaterar du dem till [Timeout(int.MaxValue)].

TestContext.ManagedType har nu tagits bort

Egenskapen TestContext.ManagedType tas bort. Använd TestContext.FullyQualifiedTestClassName i stället.

Typer som inte är avsedda för offentlig förbrukning görs interna eller tas bort

  • Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.Interface.ObjectModel.ITestMethod görs internt.
    • Observera att det här gränssnittet skiljer sig från ITestMethod i TestFramework-sammansättningen, som inte ändrades.
    • Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.Interface.ObjectModel.ITestMethod har inga giltiga användningar för användare, så det gjordes internt.
  • Vissa av de redan föråldrade typerna har blivit interna. Detta inkluderar:
    • MSTestDiscoverer
    • MSTestExecutor
    • AssemblyResolver
    • Loggmeddelandelyssnare
    • TestExecutionManager
    • TestMethodInfo
    • TestResultExtensions
    • UnitTestOutcomeExtensions
    • GenericParameterHelper
    • Typer i plattformstjänsternas sammansättning

Bekräfta API:ers signaturändring

  • API:er som accepterar både message och object[] parametrar accepterar nu endast message. Använd stränginterpolation i stället. Detta var en nödvändig ändring för att stödja anroparens argumentuttryck för api:er för försäkran.
  • Assert.AreEqual API:er för IEquatable<T> tas bort. Det finns mycket få användare av det här API:et och API:et är missvisande. De flesta användare påverkas inte av den här borttagningen eftersom API:et inte fanns i MSTest v3 och introducerades i 3.2.2.
    • Det här API:et orsakar även problem för F#-användare. Se till exempel fsharp/fslang-suggestions/issues/905.
    • Om du påverkas får du ett kompileringsfel om generell typinferens. Allt du behöver göra är att uttryckligen ange typargumentet som object.
  • De inaktuella Assert.ThrowsException API:erna tas bort. Ett analysverktyg och kodfix i MSTest 3.10 hjälper dig att migrera dig till de nyare API:erna.
  • Användning av Assert.IsInstanceOfType<T>(x, out var t) bör nu ändras till var t = Assert.IsInstanceOfType<T>(x).
    • Befintliga överlagringar som inte hade parametern out har ändrats för att returnera instansen av typen T istället för void. Det här är bara en icke-bakåtkompatibel ändring för F#.

API:et ExpectedExceptionAttribute tas bort

Det inaktuella API:et ExpectedExceptionAttribute tas bort. Ett analysverktyg (MSTEST0006) och kodfix i MSTest 3.2 hjälper dig att migrera dig till Assert.Throws.

Om du till exempel har följande kod:

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

Du (eller analysatorn och kodfixet) måste ändra det till följande:

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

Borttagna målramverk som inte stöds

Stöd för målramverken .NET Core 3.1 till .NET 7 tas bort. Den lägsta .NET-versionen som stöds är .NET 8. Den här ändringen påverkar inte .NET Framework. .NET Framework 4.6.2 är fortfarande det lägsta .NET Framework-målet som stöds.

Strategin för utfällning flyttades från de enskilda datakällorna till TestMethodAttribute

Utvecklingsstrategin är en ny funktion som introducerades i MSTest 3.7 för att kringgå kända begränsningar. Egenskapen lades till i enskilda datakällor som DataRowAttribute och DynamicDataAttribute. Den här egenskapen har flyttats till TestMethodAttribute.

ConditionBaseAttribute.ShouldRun API-ändring

Egenskapen ConditionBaseAttribute.ShouldRun har bytt namn till IsConditionMet. Det gör det tydligare att ConditionMode inte bör användas i implementeringen.

Flera analysverktyg uppdateras så att de varnas som standard

Standard allvarlighetsgraden för följande analysverktyg ändrades från Information till Varning:

Beteendebrytande ändringar

Det här är brytningsändringar som kan påverka beteendet under körning.

Standardvärdet för DisableAppDomain är nu true när det körs under Microsoft.Testing.Platform

I v4 och när de körs med Microsoft.Testing.Platform inaktiveras AppDomains som standard (när de inte anges) eftersom den anpassade isolering som tillhandahålls är värdelös i de flesta fall och har en viktig inverkan på prestanda (upp till 30% långsammare när de körs under isolering).

Funktionen är dock fortfarande tillgänglig. Om du har scenarier som kräver det, lägger du till inställningen DisableAppDomain i runsettings.

TestContext kastar när det används felaktigt

Typen TestContext skickas till AssemblyInitialize, ClassInitialize och till tester, men tillgänglig information i varje steg är olika. Nu utlöses ett undantag vid åtkomst till en egenskap som är relaterad till en testkörningsinformation som en del av AssemblyInitialize eller ClassInitialize.

  • TestContext.FullyQualifiedTestClassName kan inte nås i sammansättningsinitiering.
  • TestContext.TestName kan inte nås i sammansättningsinitiering eller klassinitiering.

TestCase.Id håller på att ändras

För att hantera långa utestående buggar som många användare har lämnat in har genereringen av TestCase.Id ändrats. Detta påverkar Azure DevOps-funktioner, till exempel spårning av testfel över tid.

TreatDiscoveryWarningsAsErrors har nu standardinställningen true

v4 använder striktare standardvärden. Därför är standardvärdet TreatDiscoveryWarningsAsErrors för nu true. Detta bör vara en transparent ändring för de flesta användare och bör hjälpa andra användare att upptäcka dolda buggar.

MSTest.Sdk lägger inte längre till Microsoft.NET.Test.Sdk referens när du använder Microsoft.Testing.Platform

Som standard använder MSTest.Sdk Microsoft.Testing.Platform. UseVSTest Om egenskapen MSBuild är inställd på true används VSTest i stället. I MSTest 3.x lade SDK till en referens till Microsoft.NET.Test.Sdk (som ger VSTest-stöd) även när du använder Microsoft.Testing.Platform. Den här paketreferensen är onödig när du kör med Microsoft.Testing.Platform och har tagits bort i MSTest v4.

Om du fortfarande vill att VSTest ska stödjas (till exempel om du vill köra med vstest.console) måste du manuellt lägga till en paketreferens till Microsoft.NET.Test.Sdk NuGet-paketet i projektet.