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
@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?
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 ...
Pour ceux qui utilisent Resharper avec ce problème, j'ai découvert le correctif (pas besoin de désactiver Resharper):
Allez dans le menu supérieur de Visual Studio -> Resharper -> Options
Recherchez la section Outils, développez "Test unitaire"
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.
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.
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.
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).
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. :)
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:
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
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.