Remarque
L’accès à cette page requiert une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page requiert une autorisation. Vous pouvez essayer de modifier des répertoires.
La version stable MSTest v4 est désormais disponible. Ce guide de migration explore les modifications apportées à MSTest v4 et la façon dont vous pouvez migrer vers cette version.
Note
En règle générale, MSTest v4 n’est pas compatible binaire avec MSTest v3. Toute bibliothèque compilée sur v3 doit être recompilée sur v4.
Changements non rétrocompatibles de la source
Ces modifications de rupture pourraient entraîner l’échec de la compilation de vos projets de test.
Modifications impliquant une rupture de compatibilité de TestMethodAttribute
Remplacer TestMethodAttribute.Execute par TestMethodAttribute.ExecuteAsync
Si vous implémentez votre propre TestMethodAttribute, vous devez modifier la surcharge Execute afin qu’elle devienne ExecuteAsync.
Cette modification a été apportée pour corriger les bogues de blocage de longue date qui sont causés par la nature synchrone bloquante de l’API.
Par exemple, si vous aviez précédemment les éléments suivants :
public sealed class MyTestMethodAttribute : TestMethodAttribute
{
public override TestResult[] Execute(ITestMethod testMethod)
{
// ...
return result;
}
}
Vous devez le remplacer par ce qui suit :
public sealed class MyTestMethodAttribute : TestMethodAttribute
{
public override Task<TestResult[]> ExecuteAsync(ITestMethod testMethod)
{
// ...
return Task.FromResult(result);
}
}
TestMethodAttribute utilise désormais des attributs d’informations de l’appelant
Le TestMethodAttribute constructeur a changé pour avoir des paramètres qui fournissent des attributs d'informations d'appelant.
Si vous héritez de
TestMethodAttribute, vous devez également fournir un tel constructeur qui propage les informations à la classe de base.public class MyTestMethodAttribute : TestMethodAttribute { public MyTestMethodAttribute([CallerFilePath] string callerFilePath = "", [CallerLineNumber] int callerLineNumber = -1) : base(callerFilePath, callerLineNumber) { } }Si vous avez des applications d’attribut telles que
[TestMethodAttribute("Custom display name")], basculez-les vers[TestMethodAttribute(DisplayName = "Custom display name")].
Tip
Un analyseur avec un codefix est disponible pour vous aider à effectuer cette migration. Un seul clic dans l’IDE corrige toutes les instances de votre solution.
L’énumération ClassCleanupBehavior est supprimée
À présent, les méthodes ClassCleanup s’exécutent uniquement à la fin de la classe de test. La prise en charge du nettoyage de classe à exécuter à la fin de l’assembly est supprimée.
Si vous devez exécuter la logique de nettoyage après l'assemblage, faites-le plutôt dans AssemblyCleanup que dans ClassCleanup.
Le comportement par défaut du nettoyage de classe était auparavant « EndOfAssembly », ce que les utilisateurs considéraient comme un bogue.
Si vous aviez précédemment le code suivant :
[ClassCleanup(ClassCleanupBehavior.EndOfClass)]
public static void ClassCleanup(TestContext testContext)
{
}
Vous devez le remplacer par ce qui suit :
[ClassCleanup]
public static void ClassCleanup(TestContext testContext)
{
}
TestContext.Properties est maintenant IDictionary<string, object>
Auparavant, TestContext.Properties c’était un IDictionary. Pour fournir une meilleure saisie, il s’agit maintenant de IDictionary<string, object>.
Si vous avez des appels à TestContext.Properties.Contains, mettez-les à jour vers TestContext.Properties.ContainsKey.
L’énumération TestTimeout est supprimée
Cette énumération n’avait qu’un seul membre, Infinitedont la valeur était int.MaxValue.
Si vous aviez des utilisations de [Timeout(TestTimeout.Infinite)], mettez-les à jour vers [Timeout(int.MaxValue)].
TestContext.ManagedType est maintenant supprimé
La propriété TestContext.ManagedType est supprimée. Utilisez TestContext.FullyQualifiedTestClassName à la place.
Les types non destinés à un usage public sont rendus internes ou supprimés
-
Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.Interface.ObjectModel.ITestMethodest rendu interne.- Notez que cette interface est différente de ITestMethod dans l’assembly TestFramework, qui n’a pas changé.
-
Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.Interface.ObjectModel.ITestMethodn’a pas d’utilisation valide pour les utilisateurs, il a donc été rendu interne.
- Certains des types déjà obsolètes sont rendus internes. notamment :
- MSTestDiscoverer
- MSTestExecutor
- AssemblyResolver
- ÉcouteurDeMessagesDeJournal
- TestExecutionManager
- TestMethodInfo
- TestResultExtensions
- UnitTestOutcomeExtensions
- GenericParameterHelper
- Types dans l’assemblage des services de plateforme
Changement de signature des API Assert
- Les API qui acceptent à la fois les paramètres
messageetobject[]acceptent désormais uniquementmessage. Utilisez plutôt l’interpolation de chaîne. Il s’agissait d’une modification nécessaire pour prendre en charge l’expression d’argument de l’appelant pour les API d’assertion. -
Assert.AreEqualLes API pourIEquatable<T>sont supprimées. Il existe très peu d’utilisateurs de cette API et l’API est trompeuse. La plupart des utilisateurs ne sont pas affectés par cette suppression, car l’API n’existe pas initialement dans MSTest v3 et a été introduite dans la version 3.2.2.- Cette API provoque également des problèmes pour les utilisateurs F#. Par exemple, consultez fsharp/fslang-suggestions/issues/905.
- Si vous êtes concerné, vous obtenez une erreur de compilation sur l’inférence de type générique. Tout ce que vous devez faire est de spécifier explicitement l’argument de type en tant que
object.
- Les API déconseillées
Assert.ThrowsExceptionsont supprimées. Un analyseur et un codefix dans MSTest 3.10 vous aident à migrer vers les API plus récentes. - Les utilisations de
Assert.IsInstanceOfType<T>(x, out var t)devraient maintenant passer àvar t = Assert.IsInstanceOfType<T>(x).- Les surcharges existantes qui n’avaient pas le paramètre
outont été modifiées pour renvoyer l’instance de typeTau lieu de void. Il s’agit uniquement d’un changement non rétrocompatible pour F#.
- Les surcharges existantes qui n’avaient pas le paramètre
L’API ExpectedExceptionAttribute est supprimée
L’API déconseillée ExpectedExceptionAttribute est supprimée. Un analyseur (MSTEST0006) et un codefix dans MSTest 3.2 vous aident à migrer vers Assert.Throws.
Par exemple, si vous avez le code suivant :
[ExpectedException(typeof(SomeExceptionType))]
[TestMethod]
public void TestMethod()
{
MyCall();
}
Vous (ou l’analyseur et le codefix) devez le modifier comme suit :
[TestMethod]
public void TestMethod()
{
Assert.ThrowsExactly<SomeExceptionType>(() => MyCall());
}
Frameworks cibles non pris en charge supprimés
La prise en charge des frameworks cibles de .NET Core 3.1 à .NET 7 est arrêtée. La version minimale prise en charge de .NET est .NET 8. Cette modification n’affecte pas .NET Framework. .NET Framework 4.6.2 continue d’être la cible .NET Framework minimale prise en charge.
Stratégie de dépliement déplacée des sources de données individuelles vers TestMethodAttribute
La stratégie de déploiement est une fonctionnalité récente introduite dans MSTest 3.7 pour contourner les limitations connues.
La propriété a été ajoutée sur des sources de données individuelles comme DataRowAttribute et DynamicDataAttribute. Cette propriété a été déplacée vers TestMethodAttribute.
ConditionBaseAttribute.ShouldRun Modification de l’API
La propriété ConditionBaseAttribute.ShouldRun a été renommée en IsConditionMet. Il est ainsi plus clair que ConditionMode ne doit pas être utilisé dans l’implémentation.
Plusieurs analyseurs sont mis à jour pour être avertis par défaut
La gravité par défaut des analyseurs suivants est passée d’Informations à Avertissement :
- MSTEST0001
- MSTEST0007
- MSTEST0017
- MSTEST0023
- MSTEST0024
- MSTEST0025
- MSTEST0030
- MSTEST0031
- MSTEST0032
- MSTEST0035
- MSTEST0037
- MSTEST0045
Modifications importantes du comportement
Ces changements de rupture peuvent affecter le comportement pendant l'exécution.
DisableAppDomain a désormais la valeur true lors de l’exécution sous Microsoft.Testing.Platform
Dans la version 4 et lors de l’exécution avec Microsoft.Testing.Platform, les domaines d’application sont désactivés par défaut (lorsqu’ils ne sont pas spécifiés), car l’isolation personnalisée fournie est inutile dans la plupart des cas et a un impact important sur les performances (jusqu’à 30% plus lent lors de l’exécution sous isolation).
Toutefois, la fonctionnalité reste disponible. Si vous avez des scénarios nécessitant cela, ajoutez le DisableAppDomain paramètre dans runsettings.
Important
Lorsque l’isolation AppDomain est activée, MSTest décharge l’AppDomain une fois tous les tests terminés, ce qui abandonne tous les threads associés à AppDomain, y compris les threads de premier plan. Par conséquent, si vous aviez un thread de premier plan s’exécutant indéfiniment dans MSTest v3, l’exécution du test s’exécute correctement. Le même scénario se bloque dans MSTest v4, ce qui est un comportement idéal, car le processus ne doit pas se quitter lorsqu’un thread de premier plan est toujours en cours d’exécution.
TestContext lève une exception lorsqu’il est utilisé de manière incorrecte
Le type TestContext est passé à AssemblyInitialize, ClassInitialize et aux tests, mais les informations disponibles diffèrent à chaque étape. À présent, une exception est générée lors de l’accès à une propriété liée à des informations d’exécution de test dans le cadre de AssemblyInitialize ou de ClassInitialize.
-
TestContext.FullyQualifiedTestClassNamen'est pas accessible dans l'initialisation de l'assembly. -
TestContext.TestNamen’est pas accessible lors de l’initialisation de l’assembly ou de la classe.
TestCase.Id est en train de changer
Pour résoudre les bogues en attente depuis longtemps et déposés par de nombreux utilisateurs, la génération de TestCase.Id a changé. Cela affecte les fonctionnalités Azure DevOps, par exemple, le suivi des échecs de test au fil du temps.
TreatDiscoveryWarningsAsErrors est maintenant défini sur vrai par défaut
v4 utilise des valeurs par défaut plus strictes. Par conséquent, la valeur par défaut est TreatDiscoveryWarningsAsErrors maintenant true. Il doit s’agir d’un changement transparent pour la plupart des utilisateurs et aider d’autres utilisateurs à découvrir les bogues cachés.
MSTest.Sdk n’ajoute Microsoft.NET.Test.Sdk plus de référence lors de l’utilisation de Microsoft.Testing.Platform
Par défaut, MSTest.Sdk utilise Microsoft.Testing.Platform. Si la propriété MSBuild est définie sur true, VSTest sera utilisé à la place. Dans MSTest 3.x, le SDK a ajouté une référence à Microsoft.NET.Test.Sdk (qui apporte la prise en charge de VSTest), même lors de l’utilisation de Microsoft.Testing.Platform. Cette référence de package n’est pas nécessaire lors de l’exécution avec Microsoft.Testing.Platform et a été supprimée dans MSTest v4.
Si vous souhaitez toujours que VSTest soit pris en charge (par exemple, si vous souhaitez exécuter avec vstest.console), vous devez ajouter manuellement une référence de package au Microsoft.NET.Test.Sdk package NuGet à votre projet.