Передача переменных среды в тесты в Visual Studio 2019

Казалось бы, довольно тривиальный вопрос, но, к моему удивлению, я не нашел упоминания об этом в Интернете.

У меня есть тестовый проект Nunit (который написал кто-то другой, и я не хочу слишком сильно его менять), который мне нужно отладить. Эти тесты зависят от переменных среды, которые они считывают с помощью Environment.GetEnvironmentVariable.

Мой вопрос: можно ли передавать переменные среды при отладке тестов в Visual Studio?

Я знаю, что могу передавать переменные среды при отладке исполняемого проекта через Project Properties-›Debug, но это не действует при выполнении тестов (например, через Test Explorer) . Я также знаю, что могу передавать параметры теста через файлы .runsettings, но они доступны только через класс TestContext.


person Arnon Axelrod    schedule 30.09.2020    source источник
comment
Привет, есть новости по этой проблеме? Если мой ответчик поможет вам решить проблему, пожалуйста, не принимайте ее. А если нет, пожалуйста, дайте нам знать :)   -  person Mr Qian    schedule 05.10.2020
comment
Я сталкиваюсь с той же ситуацией. Некоторые интеграционные тесты, выполняемые в Jenkins, которые вводят переменные среды для строк подключения и других вещей, не работают из VS Test Explorer, если я специально не изменяю переменные среды своей системы, просто чтобы иметь возможность запускать тесты (в моем случае причина почему это было сделано таким образом, чтобы предотвратить сохранение учетных данных в исходных или конфигурационных файлах)   -  person Nelson Rodriguez    schedule 23.04.2021


Ответы (2)


Я также знаю, что могу передавать параметры теста через файлы .runsettings, но они доступны только через класс TestContext.

Вы также можете укажите переменные среды в файле .runsettings:

<?xml version="1.0" encoding="utf-8"?>
<RunSettings>
    <RunConfiguration>
        <EnvironmentVariables>
            <YOUR_VARIABLE>Value for your variable</YOUR_VARIABLE>
            <SOME_OTHER_VARIABLE>With another Value</SOME_OTHER_VARIABLE>
        </EnvironmentVariables>
    </RunConfiguration>
</RunSettings>

В качестве альтернативы (если вам нужно запустить код или вычислить значение) вы можете реализовать DataCollector, который предоставляет переменные среды через ITestExecutionEnvironmentSpecifier

// Add a reference to nuget package `Microsoft.TestPlatform.ObjectModel`
// The assembly name must end with `Collector` (i.e. match `*collector.dll`)

[DataCollectorFriendlyName("my own example collector")]
[DataCollectorTypeUri("datacollector://myown/examplecollector/1.0")]
public class MyDataCollector : DataCollector, ITestExecutionEnvironmentSpecifier
{
    public override void Initialize(
        XmlElement configurationElement,
        DataCollectionEvents events,
        DataCollectionSink dataSink,
        DataCollectionLogger logger,
        DataCollectionEnvironmentContext environmentContext)
    {
        // inspect configurationElement for your custom settings
    }

    public IEnumerable<KeyValuePair<string, string>> GetTestExecutionEnvironmentVariables()
    {
        return new Dictionary<string, string>
        {
            ["YOUR_VARIABLE"] = "your value",
        };
    }
}

Вы также настраиваете свой сборщик данных через файл .runsettings:

<?xml version="1.0" encoding="utf-8"?>
<RunSettings>
    <RunConfiguration>
        <TestAdaptersPaths>path/where/to/find/your/collector</TestAdaptersPaths>
    </RunConfiguration>
    <DataCollectionRunSettings>
        <DataCollectors>
            <DataCollector friendlyName="my own example collector" uri="datacollector://myown/examplecollector/1.0">
                <Configuration>
                    <SomeSettingHere/>
                </Configuration>
            </DataCollector>
        </DataCollectors>
    </DataCollectionRunSettings>
</RunSettings>
person Zarat    schedule 11.01.2021

Если вы хотите изменить среду, доступную при отладке проекта, не нарушая ее, вы можете попробовать установить ее в системной переменной среды.

1) создайте системную переменную среды с именем number

введите здесь описание изображения

2) используйте это в своем коде:

string str=  Environment.GetEnvironmentVariable("number",EnvironmentVariableTarget.Machine);

Он получит переменную системной среды number в вашем коде.

3) запустите отладку этого проекта и установите для него точку останова. Когда вы захотите изменить переменную, вы можете изменить значение переменной системной среды number непосредственно в свойствах компьютера.

После этого просто переместите курсор обратно на строку кода, вы можете использовать измененное значение.

=========================================

Обновление 1

введите здесь описание изображения

При изменении значения системной переменной number следует нажать OK, чтобы сохранить новое значение. А затем переместите курсор точки останова назад, чтобы получить новое значение.

Кроме того, вы должны включить Редактировать и продолжить вариант.

person Mr Qian    schedule 03.10.2020
comment
Спасибо @Перри. Это решение, очевидно, работает и может быть даже единственным возможным решением, но оно отстой. Это означает, что я должен установить переменную среды как общесистемную переменную, а не только для отлаживаемого процесса (как я могу сделать, например, при отладке консольного приложения) - person Arnon Axelrod; 05.10.2020
comment
Извините, я только что проверил, и он не работает. Я предполагаю, что это будет работать, только если вы установите переменную перед открытием Visual Studio! Если мне нужно закрывать и снова открывать VS каждый раз, когда мне нужно изменить значение, это, в конце концов, не является жизнеспособным решением для меня :-( - person Arnon Axelrod; 05.10.2020
comment
Если моя сторона, когда я меняю переменную системного номера, я могу получить измененное значение. Я обновлю небольшую гифку для вас. - person Mr Qian; 08.10.2020
comment
В своем тесте я не нарушал процесс отладки и не приходилось перезапускать VS. Просто включите опцию Edit and Continue vs. - person Mr Qian; 08.10.2020
comment
То, что вы показываете, является проектом консольного приложения. Я говорю о тестовом проекте Nunit. В таком проекте это не работает... - person Arnon Axelrod; 14.10.2020