Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Certains tests nécessitent des fichiers supplémentaires à l’exécution, par exemple des données de test, des fichiers de configuration, des versions de référence ou des dépendances natives. Utilisez le DeploymentItemAttribute pour déclarer les fichiers et dossiers qui doivent être disponibles à côté de votre assembly de test lors de l’exécution de chaque test.
Vue d’ensemble
Lorsque vous appliquez [DeploymentItem] à une classe de test ou à une méthode de test, MSTest copie les fichiers ou dossiers spécifiés dans le répertoire exposé par TestContext.DeploymentDirectory avant l’exécution de tout test dans cette portée. Le répertoire de déploiement est également le répertoire de travail actuel pour le test. Votre code de test peut donc ouvrir les fichiers par leurs noms copiés.
L’attribut accepte un chemin relatif ou absolu :
-
Les chemins relatifs sont résolus par rapport au répertoire de sortie de build (dossier qui contient l’assembly de test, par exemple
bin\Debug\net10.0\). - Les chemins absolus sont utilisés as-is.
Important
Dans MSTest 3.x, les éléments de déploiement sont copiés par exécution de test. Pour rendre un fichier disponible au moment du déploiement, le fichier doit déjà exister dans (ou être copié dans) le répertoire de sortie de build.
Appliquer [DeploymentItem]
L’attribut peut être appliqué à une méthode de test, à une classe de test ou aux deux. Plusieurs instances sont autorisées et combinées :
using System.IO;
using Microsoft.VisualStudio.TestTools.UnitTesting;
[TestClass]
[DeploymentItem(@"TestFiles\shared-config.json")]
public class ConfigurationTests
{
[TestMethod]
[DeploymentItem(@"TestFiles\customers.csv")]
public void LoadCustomers_FromCsv_ReturnsAllRows()
{
// Both shared-config.json (from the class) and customers.csv (from
// the method) are available in the deployment directory.
Assert.IsTrue(File.Exists("shared-config.json"));
Assert.IsTrue(File.Exists("customers.csv"));
}
}
Note
Lorsque vous appliquez [DeploymentItem] à une classe de test, la classe doit contenir au moins une méthode de test. L’appliquer à une classe qui ne contient que des méthodes AssemblyInitialize ou ClassInitialize n’a aucun effet.
L’analyseur MSTEST0035 signale une telle mauvaise utilisation.
Surcharge de constructeur
DeploymentItemAttribute a deux constructeurs : DeploymentItemAttribute(string path) et DeploymentItemAttribute(string path, string outputDirectory).
DeploymentItemAttribute(string path)
Copie le fichier ou le dossier identifié par path à la racine du répertoire de déploiement.
// Copy a single file from the build output directory.
[DeploymentItem("settings.json")]
// Copy a file that lives in a subfolder of the build output directory.
// The file is copied to the root of the deployment directory (the
// "Resources" folder is not preserved).
[DeploymentItem(@"Resources\test-data.xml")]
// Copy the entire TestFiles folder (and all of its subfolders) into the
// deployment directory.
[DeploymentItem("TestFiles")]
DeploymentItemAttribute(string path, string outputDirectory)
Copie les éléments dans un sous-répertoire du répertoire de déploiement, donné par outputDirectory.
// Creates a "Data" subfolder under the deployment directory, then copies
// test-data.xml into it. The file is reached at "Data\test-data.xml".
[DeploymentItem("test-data.xml", "Data")]
// Copies the contents of the Resources folder into a "Resources"
// subfolder of the deployment directory.
[DeploymentItem("Resources", "Resources")]
L’argument outputDirectory doit être un chemin d’accès au dossier. Il ne peut pas être utilisé pour renommer le fichier. Pour déployer un fichier portant un autre nom, renommez-le dans le dossier source (ou utilisez une étape post-build).
Vérifier que les fichiers sources atteignent le répertoire de sortie de build
Étant donné que les chemins relatifs sont résolus par rapport au répertoire de sortie de build, le fichier ou dossier source doit déjà être présent. Il existe deux façons courantes d’y parvenir.
Utiliser <None> ou <Content> avec CopyToOutputDirectory
Ajoutez les fichiers à votre projet de test et marquez-les pour les copier dans le répertoire de sortie de build :
<ItemGroup>
<None Update="TestFiles\**\*.*">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
Après une génération, le dossier TestFiles est répliqué dans bin\<Configuration>\<TargetFramework>\TestFiles\, et [DeploymentItem("TestFiles")] est correctement résolu.
Utiliser une cible post-build
Pour les fichiers qui vivent en dehors du projet de test, copiez-les dans le répertoire de sortie de build dans le cadre de la build :
<Target Name="CopySharedAssets" AfterTargets="Build">
<Copy SourceFiles="@(SharedAsset)"
DestinationFolder="$(OutDir)SharedAssets\" />
</Target>
Inspecter le répertoire de déploiement au moment de l’exécution
Si vous avez besoin du chemin absolu du répertoire de déploiement, par exemple, pour le transmettre à un processus que vous générez ou pour le journaliser pour les diagnostics, utilisez TestContext.DeploymentDirectory:
using System.IO;
[TestMethod]
[DeploymentItem(@"TestFiles\input.json")]
public void ProcessInput_FromDeployedFile_Succeeds()
{
string fullPath = Path.Combine(TestContext.DeploymentDirectory, "input.json");
string contents = File.ReadAllText(fullPath);
// ...
}
Pour en savoir plus sur TestContext, consultez la classe TestContext.
Quand le déploiement ne se produit pas
Par défaut, MSTest crée un répertoire de déploiement par exécution et copie les éléments dans celui-ci. Vous pouvez désactiver le déploiement dans un .runsettings fichier afin que les tests s’exécutent directement hors du répertoire de sortie de build :
<RunSettings>
<MSTest>
<DeploymentEnabled>False</DeploymentEnabled>
</MSTest>
</RunSettings>
Lorsque le déploiement est désactivé, [DeploymentItem] les attributs n’ont aucun effet et les tests s’exécutent dans le répertoire de sortie de build lui-même. Pour plus d’options de configuration, consultez Configurer MSTest.
Mode hérité et .testsettings
Lorsque MSTest s’exécute en mode hérité (un fichier .testsettings est utilisé, ou RunSettings/MSTest/ForcedLegacyMode est défini sur true dans un fichier .runsettings), les chemins relatifs peuvent être résolus par rapport au répertoire racine de la solution au lieu du répertoire de sortie de génération. Évitez le mode hérité pour les nouveaux projets : la configuration moderne .runsettingsest l’approche recommandée.
Bonnes pratiques
- Préférez
CopyToOutputDirectoryaux chemins relatifs trop imbriqués. N’accédez pas directement aux dossiers sources via des chemins de type..\..\: ils rendent vos tests dépendants d’une structure précise du dépôt. Placez d’abord les fichiers dans le répertoire de sortie de build. - Conservez les éléments de déploiement petits. Chaque élément est copié pour chaque exécution de test ; les fichiers volumineux ralentissent l’exécution des tests.
- Utilisez des dossiers pour déployer des ressources associées ensemble.
[DeploymentItem("TestFiles")]est plus facile à gérer que des dizaines d’attributs par fichier. - Préférez les ressources incorporées ou les données en mémoire pour les petits appareils. Les ressources incorporées éliminent le besoin de déploiement et évitent les E/S au moment du test.
- Ne vous fiez pas au répertoire de travail qui est le répertoire du projet. Pendant l’exécution du test, le répertoire de travail est le répertoire de déploiement, et non le dossier du projet de test.