#c# #nunit #automated-tests #specflow
#c# #nunit #автоматизированные тесты #specflow
Вопрос:
Я хотел бы расширить тестовый набор, который я написал в SpecFlow, чтобы он был немного более расширяемым, поэтому я хотел бы сделать в настройках создание базовой переменной URL, которую я могу установить в зависимости от флага, который я использую в Nunit runner. Итак, если я отправляю тест в виде тега, я хочу, чтобы для некоторого значения URL было установлено значение «http://test /»или для разработки установить URL в «http://dev /». Я знаю, что глобальные переменные бесполезны в NUnit, большая часть моих предыдущих сценариев была написана на Perl, где даже тогда я использовал его в редких случаях. Я не уверен, что делаю это правильно, хотя я получаю код для компиляции без ошибок, URL никогда не устанавливается. Что я делаю, так это проверку при запуске NUnit runner:
private static testInfoConfiguration myUrl;
public static string baseUrl = string.Empty;
[BeforeFeature("Test")]
public static void BeforeFeature_Test()
{
myUrl = new testInfoConfiguration();
baseUrl = myUrl.setBaseUrl("Test");
}
Который вызывает это:
public class testInfoConfiguration
{
public string setBaseUrl(string envType)
{
string envUrl;
if (envType == "Test")
{
envUrl = "http://testweb/";
return envUrl;
}
if (envType == "Prod")
{
envUrl = "http://www/";
return envUrl;
}
envUrl = "http://devweb/";
return envUrl;
}
Затем я хочу позже вызвать переменную URL:
[When(@"I access the Web Site")]
public void WhenIAccessTheWebSite()
{
string kcUrl = baseUrl "/knowledge/Pages/default.aspx";
driver.Navigate().GoToUrl(kcUrl);
Когда я вызываю переменную URL, она по-прежнему пуста. Есть ли способ сделать это? Я все еще изучаю C #, NUnit и SpecFlow, поэтому, вероятно, я просто не смотрю на правильный аспект этого, где я ошибаюсь. Или просто действительно не понимаю, как установить переменную таким образом.
Редактировать: Корректировка существующего кода
Ответ №1:
В этом блоке кода:
private static testInfoConfiguration myUrl;
public string baseUrl = "";
[BeforeFeature("Test")]
public static string BeforeFeature_Test()
{
myUrl = new testInfoConfiguration();
string baseUrl = myUrl.setBaseUrl("Test");
return baseUrl;
}
Вы определяете baseUrl
дважды: один раз в области метода и один раз в области класса.
Когда вы находитесь в этом блоке кода:
string kcUrl = baseUrl "/knowledge/Pages/default.aspx";
driver.Navigate().GoToUrl(kcUrl);
Вы имеете в виду (я полагаю) поле экземпляра baseUrl
, которое вы никогда не устанавливали.
Попробуйте следующее:
private static testInfoConfiguration myUrl;
public static string baseUrl = string.Empty;
[BeforeFeature("Test")]
public static void BeforeFeature_Test()
{
myUrl = new testInfoConfiguration();
baseUrl = myUrl.setBaseUrl("Test");
}
Комментарии:
1. Это определенно приблизило меня, и спасибо за урок по области видимости, я все еще разбираюсь в этом. Хотя я нахожу, что строка kcUrl = baseUrl заканчивается пустым baseUrl. Это мой возврат в функции setBaseUrl?
2. Не видя всего задействованного кода, я действительно не могу сказать. Дополните свой вопрос дополнительной частью вашего кода, и я посмотрю, что я могу сделать.
3. Хорошо, обновлено, хотя я не знаю, что еще необходимо. Насколько я могу судить, на данный момент не должно вызываться никакого другого кода, поскольку я просто сразу устанавливаю переменную url. При запуске теста URL-адрес браузера отображается как: http:///knowledge/Pages/default.aspx таким образом, он получает последнюю часть конкатенации строк. Спасибо за помощь!
4. Вы уверены, что они оба являются частью одной и той же функции? Я понимаю
[BeforeFeature("Test")]
. Если ваш методWhenIAccessTheWebSite()
не является частью той же функции, вероятно, он не выполняет метод setup. Установите точку останова и проверьте,BeforeFeature_Test()
выполняется ли.5. Теперь у меня возникла проблема, я забыл сбросить тег. Теперь работает идеально … большое вам спасибо!