Configurer MSTest

MSTest, Microsoft Testing Framework, est une infrastructure de tests pour les applications .NET. Elle vous permet d’écrire et d’exécuter des tests et de fournir des suites de tests avec une intégration à Visual Studio et aux fonctionnalités Explorateur de test Visual Studio Code, à l’interface CLI .NET et à plusieurs pipelines d’intégration continue (CI).

MSTest est une infrastructure de tests multiplateforme, open source et totalement prise en charge qui fonctionne avec toutes les cibles .NET prises en charge (.NET Framework, .NET Core, .NET, UWP, WinUI, etc.) hébergées sur GitHub.

Paramètres d'exécution

Un fichier .runsettings peut être utilisé pour configurer la façon dont les tests unitaires sont exécutés. Pour en savoir plus sur les runsettings et les configurations liés à la plateforme, vous pouvez consulter la documentation sur les runsettings VSTest ou la documentation sur les runsettings de l’exécuteur MSTest.

Élément MSTest

Les entrées des paramètres d'exécution suivantes permettent de configurer le comportement de MSTest.

Paramétrage Par défaut Valeurs
AssemblyCleanupTimeout Aucun Définissez de manière globale le délai d'expiration à appliquer à chaque instance de méthode de nettoyage d'assemblage. [Timeout] l’attribut spécifié sur la méthode de nettoyage d’assembly remplace le délai d’expiration global.
AssemblyInitializeTimeout Aucun Spécifiez globalement le délai d’expiration à appliquer à chaque instance de méthode d’initialisation d’assembly. [Timeout] l’attribut spécifié dans la méthode d’initialisation de l’assembly remplace le délai d’expiration global.
AssemblyResolution faux Vous pouvez spécifier des chemins d’assemblys supplémentaires pour la recherche et l’exécution des tests unitaires. Par exemple, utilisez ces chemins pour les assemblys de dépendance qui ne se trouvent pas dans le même répertoire que l’assembly de test. Pour spécifier un chemin, utilisez un élément Directory Path. Les chemins peuvent inclure des variables d’environnement.

<AssemblyResolution> <Directory path="D:\myfolder\bin\" includeSubDirectories="false"/> </AssemblyResolution>

Cette fonctionnalité est appliquée seulement lors de l’utilisation d’une cible .NET Framework.
CaptureTraceOutput Result Capturez du texte à partir des Console.Write*Trace.Write*API et Debug.Write* des API et associez-le au test actuel. À compter de MSTest 4.4, utilisez None, Resultou Live. Live fait également écho Console, Traceet TestContext.Write* génère une sortie à la console pendant l’exécution du test. Les valeurs booléennes antérieures restent prises en charge : true mappées à Result, et false mappées à None.
ClassCleanupLifecycle EndOfClass Si vous souhaitez que le nettoyage de classe se produise à la fin de l’assembly, configurez-le sur EndOfAssembly. (N’est plus pris en charge à partir de MSTest v4, car EndOfClass est le comportement ClassCleanup par défaut et le seul pris en charge)
ClassCleanupTimeout Aucun Spécifiez globalement le délai d’expiration à appliquer à chaque instance de méthode de nettoyage de classe. L’attribut [Timeout] spécifié sur la méthode de nettoyage de la classe remplace le délai d’expiration global.
ClassInitializeTimeout Aucun Spécifiez globalement le délai d’expiration à appliquer à chaque instance de méthode d’initialisation de classe. L’attribut [Timeout] spécifié sur la méthode d’initialisation de la classe remplace le délai d’expiration global.
ConsiderFixturesAsSpecialTests faux Pour afficher AssemblyInitialize, AssemblyCleanup, ClassInitialize, ClassCleanup en tant qu'entrées individuelles dans le journal de Visual Studio et Visual Studio Code Test Explorer et .trx, définissez cette valeur sur vrai.
DeleteDeploymentDirectoryAfterTestRunIsComplete vrai Pour conserver le répertoire de déploiement après une série de tests, définissez cette valeur sur false.
DeploymentEnabled vrai Si vous définissez cette valeur sur false, les éléments du déploiement que vous avez spécifiés dans votre méthode de test ne sont pas copiés dans le répertoire de déploiement.
DeployTestSourceDependencies vrai Valeur indiquant si les références de source de test doivent être déployées.
EnableBaseClassTestMethodsFromOtherAssemblies vrai Valeur indiquant s’il est nécessaire d’activer la découverte des méthodes de test à partir de classes de base dans un autre assembly que celui de la classe de test qui hérite.
ForcedLegacyMode faux Dans les anciennes versions de Visual Studio, l’adaptateur MSTest a été optimisé afin d’être plus rapide et plus scalable. Un comportement, tel que l’ordre dans lequel les tests sont exécutés, peut ne pas être exactement identique à celui d’éditions précédentes de Visual Studio. Définissez la valeur sur true pour utiliser l’adaptateur de test le plus ancien.

