web-dev-qa-db-fra.com

Comment faire en sorte que "Copier dans le répertoire de sortie" fonctionne avec les tests unitaires?

Lorsque je crée un projet de test unitaire avant l'exécution des tests, la sortie de test est copiée dans un dossier TestResults, puis les tests sont exécutés. Le problème que je rencontre est que tous les fichiers du répertoire Debug/bin ne sont pas copiés dans le projet TestResults.

Comment obtenir un fichier copié dans le répertoire Debug/bin pour le copier également dans le dossier TestResults?

121
Eric Schoonover

La méthode standard consiste à spécifier le éléments de déploiement dans le fichier .testrunconfig, auquel vous pouvez accéder via l’élément Edit Test Run Configurations dans Visual Studio Testez le menu ou dans le dossier Éléments de solution

121
Mark Cidade

Vous pouvez spécifier un attribut de déploiement comme dans l'exemple ci-dessous. Vous devez également définir les propriétés "Contenu" et "Copier s’il est plus récent" (il n’existe pas de documentation sur les paramètres ultérieurs, mais vous avez défini ceux-ci pour que cela fonctionne. 

[TestMethod]
[DeploymentItem("mytestdata.xml")]
public void UploadTest()
{



}
57
Sanjay10

Je devais activer "Activer le déploiement" sous Test -> Edit Test Settings -> Local -> Deployment pour que l'attribut [DeploymentItem] fonctionne.

10
tomfanning

Les trois réponses sont correctes, selon vos besoins. 

L'ajout de fichiers à déployer dans .testrunconfig (.testsettings dans VS2010) copiera tous ces fichiers dans chaque dossier de sortie de test, même pour des tests non liés exécutés isolément. Si vous exécutez un test, tous les fichiers de données de test répertoriés dans la section de déploiement de .testssettings seront copiés dans le dossier de sortie du test.

Dans mes tests, je dois copier un fichier XML attendu dans le dossier de sortie de test pour le comparer au XML de sortie de test réel. J'utilise l'attribut DeploymentItem pour copier uniquement le fichier XML associé au (x) test (s) en cours d'exécution. Dans VS2010, je devais activer le déploiement dans le fichier .testsettings (mais ne pas ajouter de chemin d'accès), puis faire référence au chemin d'accès au fichier XML relatif à TestProject dans DeploymentItem.

J'espère que cela t'aides.

5
GraehamF

J'avais un problème similaire, mais le mien avait à voir avec le fichier TraceAndTestImpact.testsettings au lieu du fichier Local.testsettings. Vous pouvez passer de l’un à l’autre dans le menu Test/Select Active Test Settings.

2
Simon

Voudrais simplement améliorer la réponse acceptée en mentionnant un moyen de le déployer spécifiquement pour les dll plutôt que la méthode normale de l'utiliser pour les données ou la configuration, etc., dans les cas où CopyLocal ne fonctionne pas:

[DeploymentItem("bin\\release\\iRock.dll")]
[DeploymentItem("bin\\debug\\iRock.dll")]
1
JamesDill

Les opérations suivantes dans VS2012 pour les projets de test inclus dans plusieurs solutions sans utiliser de fichier testsettings:

1) Organisez les fichiers et les dossiers que vous souhaitez déployer dans un dossier du répertoire du projet test.

2) Dans les propriétés du projet, créez une étape de post-génération

xcopy /Y /S /i "$(ProjectDir)<Project_Folder_Name>\*" "$(TargetDir)<Deployment_Folder_Name>"

$(ProjectDir) et $(TargetDir) sont des macros qui seront interprétées par VS et doivent être incluses en tant que telles.

<Project_Folder_Name> est le nom du dossier créé à l'étape 1.

<Deployment_Folder_Name> est le nom du dossier dans lequel les fichiers de test seront déployés et doit être nommé de manière à ce qu'il soit unique lorsque plusieurs projets de test sont déployés dans le même répertoire, par exemple. <Project_Name>_TestInputs.

Les fichiers de test situés dans des emplacements partagés doivent également être copiés dans le dossier de déploiement du répertoire cible afin de limiter les interactions de test. Indiquez le chemin source par rapport à la macro $(ProjectDir). Par exemple, "$(ProjectDir)..\..\Common Files\C1219TDL-2008.xml".

3) Ajoutez une propriété [DeploymentItem(source, destination)] à chaque méthode de test utilisant un fichier de déploiement (meilleure pratique) ou à la classe de test (pratique plus simple pour les fainéants ou les pressés, et méthode la plus simple pour mettre à jour un projet les chemins relatifs précédemment utilisés ou les paramètres de test fichier).

Sur une méthode de test, source est le chemin du fichier ou du répertoire utilisé dans la méthode de test par rapport au répertoire cible créé par xcopy et destination est le chemin du répertoire dans lequel il sera créé par rapport au répertoire de déploiement. Les tests sont donc exécutés de manière cohérente dans le répertoire cible ou dans un répertoire de déploiement. Le chemin de destination doit être le même que le chemin source sans référence de fichier. Exemple: [DeploymentItem("Example_TestInputs\C1219TDL-2008.xml","Example_TestInputs")]. La DeploymentItem doit être incluse dans chaque méthode utilisant ce fichier ou ce répertoire.

Dans une classe, source et destination sont tous deux le nom du dossier créé dans le répertoire cible par xcopy; cela copiera l'intégralité du dossier dans le répertoire de déploiement lorsqu'un test de la classe est exécuté. Exemple: [DeploymentItem("Example_TestInputs","Example_TestInputs")]

4) Dans les méthodes de test, vous pouvez désormais accéder aux fichiers et aux répertoires avec la certitude qu’ils se trouveront dans le répertoire de travail, où que Visual Studio ait décidé de le placer ce jour-là, par exemple. File.Exists(".\Example_TestInputs\C1219TDL-2008.xml").

1
Richard Morris

Dans Visual Studio 2012, vous n'avez pas besoin d'un attribut DeploymentItem pour le cas simple. Voir ma réponse ici

0
acarlon
[TestMethod]
[DeploymentItem("ProjectName/Folder/SubFolder/file.xml", "Folder/Subfolder")]
public void YourTestMethod()
{
   // in the method you are testing you should have this:
   var filePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase) + "/Folder/Subfolder/file.xml";
}
0
Nina

La réponse acceptée est correcte, de même que la plupart des autres réponses. Cependant, au fil des années, j'ai constaté que le système Deploment des tests unitaires Visual Studio utilisant DeploymentAttribtue et Copy to Output était encombrant si vous disposiez d'un grand nombre de fichiers de données. J'ai constaté que le fait de conserver les fichiers à leur emplacement d'origine fonctionnait mieux. 

Tous les détails dans mon autre réponse ici . https://stackoverflow.com/a/53004985/2989655

J'espère que cela t'aides.

0
Sau001

Essayez la ligne de commande de l'événement Post-Build à partir de Visual Studio (si vous utilisez cet environnement de développement).

0
Kasper