Как получить доступ к TestRunParameters в файле RunSettings
Читая https://msdn.microsoft.com/en-us/library/jj635153.aspx я создал .RunSettings
файлы с несколькими параметрами, похожими на пример:
<TestRunParameters>
<Parameter name="webAppUrl" value="http://localhost" />
<Parameter name="webAppUserName" value="Admin" />
<Parameter name="webAppPassword" value="Password" />
</TestRunParameters>
Я планирую иметь .RunSettings
файл для каждой из наших сред с соответствующими URL-адресами и учетными данными для запуска теста CodedUI в среде указанного файла RunSettings.
Я вижу, что из командной строки для ссылки на файл настроек я могу запустить:
vstest.console myTestDll.dll /Settings:Local.RunSettings /Logger:trx
vstest.console myTestDll.dll /Settings:QA.RunSettings /Logger:trx
так далее...
Но я не вижу ни одного способа, который бы вызывал, как на самом деле использовать TestRunParameters
из теста codedUI.
Что я хотел бы сделать, это настроить тестовые инициализаторы, которые используют TestRunParameters
определить, где войти и какие учетные данные использовать. Что-то вроде этого:
[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
}
Информация о том, как ссылаться на TestRunParameters
высоко ценится!
РЕДАКТИРОВАТЬ
/// <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
}
Исключение, которое я получаю при запуске:
Исключение NullReference
@williamfalconeruk Я обновил свой тестовый класс, как указано выше, но я все еще получаю ту же ошибку, есть идеи, что я делаю не так?
9 ответов
Для тех, кто использует Resharper с этой проблемой, я обнаружил исправление (нет необходимости отключать Resharper):
Перейдите в верхнее меню Visual Studio -> Resharper -> Параметры
Найдите раздел "Инструменты", разверните "Юнит-тестирование".
Нажмите на "MsTest". Флажок должен быть включен, но путь к файлу настроек теста ниже, который может быть пустым. Если это так, нажмите кнопку обзора и выберите файл runsettings, который вы хотите использовать.
Нажмите сохранить, перестроить и попытаться запустить тесты, параметры теперь должны работать.
Не знаю почему, но просто выбор файла настроек теста из меню "Тесты" -> "Настройки теста" фактически не работает при использовании Resharper, поэтому на этот файл нужно явно указывать прямо в опциях Resharper.
Я также сталкивался с этим недавно, так как мы хотели отойти от использования устаревших переменных среды. Приведенное ниже решение подходит для наших нужд, но может быть и лучше...
Оказывается, вы можете получить доступ к ним в TestContext
из ClassInitialize
метод вашего тестового прибора. E сть Properties
словарь, который имеет эти параметры, и вы можете получить доступ к значениям здесь:
[ClassInitialize]
public static void TestClassinitialize(TestContext context)
{
var webAppUrl = context.Properties["webAppUrl"].ToString();
//other settings etc..then use your test settings parameters here...
}
Примечание: они являются статическими, поэтому, если вам нужен доступ к этому, вам может потребоваться настроить статические свойства для доступа к вашему тестовому коду.
В качестве альтернативы предлагается использовать подход, основанный на данных. Вот некоторая базовая информация о тестах, управляемых данными, которые также могут помочь: https://msdn.microsoft.com/en-us/library/ms182527.aspx
Как я уже сказал, вышеупомянутое решение соответствует нашим потребностям на базовом уровне.
ОБНОВЛЕНИЕ: см. Изображение ниже в ответ на настройки теста, возвращающие ноль...
Это работает для меня (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);
}
}
}
Обязательно выберите файл runsettings, который вы хотите использовать, здесь: Test -> Test Settings.
Я тоже пытался сделать именно это. Как многие из вас могут знать, выполнение тестов через MTM предоставляет некоторые дополнительные свойства для TestContext, в том числе имя используемых параметров запуска. Я использовал это свойство как своего рода "внешний ключ" для наших тестовых данных, позволяя нам указывать URL-адреса среды и т. Д. Без их жесткого кодирования или использования невероятно скучных инструментов "Data Driving", которые поставляются с готовым тестированием.
Конечно, нет никакого способа показать какие-либо свойства времени выполнения при выполнении тестов как часть рабочего процесса BDT или выпуска, кроме того, что @kritner пытается, какой Microsoft описывает ЗДЕСЬ. Однако, если вы прочитаете комментарии по этой ссылке, вы обнаружите, что вы можете сделать здесь:
- Вам нужно использовать VS 2013 R5 или VS 2015, чтобы использовать это решение
- Это будет работать только для юнит-тестов!
Те из нас, кто пытается выполнить пользовательский интерфейс или нагрузочные тесты как часть рабочего процесса CI или CD, полностью облажались. Вы не получаете никаких дополнительных свойств в testContext, даже когда выполняете Plan/Suite с определенными конфигурациями теста (не настройками), созданными в MTM. @Adam, возможно, смог заставить это работать при запуске против отладки, но это могло работать только с юнит-тестами. Через CodedUI я не смог получить свойства без получения исключения NullReferenceException. Вот пример кода, который я использовал для расследования:
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);
И XML моего файла.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>
И отрывок из.trx, созданный рабочим процессом BDT:
Property: No Config Found
Альтернативой отключению Resharper является включение поддержки MSTest и выбор файла настроек теста в диалоговом окне "Параметры Resharper" (-> Инструменты->Unit Testing->MsTest).
Для проблемы NullReferenceException:
Недавно я столкнулся с той же проблемой, и решение этой проблемы состоит в том, чтобы получить последнее обновление Visual Studio 2013. Прямо сейчас последнее обновление - Обновление 5. Я не уверен, какое именно обновление исправляет эту проблему. Я применил обновление 5 и смог успешно получить доступ к TestRunParameters в методе ClassInitialize.
Вы можете найти обновления @ https://support.microsoft.com/en-us/kb/2829760 Итак, у меня было две машины, на одной все работало нормально, а на другой я получал исключение. Я исследовал, что единственная разница - это обновление VS; применил это, и это решило проблему.:)
С NUnit 3 я смог найти свойства в файле runsettings, используя
TestContext.Parameters
Итак, в этом случае это будет:
string entryUrl = TestContext.Parameters["webAppUrl"];
string username = TestContext.Parameters["webAppUserName"];
string password = TestContext.Parameters["webAppPassword"];
Я смог решить эту проблему для юнит-тестов, отключив Resharper. Хотел бы я сказать то же самое для кодовых тестов пользовательского интерфейса.
Почему вы не используете настройки приложения?
Вы можете прочитать их в любом месте, как
var yesICan= Properties.Settings.Default.IToldYou;
Вы можете создавать свойства из них, в значительной степени вы можете сделать многое.
public string URL_WEBOFFICE
{
get
{
return Properties.Settings.Default.WEBOFFICE_URL.Replace("***", Properties.Settings.Default.SiteName);
}
}