Par exemple, vous pouvez utiliser ce paramètre si un fichier app.config est spécifié pour un test unitaire.

Il est recommandé d’envisager de refactoriser vos tests pour vous permettre d’utiliser le nouvel adaptateur.
GlobalTestCleanupTimeout TestCleanupTimeout À compter de MSTest 4.4, spécifiez le délai d’expiration de chaque méthode de nettoyage de test globale. Lorsque vous omettez cette entrée, MSTest utilise TestCleanupTimeout. Un [Timeout] attribut de la méthode remplace les deux valeurs.
GlobalTestInitializeTimeout TestInitializeTimeout À compter de MSTest 4.4, spécifiez le délai d’expiration pour chaque méthode d’initialisation de test global. Lorsque vous omettez cette entrée, MSTest utilise TestInitializeTimeout. Un [Timeout] attribut de la méthode remplace les deux valeurs.
LaunchDebuggerOnTestFailure faux À compter de MSTest 4.2, lorsqu’il est défini sur true, MSTest lance le débogueur lorsqu’un test échoue.
MapInconclusiveToFailed faux Si un test se termine avec un état Non concluant, il est mappé à l’état Ignoré dans l’Explorateur de tests. Si vous voulez que les tests non concluants s’affichent comme ayant échoué, définissez la valeur sur true.
MapNotRunnableToFailed vrai Valeur indiquant si un résultat non exécutable est mappé à un test non réussi.
OrderTestsByNameInClass faux Si vous souhaitez exécuter des tests par noms de test à la fois dans les Explorateurs de tests et sur la ligne de commande, définissez cette valeur sur true.
Parallelize Utilisé pour définir les paramètres de parallélisation :

Workers: nombre de threads/workers à utiliser pour la parallélisation, qui est par défaut le nombre de processeurs sur l’ordinateur actuel.

Scope: étendue de la parallélisation. Vous pouvez le définir sur MethodLevel. Par défaut, il s’agit de ClassLevel.

<Parallelize><Workers>32</Workers><Scope>MethodLevel</Scope></Parallelize>
RandomizeTestOrder faux À compter de MSTest 4.3, définissez cette valeur sur true pour exécuter des tests dans un ordre aléatoire, ce qui permet d’afficher les dépendances de classement masquées entre les tests. Ce paramètre ne peut pas être combiné avec OrderTestsByNameInClass.
RandomTestOrderSeed À partir de MSTest 4.3, lorsque RandomizeTestOrder est vrai, définissez une graine entière pour rendre l’ordre aléatoire reproductible d’une exécution à l’autre. Lorsqu’il n’est pas défini, une nouvelle graine est utilisée pour chaque exécution.
SettingsFile Vous pouvez spécifier un fichier de paramètres de test à utiliser avec l’adaptateur MSTest ici. Vous pouvez également spécifier un fichier de paramètres de test à partir du menu de paramètres.

