Fichier de copie MSTest dans le dossier d'exécution de test

108

J'ai un test qui nécessite qu'un fichier XML soit lu puis analysé. Comment puis-je copier ce fichier dans le dossier de test à chaque fois?

Le fichier XML est défini sur "Copier si plus récent" et un mode de compilation sur "aucun" (car ce n'est pas vraiment une chose compilable)

Aaron Powell
la source

Réponses:

131

utiliser un DeploymentItemattribut

using System;
using System.IO;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using CarMaker;

namespace DeploymentTest
{
    [TestClass]
    public class UnitTest1
    {
        [TestMethod()]
        [DeploymentItem("testFile1.xml")]
        public void ConstructorTest()
        {
            string file = "testFile1.xml";
            Assert.IsTrue(File.Exists(file), "deployment failed: " + file +
                " did not get deployed");
        }
    }
}
Preet Sangha
la source
17
L'attribut DeploymentItem peut également être spécifié au niveau de la classe, pour affecter chaque test de la classe.
Hannes Nel
24
N'oubliez pas que si vous avez vos éléments dans un sous-dossier, vous devez également les inclure dans le sous-répertoire de déploiement [DeploymentItem ("SubFolder \ testFile1.xml", "SubFolder")]
omgtitb
31
Suite au commentaire de Thomas, la valeur par défaut de RelativePathRoot est le dossier de solution, donc si votre solution ressemble à ceci (.. \ SolutionFolder \ TestProject \ TestData \ aFile.txt) Votre DeploymentItem ressemblerait à ceci .. ([DeploymentItem (@ "TestProject \ TestData \ aFile.txt", "TestData")]) .. et vous référenceriez le fichier dans le test en utilisant ce .. (string file = @ "TestData \ aFile.txt";)
Michael Dausmann
6
Documentation DeploymentItemAttribute pour VS2010 : cet attribut peut être spécifié sur une méthode de test ou sur une classe de test.
Alex Che
12
Ce que la plupart des messages que j'ai vus et qui ne mentionnent pas, c'est que si vous ne pouvez pas faire fonctionner cela, vous devez probablement cocher la case "Activer le déploiement", que vous pouvez trouver si vous allez dans Test -> Modifier les paramètres de test -> local (local.testsettings) -> onglet Déploiement. Je viens de faire cela, puis DeploymentItem a bien fonctionné.
Dave
26

Il semble que si vous fournissez un fichier TestSettings pour la solution, vous pouvez décocher l'option "Activer le déploiement" et empêcher mstest d'essayer de s'exécuter à partir du ...TestResults\...\outdossier où il ne copie pas vos fichiers supplémentaires (sauf si vous en faites une option de déploiement) .

Ceci est également utile si vous dépendez du fait que les fichiers supplémentaires se trouvent dans une structure de dossiers préservée car les éléments de déploiement semblent tous être copiés directement (à plat) dans le dossier d'exécution temporaire (sortie) si vous utilisez l'option Déploiement, Ajouter un dossier dans les paramètres de test ( Les réponses ci-dessus suggèrent que vous pouvez conserver la structure si vous ajoutez chaque élément comme son propre DeploymentItem).

Pour moi, cela a bien fonctionné en exécutant des tests directement dans Visual Studio (c'est-à-dire que mes fichiers supplémentaires dans leur structure ont été trouvés et utilisés par des tests) car j'avais créé un fichier TestSettings pour une autre raison il y a longtemps (qui a désactivé le déploiement), mais pas lorsque TeamCity a exécuté mstest pour exécuter des tests car je n'avais pas spécifié que le fichier TestSettings devait être utilisé.

Pour créer un fichier TestSettings dans Visual Studio, cliquez avec le bouton droit sur la solution et choisissez Nouvel élément, puis sélectionnez le modèle TestSettings. Pour utiliser le fichier TestSettings à l'invite de commande de mstest.exe, ajoutez l'option /testsettings:C:\Src\mySolution\myProject\local.testsettings (ou ajoutez comme option de ligne de commande supplémentaire dans TeamCity avec le chemin approprié)

TamW
la source
3

La meilleure solution pour moi consiste à utiliser des paramètres de test, surtout si plusieurs tests nécessitent les mêmes fichiers de données.

Commencez par créer un fichier de paramètres de test et ajoutez les éléments de déploiement dont vous avez besoin (nom du fichier ou du dossier):

<TestSettings name="Local" id="00ebe0c6-7b64-49c0-80a5-09796270f111" xmlns="http://microsoft.com/schemas/VisualStudio/TeamTest/2010">
  <Description>These are default test settings for a local test run.</Description>
  <Deployment>
    <DeploymentItem filename="Folder1\TestScripts\test.xml" outputDirectory="TestScripts"/>
    <DeploymentItem filename="Folder2\TestData\" outputDirectory="TestData"/>
  </Deployment>
<...../>
  • En cours d'exécution dans Visual Studio, utilisez "Sélectionner le fichier de paramètres de test" dans le menu "Test \ Paramètres de test" pour sélectionner de nouveaux paramètres de test

  • En exécutant mstest, utilisez le paramètre / testsettings pour que mstest utilise vos testsettings.

FrankyHollywood
la source
2

Vous pouvez définir DeploymentItem dans une classe qui contient une méthode avec l'attribut AssemblyInitialize. Ensuite, vous êtes sûr que les fichiers sont copiés quel que soit le test que vous exécutez.

Malheureusement, l'attribut DeploymentItem n'est exécuté que sur les classes qui contiennent des tests que vous exécutez. Donc, si vous avez 10 classes de test qui utilisent le même ensemble de fichiers, vous devez ajouter l'attribut à chacun d'eux.

A également découvert que les modifications des fichiers * .testsettings ne sont pas automatiquement actualisées dans Visual Studio. Par conséquent, après avoir ajouté des fichiers / dossiers dans le déploiement dans les paramètres de test, vous devez rouvrir le fichier de solution, puis exécuter les tests.

Sielu
la source
2

Dans Visual Studio 2012, vstest.console.exe (le lanceur de test intégré) s'exécute avec le répertoire de sortie comme chemin d'accès actuel. Cela signifie que vous devez uniquement inclure les éléments dans votre solution avec la propriété "Copier toujours" ou "Copier si plus récent" pour qu'ils soient utilisés par votre test. Vous n'avez pas besoin de l'attribut DeploymentItem pour le cas général. La même chose s'applique lors de l'exécution de vstest.console.exe à partir de la ligne de commande dans votre répertoire de sortie / test.

Dans certains cas, un dossier distinct est utilisé, l'un d'entre eux étant lorsque vous utilisez l'attribut DeploymentItem. Voir ici pour plus d' informations.

acarlon
la source