Как получить доступ к 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):

  1. Перейдите в верхнее меню Visual Studio -> Resharper -> Параметры

  2. Найдите раздел "Инструменты", разверните "Юнит-тестирование".

  3. Нажмите на "MsTest". Флажок должен быть включен, но путь к файлу настроек теста ниже, который может быть пустым. Если это так, нажмите кнопку обзора и выберите файл runsettings, который вы хотите использовать.

  4. Нажмите сохранить, перестроить и попытаться запустить тесты, параметры теперь должны работать.

Не знаю почему, но просто выбор файла настроек теста из меню "Тесты" -> "Настройки теста" фактически не работает при использовании 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

Как я уже сказал, вышеупомянутое решение соответствует нашим потребностям на базовом уровне.

ОБНОВЛЕНИЕ: см. Изображение ниже в ответ на настройки теста, возвращающие ноль...

Настройки теста в Visual Studio

Это работает для меня (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. Хотел бы я сказать то же самое для кодовых тестов пользовательского интерфейса.

Почему вы не используете настройки приложения?

AppSettings

Вы можете прочитать их в любом месте, как

var yesICan= Properties.Settings.Default.IToldYou;

Вы можете создавать свойства из них, в значительной степени вы можете сделать многое.

public string URL_WEBOFFICE
    {
        get
        {
            return Properties.Settings.Default.WEBOFFICE_URL.Replace("***", Properties.Settings.Default.SiteName);
        }

    }
Другие вопросы по тегам