Si vous spécifiez cette valeur, vous devez également définir la ForcedLegacyMode valeur true.

<ForcedLegacyMode>true</ForcedLegacyMode>
TestCleanupTimeout Aucun Spécifiez globalement le délai d’expiration à appliquer à chaque instance de méthode de nettoyage de test. Le paramètre [Timeout] spécifié sur la méthode de nettoyage des tests remplace le délai d’expiration global.
TestInitializeTimeout Aucun Spécifiez globalement le délai d’expiration à appliquer à chaque instance de méthode d’initialisation de test. L’attribut [Timeout] spécifié sur la méthode d’initialisation de test remplace le délai d’expiration global.
TestTimeout Aucun Obtient le délai d’expiration du cas de test global spécifié.
TreatClassAndAssemblyCleanupWarningsAsErrors faux Pour voir vos échecs des nettoyages de classe sous forme d’erreurs, affectez à cette valeur la valeur true.
TreatDiscoveryWarningsAsErrors faux Pour signaler des avertissements de découverte de tests en tant qu’erreurs, définissez cette valeur sur true.

Les valeurs de délai d’expiration doivent être des entiers positifs en millisecondes. Pour s’exécuter sans délai d’expiration, omettez l’entrée au lieu de la définir 0sur . Les délais d’expiration des appareils de test globaux héritent de la valeur ou TestCleanupTimeout de la valeur correspondanteTestInitializeTimeout.

élément TestRunParameter

<TestRunParameters>
    <Parameter name="webAppUrl" value="http://localhost" />
</TestRunParameters>

Les paramètres d’exécution de test permettent de définir des variables et des valeurs disponibles pour les tests au moment de l’exécution. Accédez aux paramètres en utilisant la propriété TestContext.Properties MSTest :

private string _appUrl;
public TestContext TestContext { get; set; }

[TestMethod]
public void HomePageTest()
{
    string _appUrl = TestContext.Properties["webAppUrl"];
}

Pour utiliser des paramètres d’exécution de test, ajoutez une propriété de publique TestContext à votre classe de test.

Exemple de fichier .runsettings

Le code XML suivant illustre le contenu d’un fichier .runsettings type. Copiez ce code et modifiez-le selon vos besoins.

Chaque élément du fichier est facultatif, car il a une valeur par défaut.

<?xml version="1.0" encoding="utf-8"?>
<RunSettings>

  <!-- Parameters used by tests at runtime -->
  <TestRunParameters>
    <Parameter name="webAppUrl" value="http://localhost" />
    <Parameter name="webAppUserName" value="Admin" />
    <Parameter name="webAppPassword" value="Password" />
  </TestRunParameters>

  <!-- MSTest -->
  <MSTest>
    <MapInconclusiveToFailed>True</MapInconclusiveToFailed>
    <CaptureTraceOutput>false</CaptureTraceOutput>
    <DeleteDeploymentDirectoryAfterTestRunIsComplete>False</DeleteDeploymentDirectoryAfterTestRunIsComplete>
    <DeploymentEnabled>False</DeploymentEnabled>
    <ConsiderFixturesAsSpecialTests>False</ConsiderFixturesAsSpecialTests>
    <AssemblyResolution>
      <Directory path="D:\myfolder\bin\" includeSubDirectories="false"/>
    </AssemblyResolution>
  </MSTest>

</RunSettings>

testconfig.json

Lorsque vous exécutez vos tests avec MSTest, vous pouvez utiliser un fichier testconfig.json pour configurer le comportement de l’exécuteur de test. Le fichier testconfig.json est un fichier JSON qui contient les paramètres de configuration de l’exécuteur de test. Le fichier est utilisé pour configurer l’exécuteur de test et l’environnement d’exécution de test. Pour plus d’informations, reportez-vous à la documentation du testconfig.json MTP.

