web-dev-qa-db-fra.com

Les éléments de déploiement MSTest fonctionnent-ils uniquement lorsqu'ils sont présents dans le fichier de paramètres de test du projet?

Je n'arrive pas à comprendre comment les éléments de déploiement MSTest sont censés être configurés. J'ai pu les faire fonctionner correctement en modifiant le fichier de paramètres de test du projet, mais cela est moins qu'idéal - la configuration de l'élément de déploiement est séparée des tests individuels, et les chemins d'accès aux fichiers semblent être stockés en tant que chemins absolus, sauf si les fichiers sont sous le dossier de la solution.

Ne suis-je pas censé pouvoir ajouter un élément de déploiement à l'aide de [DeploymentItem] attribut sur un [TestClass] ou [TestMethod] sans avoir à créer/modifier un fichier de paramètres de test de projet? Comment est-ce que j'accomplis ceci?

(Franchement, je ne comprends pas la nécessité d'une configuration d'élément de déploiement distincte - pourquoi ne pas simplement utiliser les paramètres de copie dans le répertoire de sortie pour les fichiers de projet qui devraient être des éléments de déploiement?)

75
arathorn

Ok - ce post ici m'a aidé à comprendre ce que je devais faire SANS avoir à ajouter manuellement des éléments au .testsettings fichier.

Étape 1 - Activez l'attribut MS Test DeploymentItem.

Tout d'abord, nous devons activer/activer l'attribut DeploymentItem.

Goto TEST -> EDIT TEST SETTINGS -> Current Active settings .. eg :: Local (local.testsettings)

alt text

Maintenant allez à [~ # ~] déploiement [~ # ~] et assurez-vous Activer le déploiement est coché ON. (Par défaut, c'est désactivé).

alt text

Étape 2 - Vérifiez les propriétés du fichier

Nous devons maintenant nous assurer que le fichier que vous souhaitez utiliser dans le test unitaire est configuré pour être copié dans le répertoire BIN lors de la compilation. Seuls les fichiers qui se trouvent dans le répertoire BIN peuvent être utilisés dans un test unitaire MS Test. Pourquoi? Parce que chaque fois qu'un test MS est exécuté, il doit faire une copie des sources ... et cela signifie qu'il fait une copie des fichiers du répertoire BIN actuel (pour la configuration actuelle).

Par exemple ... La configuration actuelle est Débogage (par opposition à Release). alt text

J'ajoute ensuite mon fichier ... (prenez note de la structure des dossiers dans le projet) ...

alt text

puis assurez-vous que ce fichier est TOUJOURS copié dans le répertoire bin lorsque le projet est compilé.

alt text

CONSEIL DE PRO: Copy Always fonctionnera également, mais copiez toujours le fichier source sur le fichier de destination .. même s'ils sont identiques. C'est pourquoi je préfère copier si plus récent ... mais quoi que flotte votre batea

Ok mesdames et messieurs - toujours avec moi? Wikid.

Lorsque nous compilons, le fichier devrait maintenant exister dans le répertoire Bin ....

alt text

Étape 3 - Utilisez maintenant l'attribut DeploymentItem

Ok, maintenant nous pouvons enfin utiliser l'attribut DeploymentItem dans notre code. Lorsque nous faisons cela, cela indique au MSTest de copier le fichier (de l'emplacement relatif au répertoire bin) vers le nouveau répertoire MS Test ...

[TestMethod]
[DeploymentItem(@"Test Data\100LogEntries.txt", "Test Data")]
public void Parsing100LogFileEntriesReturnsANewParsedLogEntriesWith100Items()
{
    // Arrange.
    const string fileName = @"Test Data\100LogEntries.txt";
    ILogEntryService logEntryService = new PunkBusterLogEntryService();

    // Act.
    var parsedLogEntries = logEntryService.ParseLogFile(fileName, 0);

    // Assert.
    Assert.IsNotNull(parsedLogEntries);
    Assert.AreEqual(100, parsedLogEntries.LogEntries.Count);
    // Snipped the remaining asserts to cut back on wasting your time.
}

Permet donc de décomposer cela ..

[TestMethod]

Nous savons tous ce que c'est.

[DeploymentItem(@"Test Data\100LogEntries.txt", "Test Data")]

À partir du répertoire bin, allez dans le Test Data dossier et copiez le 100LogEntries.txt fichier vers un dossier de destination Test Data, dans le répertoire de sortie racine de MS Test que MS Test crée lorsque chaque test est exécuté.

