web-dev-qa-db-fra.com

Comment accéder à TestRunParameters dans le fichier RunSettings

Lecture https://msdn.Microsoft.com/en-us/library/jj635153.aspx J'ai créé un .RunSettings fichiers avec quelques paramètres similaires à l'exemple:

  <TestRunParameters>
    <Parameter name="webAppUrl" value="http://localhost" />
    <Parameter name="webAppUserName" value="Admin" />
    <Parameter name="webAppPassword" value="Password" />
  </TestRunParameters>

J'ai l'intention d'avoir un .RunSettings fichier pour chacun de nos environnements avec les URL et informations d'identification appropriées pour exécuter un test CodedUI sur l'environnement du fichier RunSettings spécifié.

Je peux voir que depuis la ligne de commande pour référencer le fichier de paramètres que je peux exécuter:

vstest.console myTestDll.dll /Settings:Local.RunSettings /Logger:trx
vstest.console myTestDll.dll /Settings:QA.RunSettings /Logger:trx

etc...

Mais je ne vois aucun moyen qui explique comment utiliser réellement le TestRunParameters à partir du test codedUI.

Ce que je voudrais faire, c'est configurer des initialiseurs de test qui utilisent le TestRunParameters pour déterminer où se connecter et quelles informations d'identification utiliser. Quelque chose comme ça:

[TestInitialize()]
public void MyTestInitialize()
{

    // I'm unsure how to grab the RunSettings.TestRunParameters below
    string entryUrl = ""; // TestRunParameters.webAppUrl
    string userName = ""; // TestRunParameters.webAppUserName
    string password = ""; // TestRunParameters.webAppPassword

    LoginToPage(entryUrl, userName, password);
}

public void LoginToPage(string entryUrl, string userName, string password)
{
    // Implementation
}

Les informations sur la façon de référencer le TestRunParameters sont grandement appréciées!

MODIFIER

/// <summary>
/// Summary description for CodedUITest1
/// </summary>
[CodedUITest]
public class CodedUITest1
{

    public static string UserName = string.Empty;

    [ClassInitialize]
    public static void TestClassInitialize(TestContext context)
    {
        UserName = context.Properties["webAppUserName"].ToString();
        Console.WriteLine(UserName);
    }

    [TestMethod]
    public void CodedUITestMethod1()
    {
        this.UIMap.RecordedMethod1();
        // To generate code for this test, select "Generate Code for Coded UI Test" from the shortcut menu and select one of the menu items.
    }

    // Rest of the default class - TestContext instantiation, UI map instantiation, etc
}

L'exception que je reçois lors de l'exécution:

Exception NullReference

enter image description here

@williamfalconeruk J'ai mis à jour ma classe de test comme ci-dessus, mais j'ai toujours la même erreur, une idée de ce que je fais mal?

32
Kritner

J'ai également rencontré cela récemment, car nous voulions nous éloigner de l'utilisation des variables d'environnement héritées. La solution fournie ci-dessous était adaptée à nos besoins, mais il pourrait y en avoir une meilleure ...

Il s'avère que vous pouvez y accéder dans la méthode TestContext d'une méthode ClassInitialize de votre appareil de test. Il existe un dictionnaire Properties qui a ces paramètres, et vous pouvez accéder aux valeurs ici:

[ClassInitialize]
public static void TestClassinitialize(TestContext context)
{
    var webAppUrl = context.Properties["webAppUrl"].ToString();

   //other settings etc..then use your test settings parameters here...
}

Remarque : ce sont statiques, donc si vous avez besoin d'accéder à cela, vous devrez peut-être configurer des propriétés statiques pour accéder à l'intérieur de votre code de test.

Une alternative suggérée consiste à utiliser une approche de test piloté par les données. Voici quelques informations de base sur les tests basés sur les données qui peuvent également aider: https://msdn.Microsoft.com/en-us/library/ms182527.aspx

Comme je l'ai dit, la solution ci-dessus répondait à nos besoins au niveau de base.

MISE À JOUR: voir l'image ci-dessous en réponse aux paramètres de test retournant null ...

Test Settings in Visual Studio

22
williamfalconeruk

Pour ceux qui utilisent Resharper avec ce problème, j'ai découvert le correctif (pas besoin de désactiver Resharper):

  1. Allez dans le menu supérieur de Visual Studio -> Resharper -> Options

  2. Recherchez la section Outils, développez "Test unitaire"

  3. Cliquez sur "MsTest". La case à cocher doit être activée, mais le chemin du fichier de paramètres de test ci-dessous peut être vide. Si c'est le cas, cliquez sur Parcourir et sélectionnez le fichier de runettings que vous souhaitez utiliser.

  4. Cliquez sur enregistrer, reconstruire et essayer d'exécuter les tests, les paramètres devraient maintenant fonctionner.

Vous ne savez pas pourquoi, mais la simple sélection du fichier de paramètres de test dans le menu Tests -> Paramètres de test ne fonctionne pas réellement lorsque vous utilisez Resharper, donc ce fichier doit être explicitement pointé directement dans les options de Resharper.

19
starmandeluxe

Cela fonctionne pour moi (VS2017-pro):