À compter de MSTest 3.7, vous pouvez également configurer des exécutions MSTest dans le même fichier de configuration. Les sections suivantes décrivent les paramètres que vous pouvez utiliser dans le fichier testconfig.json.

À compter de MSTest 4.3.3, .NET Framework s’exécute accepte également les commentaires et les virgules de fin dans testconfig.json.

Élément MSTest

Les paramètres MSTest sont regroupés par fonctionnalité décrites dans les sections suivantes.

Entrée Par défaut Descriptif
ActiverLesMéthodesDeTestDeLaClasseDeBaseDepuisDautresAssemblées vrai Valeur indiquant s’il est nécessaire d’activer la découverte des méthodes de test à partir de classes de base dans un autre assembly que celui de la classe de test qui hérite.
classCleanupLifecycle Fin de l'assemblage Si vous souhaitez que le nettoyage de la classe se produise à la fin de la classe, définissez-le sur EndOfClass.

paramètres assemblyResolution

Tous les paramètres de cette section appartiennent à l’élément assemblyResolution.

Entrée Par défaut Descriptif
Chemins Aucun Vous pouvez spécifier des chemins d’assemblys supplémentaires pour la recherche et l’exécution des tests unitaires. Par exemple, utilisez ces chemins pour les assemblys de dépendance qui ne se trouvent pas dans le même répertoire que l’assembly de test. Vous pouvez spécifier un chemin d’accès dans la forme { "path": "...", "includeSubDirectories": "true/false" }.

Exemple:

{
  "mstest": {
    "assemblyResolution": {
        { "path": "...", "includeSubDirectories": "true/false" }
    }
  }
}

paramètres deployment

Tous les paramètres de cette section appartiennent à l’élément deployment.

Entrée Par défaut Descriptif
supprimerLeRépertoireDeDéploiementAprèsLaFinDuTest vrai Pour conserver le répertoire de déploiement après une série de tests, définissez cette valeur sur false.
deployTestSourceDependencies vrai Indique si les références de source de test doivent être déployées.
enabled vrai Si vous définissez cette valeur sur false, les éléments du déploiement que vous avez spécifiés dans votre méthode de test ne sont pas copiés dans le répertoire de déploiement.

Exemple:

{
  "mstest": {
    "deployment": {
        "deleteDeploymentDirectoryAfterTestRunIsComplete": true,
        "deployTestSourceDependencies": true,
        "enabled": true
    }
  }
}

paramètres output

Tous les paramètres de cette section appartiennent à l’élément output.

Entrée Par défaut Descriptif
captureTrace Result Capturez, Traceet affichez-le Consoleet Debug associez-le au test actuel. À compter de MSTest 4.4, utilisez None, Resultou Live. Live fait également écho à la sortie, y compris TestContext.Write* les messages, pendant que le test s’exécute. Les valeurs booléennes restent prises en charge : true mappées à Result, et false mappées à None.

Exemple:

{
  "mstest": {
    "output": {
        "captureTrace": false
    }
  }
}

paramètres parallelism

Tous les paramètres de cette section appartiennent à l’élément parallelism.

Entrée Par défaut Descriptif
enabled faux Activez la parallélisation des tests.
portée classe Étendue de la parallélisation. Vous pouvez le définir sur method. La valeur par défaut, class, correspond à l’exécution de tous les tests d’une classe donnée séquentiellement, mais plusieurs classes en parallèle.
travailleur 0 Nombre de threads/workers à utiliser pour la parallélisation. La valeur par défaut correspond au nombre de processeurs sur l’ordinateur actuel.

Exemple:

{
  "mstest": {
    "parallelism": {
        "enabled": true,
        "scope": "method",
        "workers": 32
    }
  }
}

paramètres execution

Tous les paramètres de cette section appartiennent à l’élément execution.

