t.me/atinfo_chat Telegram группа по автоматизации тестирования

Передача параметра в файл .feature Specflow+Nunit3

csharp
specflow
nunit
webdriver
Теги: #<Tag:0x00007f21d0ec6a28> #<Tag:0x00007f21d0ec68e8> #<Tag:0x00007f21d0ec67a8> #<Tag:0x00007f21d0ec6668>

(Максим Лаптев) #1

Использую Specflow+Nunit3

Запускаю через cmd

nunit3-console.exe "%pathToDll%" --where "test == Tests.Smoke.testOne"

В самом файле .feature статично забиты параметры

Scenario Outline:
..........
Examples: 
| name			| 
| nameMachine   | 

Каким то образом можно передать параметр name, который заранее не известен, через cmd, в строке запуска, в файл .feature в examples ?


(Valentin G ) #2

Я бы подумал над тем, чтобы передавать это значение перед компиляцией проекта или в файл, который будет считываться во время выполнения теста.


(Максим Лаптев) #3

допустим, каким образом его в .feature передавать?


(Максим Лаптев) #4

там просто запуск через дженкинс, перед запуском мы ему говорим имя параметра и дальше в скрипте он его в строку запроса cmd передает, можно конечно и в файл записывать, это одна сторона вопроса, другое дело как .feature получит значение


(Максим Лаптев) #5

Если запускать через SpecRun.exe это поможет в решении проблемы?


(Alexandr D.) #6

Можно сделать просто - создать метод, который будет смотреть куда-то, брать значение по ключу, записывать его в переменную.
А дальше в тесте использовать эту переменную.


(Максим Лаптев) #7

Как при этом должен измениться файлы .feature и .cs

Scenario Outline: TestTest
	Given I went to the page
	When I checkname <name>
	Then the name <name> must match the one found.
	
Examples: 
| name		| 
| machinename   | 

  [When(@"I checkname (.*)")]
        public void TestTest(string name)
        {
            func(name);
        }

Допустим нам известен name который мы записали в переменную, мы его получили и передали в func(name);
Каким образом передать это в шаг? по сути потом строится отчет в котором мы должны увидеть наш name


(Максим Лаптев) #8

В [BeforeStep] сделал след.

string machine = TestContext.Parameters.Get("Machine");

Через cmd ввожу

nunit3-console.exe --params:Machine=win1 "%pathToDll%" --where "test == Tests.Smoke.testOne"

Ну и использую получившееся имя в

  [When(@"I checkname (.*)")]
        public void TestTest(string name)
        {
            func(machine);
        }

Тест отрабатывает, но каким образом я могу в шаг передать значение machine ,возможно ли это? или наоборот в сам файл .feature возможно сразу передать значение?


(Vladislav Abramov) #9

пиши в json и читай из него кодом


(Максим Лаптев) #10

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


(Valentin G ) #11

Вставь в feature placeholder, во время билда, после взятия изменений но перед компиляцией сделай операцию find-replace (найти placeholder - заменить его параметром), дальше делай компиляцию и дальше процесс.


(Vladislav Abramov) #12

Так обработку сделай через allure.commons и докладывай любые нужные тебе данные


(Максим Лаптев) #13

Вариант более перспективен, не знаю пока как реализовать


(Vladislav Abramov) #14

Вот так подменяю название тачки во вкладке TimeLine

        public static void SetHostName()
        {
            AllureLifecycle.Instance.UpdateTestCase(x =>
            {
                int i = -1;

                i = x.labels.FindIndex(t => t.name == "host");

                try
                {
                    x.labels[i].value = names[x.labels[i].value];
                }
                catch { };
            });
        }

        public static Dictionary<string, string> names = new Dictionary<string, string>
        {
            { "WSTT00000032980", "Vlad" },
            { "WSTT00000034531", "Sofia-Nicole" }
        };

на лету можно для каждого шага получать список параметров и добавлять/удалять/изменять их


(Pavel Stryhelski) #15

Можно использовать трансформации.
И получать в фичах значение прямо через метод типо:
When i set name as @GetValue(‘name’)

Если нужно могу кодец посмотреть.


(Максим Лаптев) #16

я остановился на варианте предложенным Valentin_G.


(Pavel Stryhelski) #17

Хорош.
Т.е. запустить тесты не сможет никто, только тот кто знает что нужно сначала сделать реплейс значений )))


(Максим Лаптев) #18

Это все через Дженкинс гоняется, в начале запуска выбираем параметры нужные (типа на какой виндовой машине запустить) и перед билдом проекта скриптом распихивает значения и билдит проект, затем запускает.
Другое дело, при отладке или дополнению тестов, да, нужно учесть этот момент