Comment puis-je faire fonctionner «Copier dans le répertoire de sortie» avec les tests unitaires?

123

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

Comment puis-je obtenir un fichier copié dans le répertoire Debug / bin pour qu'il soit également copié dans le dossier TestResults?

Eric Schoonover
la source

Réponses:

121

Pour ce faire, la méthode standard consiste à spécifier les éléments de déploiement dans le .testrunconfigfichier, accessibles via l' élément Modifier les configurations d' exécution de test dans le menu Test de Visual Studio ou dans le dossier Éléments de la solution .

Mark Cidade
la source
15
Dans VS2010 c'est: Tester / Modifier les paramètres de test / local, puis dans la liste, sélectionnez "Déploiement", cochez la case "Activer ..." et ajoutez le (s) fichier (s).
Marcel
18
Vous devrez peut-être fermer votre solution (ou même Visual Studio) et la rouvrir avant que cette modification ne prenne effet correctement
RobV
RobV, tu as fait ma journée. MERCI!
Ignacio Soler Garcia
2
Si vous utilisez l'attribut [DeploymentItem] dans le code, vous n'avez pas besoin de spécifier les fichiers dans la boîte de dialogue - voir le code de @ tomfanning ci-dessous.
Patrick Szalapski
Cela ne résout pas mon problème de copie de la sortie de configuration à partir du dossier bin ou release car au moment du design, je n'ai pas d'informations sur le fait que le fichier sera dans le dossier debug ou release et pour moi, c'est le fichier qui n'est pas copié le dossier Out dans les résultats des tests
Gurpreet
61

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

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



}
Sanjay10
la source
3
Vous devez toujours l'activer. Comme Mercel l'a écrit dans son commentaire, Dans VS2010, c'est: Tester / Modifier les paramètres de test / local, puis dans la liste, sélectionnez "Déploiement", cochez la case "Activer ...".
Patrick Szalapski
Je suis aux prises avec ce problème dans Visual Studio 2012 Express et comme il s'agit d'une édition limitée, il était difficile de trouver une documentation claire. Un grand merci pour cette réponse.
DavidHyogo du
2
Fonctionne très bien. Je pense en fait que c'est la meilleure méthode et réponse car elle documente les fichiers requis juste au-dessus de la méthode de test.
bu5hm4nn
1
J'ai trouvé que l'attribut DeploymentItem fonctionne également lorsqu'il est spécifié au niveau de la classe de test (au lieu du niveau de la méthode).
Jon Schneider
10

J'ai dû activer "Activer le déploiement" sous Test -> Edit Test Settings -> Local -> Deploymentpour que l' [DeploymentItem]attribut fonctionne.

bronzer
la source
C'est vrai ... Je viens de l'activer et maintenant l'attribut fonctionne. Merci!
Miguel Angelo
Comme mentionné dans mon commentaire à une autre réponse, je suis aux prises avec le même problème dans Visual Studio 2012 express et les 2 réponses réunies m'ont finalement donné la solution.
DavidHyogo du
5

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 indépendants exécutés de manière isolée. 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 de test.

Dans mes tests, je dois copier un fichier XML attendu dans le dossier de sortie de test pour le comparer avec le XML de sortie de test réel. J'utilise l'attribut DeploymentItem pour copier uniquement le fichier XML lié au (x) test (s) en cours d'exécution. Dans VS2010, j'ai dû activer le déploiement dans le fichier .testsettings (mais n'ajouter aucun chemin), puis référencer le chemin du fichier XML relatif au TestProject dans DeploymentItem.

J'espère que cela t'aides.

GraehamF
la source
2
Mon problème était le chemin relatif mentionné ici, je pensais que le Xml devrait être dans le répertoire dans lequel se trouvait le test, mais il devait être à la racine du projet ou être précédé du répertoire dans lequel il se trouvait.
Wes Grant
2

J'ai eu un problème similaire mais le mien avait à voir avec le fait de pointer vers le fichier TraceAndTestImpact.testsettings au lieu du fichier Local.testsettings. Vous pouvez passer de l'un à l'autre dans le menu Test / Sélectionner les paramètres de test actifs.

Simon
la source
2

Je voudrais simplement améliorer la réponse acceptée en mentionnant un moyen de le faire 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., pour les circonstances où CopyLocal ne fonctionne pas:

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

Ce qui suit fonctionne dans VS2012 pour les projets de test inclus dans plusieurs solutions sans utiliser de fichier testsettings:

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

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

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 comme 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 dans des emplacements partagés doivent également être copiés dans le dossier de déploiement du répertoire cible pour limiter les interactions de test. Fournissez le chemin source par rapport à la $(ProjectDir)macro. Par exemple "$(ProjectDir)..\..\Common Files\C1219TDL-2008.xml".

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

Dans une méthode de test, sourceest le chemin du fichier ou du répertoire utilisé dans la méthode de test par rapport au répertoire cible créé par le xcopyet destinationest le chemin du répertoire dans lequel il sera créé par rapport au répertoire de déploiement. Pour que les tests s'exécutent 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")]. Le DeploymentItemdoit être inclus dans chaque méthode qui utilise ce fichier ou ce répertoire.

Sur une classe, sourceet destinationsont à la fois le nom du dossier créé dans le répertoire cible par le xcopy; cela copiera le dossier entier 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 en toute confiance, ils seront dans le répertoire de travail quel que soit l'endroit où Visual Studio a décidé de le placer ce jour-là, par exemple File.Exists(".\Example_TestInputs\C1219TDL-2008.xml").

Richard Morris
la source
0

Essayez la ligne de commande d'événement post-build à partir de Visual Studio (si vous utilisez cet IDE).

Kasper
la source
3
Je le suis, mais cela semble être un peu un hack. Cela doit être un scénario assez courant et j'espère qu'il y a juste une option ou une propriété que je ne configure pas correctement.
Eric Schoonover
0

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

acarlon
la source
0
[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";
}
Nina
la source
0

La réponse acceptée est correcte, tout comme la plupart des autres réponses. Cependant, au fil des ans, j'ai constaté que le système Deploment de tests unitaires Visual Studio utilisant DeploymentAttribtue et Copy to Output était fastidieux si vous avez un grand nombre de fichiers de données. J'ai constaté que conserver les fichiers dans 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.

Sau001
la source