Entrée Par défaut Descriptif
considerEmptyDataSourceAsInconclusive faux Lorsqu’elle est définie sur true, une source de données vide est considérée comme inconclusive.
considérerLesFixturesCommeDesTestsSpéciaux faux Pour afficher AssemblyInitialize, AssemblyCleanup, ClassInitialize, ClassCleanup en tant qu'entrées individuelles dans le journal de Visual Studio et Visual Studio Code Test Explorer et .trx, définissez cette valeur sur vrai.
dépendances À compter de MSTest 4.4, déclarez la dépendance chains de test et nodes. Ce paramètre est disponible uniquement avec Microsoft. Testing.Platform. Pour plus d’informations, consultez Tester les dépendances.
mapInconclusiveToFailed faux Si un test se termine avec un état Non concluant, il est mappé à l’état Ignoré dans l’Explorateur de tests. Si vous voulez que les tests non concluants s’affichent comme ayant échoué, définissez la valeur sur true.
lancer le débogueur en cas d’échec du test faux À partir de MSTest 4.2, lorsqu’il est défini sur true, MSTest lance le débogueur lorsqu’un test échoue.
mapNotRunnableToFailed vrai Valeur indiquant si un résultat non exécutable est mappé à un test non réussi.
ordonnerTestsParNomDansClasse faux Exécutez des tests par ordre alphabétique dans chaque classe. À compter de MSTest 4.3, utilisez mstest.execution.orderTestsByNameInClass. La clé précédente mstest.orderTestsByNameInClass fonctionne toujours, mais génère un avertissement de dépréciation.
randomiserOrdreDesTests faux À compter de MSTest 4.3, définissez cette valeur pour true exécuter des tests dans un ordre aléatoire, ce qui permet d’afficher les dépendances de classement masquées entre les tests. Ce paramètre ne peut pas être combiné avec orderTestsByNameInClass.
randomTestOrderSeed À partir de MSTest 4.3, lorsque randomizeTestOrder est true, définissez une graine entière pour rendre l’ordre aléatoire reproductible d’une exécution à l’autre. Lorsqu’il n’est pas défini, une nouvelle graine est utilisée pour chaque exécution.
treatClassAndAssemblyCleanupWarningsAsErrors faux Pour voir vos échecs des nettoyages de classe sous forme d’erreurs, affectez à cette valeur la valeur true.
TraitementDesAvertissementsDeDécouverteCommeErreurs faux Pour signaler des avertissements de découverte de tests en tant qu’erreurs, définissez cette valeur sur true.

Exemple:

{
  "mstest": {
    "execution": {
        "considerEmptyDataSourceAsInconclusive": false,
        "considerFixturesAsSpecialTests": false,
        "mapInconclusiveToFailed": true,
        "mapNotRunnableToFailed": true,
        "treatClassAndAssemblyCleanupWarningsAsErrors": false,
        "treatDiscoveryWarningsAsErrors": false
    }
  }
}

paramètres timeout

Tous les paramètres de cette section appartiennent à l’élément timeout.

Entrée Par défaut Descriptif
assemblyCleanup Aucun Définissez de manière globale le délai d'expiration à appliquer à chaque instance de méthode de nettoyage d'assemblage.
assemblyInitialize Aucun Spécifiez globalement le délai d’expiration à appliquer à chaque instance de méthode d’initialisation d’assembly.
classCleanup Aucun Spécifiez globalement le délai d’expiration à appliquer à chaque instance de méthode de nettoyage de classe.
classInitialize Aucun Spécifiez globalement le délai d’expiration à appliquer à chaque instance de méthode d’initialisation de classe.
globalTestCleanup testCleanup À compter de MSTest 4.4, spécifiez le délai d’expiration de chaque méthode de nettoyage de test globale. Lorsque vous omettez cette entrée, MSTest utilise testCleanup.
globalTestInitialize testInitialize À compter de MSTest 4.4, spécifiez le délai d’expiration pour chaque méthode d’initialisation de test global. Lorsque vous omettez cette entrée, MSTest utilise testInitialize.
essai Aucun Spécifiez globalement le délai d’expiration du test.
testCleanup Aucun Spécifiez globalement le délai d’expiration à appliquer à chaque instance de méthode de nettoyage de test.
testInitialize Aucun Spécifiez globalement le délai d’expiration à appliquer à chaque instance de méthode d’initialisation de test.
useCooperativeCancellation faux Lorsqu’il est réglé sur true, en cas de délai d’attente, MSTest déclenche uniquement l’annulation du CancellationToken, mais il continue de surveiller la méthode. Ce comportement est plus performant, mais s’appuie sur l’utilisateur pour transmettre correctement le jeton via tous les chemins d’accès.