Voici donc à quoi ressemble la structure de mon dossier de sortie. (Excusez tout le désordre ...)

alt text

et le tour est joué! nous avons des fichiers de déploiement, par programmation.

CONSEIL PRO # 2 - si vous n'utilisez pas un deuxième argument de chaîne dans l'attribut DeploymentItem, le fichier sera copié dans le dossier racine OUT, du MS actuel Test.

const string fileName = @"Test Data\100LogEntries.txt";

Le chemin d'accès au fichier est maintenant relatif au dossier OUT pour le test MS en cours. En tant que tel, je dis explicitement déployer le fichier dans un répertoire appelé Test Data ... donc je dois m'assurer de bien référencer cela dans mon code quand je veux lire dans le fichier.

Juste pour confirmer -> le chemin complet de ce nom de fichier est traduit par quelque chose comme C:\lots of blah blah blah\My Solution\TestResults\PureKrome_PUREKROME-PC 2011-01-05 23_41_23\Out\Test Data .. pour ce test MS actuel.

HTH.

Ayez maintenant une photo d'une licorne, pour tant de lecture :)

alt text

221
Pure.Krome

Je pensais partager un moyen de rencontrer des problèmes avec MSTest et les éléments de déploiement. Si vous déboguez/exécutez votre test une deuxième fois ou plus à partir de la fenêtre "Résultats des tests", il utilise les paramètres d'une exécution précédente. Cependant, si vous déboguez/exécutez le même test à partir de la fenêtre "Test View", il utilise les derniers paramètres. J'ai perdu une heure à essayer de comprendre pourquoi les modifications apportées à Local.testsettings n'étaient pas utilisées lorsque j'ai continué à déboguer sur le même test à partir de la fenêtre "Résultats des tests".

Voici la fenêtre Résultats des tests (ne pas [recommencer] les tests à partir d'ici après avoir apporté des modifications à Local.testsettings):

The Test Results Window

Et voici la fenêtre Test View (FAITES démarrer les tests à partir d'ici après avoir apporté des modifications à Local.testsettings):

The Test View Window

J'espère que cela vous évitera des maux de tête à l'avenir.

15
Robert Bernstein

Dans Visual Studio 2012, le répertoire de sortie est le répertoire de travail, ce qui signifie que l'attribut DeploymentItem n'est pas nécessaire pour le cas général (où vous n'avez pas d'éléments de déploiement spécifiques par test ou par classe). Cela signifie que si vous n'avez pas besoin d'utiliser l'attribut DeploymentItem s'il existe un ensemble de fichiers que vous souhaitez que tous vos tests utilisent ou si vous n'êtes pas trop pernickety à propos de chaque TestClass/TestMethod ayant des dépendances de déploiement distinctes.

Vous pouvez simplement cliquer sur Projet | Afficher tous les fichiers et inclure les sous-dossiers et fichiers dans Visual Studio avec l'attribut "Copier toujours" ou "Copier si plus récent" de votre projet et les fichiers seront copiés dans votre répertoire de sortie avec la hiérarchie intacte.

Il en va de même lors de l'exécution de vstest.console.exe à partir de la ligne de commande. Voir ici pour les détails.

Mise à jour

Dans certains cas, le répertoire par défaut ne sera pas le répertoire de sortie. Plus précisément lorsque vous choisissez Run All Tests le chemin par défaut serait sous TestResults\Deploy_... La même chose s'applique lorsque vous utilisez un fichier runsettings ou que les tests utilisent DeploymentItems

Le répertoire de sortie sera le répertoire par défaut lorsque vous n'utilisez pas DeploymentItems et: -

  • Vous cliquez avec le bouton droit sur le (s) test (s) dans Visual Studio et choisissez d'exécuter/déboguer, ou
  • Vous exécutez à partir de la ligne de commande à l'aide de vstest.console.exe.
7
acarlon

Si vous avez besoin d'un élément de déploiement séparé dans des cas de test individuels, veuillez continuer et utiliser l'attribut [DeploymentItem("string file path")] dans chaque cas de test.

1
Pritam Karmakar

Pour mon cas, j'ajoute l'attribut DeploymentItem, il ne peut pas prendre effet immédiatement. Je dois fermer et rouvrir la solution, les attributs DeploymentItem configurés prendront alors effet.

0
Jack Liu Shurui