namespace TestApp.Test
{
    [TestClass]
    public class UnitTest1
    {
        // This enables the runner to set the TestContext. It gets updated for each test.
        public TestContext TestContext { get; set; }
        [TestMethod]
        public void TestMethod1()
        {
            // Arrange
            String expectedName = "TestMethod1";
            String expectedUrl = "http://localhost";

            // Act
            String actualName = TestContext.TestName;
            // The properties are read from the .runsettings file
            String actualUrl = TestContext.Properties["webAppUrl"].ToString();

            // Assert
            Assert.AreEqual(expectedName, actualName);
            Assert.AreEqual(expectedUrl, actualUrl);
        }

        [TestMethod]
        public void TestMethod2()
        {
            // Arrange
            String expectedName = "TestMethod2";

            // Act
            String actualName = TestContext.TestName;

            // Assert
            Assert.AreEqual(expectedName, actualName);
        }
    }
}

Assurez-vous de sélectionner le fichier de runets que vous souhaitez utiliser, ici: Test -> Paramètres de test.

3
Paul0515

Une alternative pour désactiver Resharper consiste à activer la prise en charge de MSTest et à sélectionner le fichier de paramètres de test dans la boîte de dialogue Options de Resharper (-> Outils-> Test unitaire-> MsTest).

3
A. Miettinen

Pour le problème NullReferenceException:

J'ai également été confronté récemment au même problème et la solution consiste à disposer de la dernière mise à jour de Visual Studio 2013 . À l'heure actuelle, la dernière mise à jour est la mise à jour 5. Je ne sais pas quelle mise à jour particulière résout ce problème. J'ai appliqué la mise à jour 5 et j'ai réussi à accéder aux TestRunParameters dans la méthode ClassInitialize.

Vous pouvez trouver les mises à jour @ https://support.Microsoft.com/en-us/kb/282976 J'ai donc eu deux machines, l'une fonctionnait bien et l'autre je recevais l'éxéption. J'ai étudié que la seule différence est la mise à jour de VS; l'a appliqué et cela a résolu le problème. :)

2
Rishi

J'essayais de faire exactement cette chose aussi. Comme beaucoup d'entre vous le savent peut-être, l'exécution de tests via MTM expose certaines propriétés supplémentaires au TestContext, y compris le nom des paramètres d'exécution utilisés. J'ai utilisé cette propriété comme une "clé étrangère" pour nos données de test, nous permettant de spécifier les URL d'environnement, etc. sans les coder en dur ou en utilisant les outils incroyablement terne de "conduite de données" fournis avec les tests prêts à l'emploi.

Bien sûr, il n'y a aucun moyen d'exposer des propriétés d'exécution lors de l'exécution de tests dans le cadre d'un flux de travail BDT ou de publication en plus de ce que @kritner tente que Microsoft décrit ICI =. Cependant, si vous lisez les commentaires de ce lien, vous découvrirez ce que vous pouvez déduire ici:

  • Vous devez utiliser VS 2013 R5 ou VS 2015 pour utiliser cette solution
  • Il ne fonctionnera que pour les tests unitaires!

Ceux d'entre nous qui tentent d'exécuter des tests d'interface utilisateur ou de charge dans le cadre d'un flux de travail CI ou CD sont complètement foutus. Vous n'obtenez aucune propriété supplémentaire dans testContext, même lorsque vous exécutez un plan/suite avec certaines configurations de test (pas les paramètres) créées dans MTM. @Adam a peut-être pu faire fonctionner cela lors de l'exécution vs le débogage, mais cela n'a peut-être fonctionné qu'avec des tests unitaires. Grâce à CodedUI, je n'ai pas pu récupérer les propriétés sans obtenir une exception NullReferenceException. Voici un exemple du code janky que j'utilisais pour enquêter:

if (testContextInstance.Properties["__Tfs_TestConfigurationName__"] != null) //Exposed when run through MTM
{
TFSTestConfigurationName = testContextInstance.Properties["__Tfs_TestConfigurationName__"].ToString();
}
else TFSTestConfigurationName = "Local"; //Local
var configName = testContextInstance.Properties["configurationName"] ?? "No Config Found";
Trace.WriteLine("Property: " + configName);

Et le XML de mon fichier .runsettings:

<?xml version="1.0" encoding="utf-8"?>
<RunSettings>
  <!-- Parameters used by tests at runtime. These are required as a substitute for TFS/MTM test settings.-->
  <!-- File instructions: https://msdn.Microsoft.com/en-us/library/jj635153.aspx#example -->
  <!-- TFS instructions: https://blogs.msdn.Microsoft.com/visualstudioalm/2015/09/04/supplying-run-time-parameters-to-tests/ -->  
  <TestRunParameters>
    <Parameter name="configurationName" value="Local" />
  </TestRunParameters>
</RunSettings>

Et un extrait du .trx produit par le workflow BDT:

Property: No Config Found 
2
Ryanman

J'ai pu résoudre ce problème pour les tests unitaires en désactivant Resharper. J'aimerais pouvoir dire la même chose pour les tests codés de l'interface utilisateur.

1
Jonathan Eckman