Remarque

Les valeurs de délai d’expiration doivent être des entiers positifs en millisecondes. Pour s’exécuter sans délai d’expiration, omettez l’entrée au lieu de la définir 0sur . Les délais d’expiration globaux des appareils de test héritent de la valeur correspondante testInitializetestCleanup . Omettez donc les deux entrées lorsque vous ne souhaitez pas de délai d’expiration sur un appareil global. Un [Timeout] attribut sur une méthode remplace le délai d’expiration configuré.

Exemple:

{
  "mstest": {
    "timeout": { "globalTestInitialize": 30000, "globalTestCleanup": 30000 }
  }
}

Exemple de fichier testconfig.json

Le code JSON suivant montre le contenu d’un fichier .testconfig.json standard. Copiez ce code et modifiez-le selon vos besoins.

Chaque élément du fichier est facultatif, car il a une valeur par défaut.

{
  "platformOptions": {
    "resultDirectory": "./TestResults"
  },
  "mstest": {
    "execution": {
        "mapInconclusiveToFailed": true,
        "disableAppDomain": true,
        "considerFixturesAsSpecialTests": false
    },
    "parallelism": {
        "enabled": true,
        "scope": "method"
    },
    "output": {
        "captureTrace": false
    }
  }
}

Propriétés MSBuild

À compter de MSTest 4.3, optez pour la parallélisation au niveau de l’assembly à partir de votre fichier projet ou Directory.Build.props sans créer d’attribut [assembly: Parallelize] . Ces propriétés émettent l’attribut d’assembly correspondant lors de la génération. Elles doivent GenerateAssemblyInfo donc être true (la valeur par défaut pour les projets de style SDK).

Propriété Par défaut Descriptif
MSTestParallelizeScope Étendue de parallélisation. Définissez-le sur MethodLevel ou ClassLevel pour émettre [assembly: Parallelize(Scope = ExecutionScope.MethodLevel)] (ou ExecutionScope.ClassLevel), ou sur None pour émettre [assembly: DoNotParallelize].
MSTestParallelizeWorkers Le nombre maximal de threads de travail, émis sous la forme de la valeur Workers de [assembly: Parallelize]. Une valeur de 0 correspond au nombre de processeurs sur la machine actuelle. Cette propriété ne peut pas être définie quand MSTestParallelizeScope est None.

MSTest valide les deux propriétés pendant la génération. Les valeurs d’étendue non valides, les nombres de workers non entiers et le nombre de workers combinés avec une None étendue échouent à la build. Ne déclarez [assembly: Parallelize] pas ni [assembly: DoNotParallelize] dans la source, car l’attribut généré le dupliquerait. Lorsque GenerateAssemblyInfo c’est falsele cas, déclarez l’attribut dans la source à la place.

L’exemple suivant active la parallélisation au niveau de la méthode avec quatre workers pour chaque projet de test qui importe le Directory.Build.props fichier :

<Project>
  <PropertyGroup>
    <MSTestParallelizeScope>MethodLevel</MSTestParallelizeScope>
    <MSTestParallelizeWorkers>4</MSTestParallelizeWorkers>
  </PropertyGroup>
</Project>