step argument transformations specflow tables
Стъпка Аргумент Трансформации & Specflow таблици Урок:
Предишният ни урок за Specflow ни запозна с всичко Споделени и обхванати обвързвания, куки и повторна употреба подробно. Тук в този урок ще разгледаме повече за трансформацията на стъпкови аргументи в Specflow.
Чувствайте се свободни да прочетете нашите Пълно ръководство за обучение на Specflow за начинаещи за ясно разбиране на концепцията. Функцията за трансформация на стъпка на Specflow позволява на потребителя да осигури персонализирана трансформация за параметрите, предоставени в Стъпките.
Позволява добавяне на персонализирана логика за преобразуване на входните параметри в определен параметър. Например, можете директно да създадете обект от клас от параметрите и да върнете конструирания обект от функцията за трансформация.
Друга характеристика на Specflow, която ще разгледаме, е Specflow Tables, които позволяват предаване на входни данни в таблична форма с една стъпка и помощниците на таблицата могат да ги картографират директно към екземпляр на Object, както желаете.
Гледай видеото:
Ето видеоурок за Трансформации на стъпкови аргументи и таблици със спектри:
Какво ще научите:
Стъпка Аргумент Трансформации
За да разберем по-добре трансформациите на аргументи, нека първо се опитаме да разберем как точно Specflow отговаря на параметрите. Както видяхме в предишните ни статии, за пример за търсене в YouTube предавахме думата за търсене като параметър за изпълнение на сценария.
Съответствието на параметрите обикновено се случва чрез регулярен израз и съответстващото регулярно изражение води до задаване на параметъра на метода на предоставения термин за търсене в стъпката.
Нека първо се опитаме да разберем кои са поддържаните по подразбиране реализации в Specflow и кога трансформациите на аргументи могат да бъдат полезни.
Поддържани конверсии
Specflow поддържа много реализации извън кутията, като разглежда самия тип данни след съвпадение на регулярните изрази. Той може автоматично да се грижи за преобразувания като - String, integer, GUID, Enums и др.
Нека да видим пример за някои от тях по-долу:
Scenario: Get Transactions in my account Given I have entered customer name as Test Customer And I have entered customer account id as 0f8fad5b-d9cb-469f-a165-70867728950e And I select sorting order as DESCENDING And I select number of transactions to be displayed as 25 Then I should see my account transactions
В горната примерна кодова програма сме подчертали различни типове входни данни, които предаваме в Стъпките, а в стъпковите реализации те се преобразуват в съответните типове данни.
Нека да видим реализациите на стъпките за тези по-долу (за простота току-що направихме конзола за всяка от стъпките, за да илюстрираме, че предоставеният аргумент автоматично се преобразува в очаквания тип):
(Given(@'I have entered customer name as (.*)')) public void GivenIHaveEnteredCustomerNameAsTestCustomer(String customerName) { Console.Out.WriteLine(customerName); } (Given(@'I have entered customer account id as (.*)')) public void GivenIHaveEnteredCustomerAccountIdAs(Guid accountId) { Console.Out.WriteLine(accountId.ToString()); } (Given(@'I select sorting order as (.*)')) public void GivenISelectSortingOrderAsAscending(SortOrder sortOrder) { Console.Out.WriteLine(sortOrder.ToString()); } (Then(@'I should see my account transactions')) public void ThenIShouldSeeMyAccountTransactions() { Console.Out.WriteLine('success!'); } (Given(@'I select number of transactions to be displayed as (.*)')) public void GivenISelectNumberOfTransactionsToBeDisplayedAs(int p0) { Console.Out.WriteLine(p0.ToString());
При изпълнение на горния сценарий изходът отпечатва всички стойности успешно, като посочва, че автоматичното преобразуване на аргументи в очакваните типове данни е било успешно.
Ето как изглежда изходът:
Given I have entered customer name as Test Customer Test Customer -> done: SupportedSpecflowConversions.GivenIHaveEnteredCustomerNameAsTestCustomer('Test Customer') (0.0s) And I have entered customer account id as 0f8fad5b-d9cb-469f-a165-70867728950e 0f8fad5b-d9cb-469f-a165-70867728950e -> done: SupportedSpecflowConversions.GivenIHaveEnteredCustomerAccountIdAs(0f8fad5b-d9cb-469...) (0.0s) And I select sorting order as DESCENDING DESCENDING -> done: SupportedSpecflowConversions.GivenISelectSortingOrderAsAscending(DESCENDING) (0.0s) And I select number of transactions to be displayed as 25 25 -> done: SupportedSpecflowConversions.GivenISelectNumberOfTransactionsToBeDisplayedAs(25) (0.0s) Then I should see my account transactions success! -> done: SupportedSpecflowConversions.ThenIShouldSeeMyAccountTransactions() (0.0s)
Аргументни трансформации
Нека да видим пример в действие, за да разберем това. Поддръжка, имате приложение, което преобразува даденото време и го преобразува в минути. Пример: Ако потребителският вход е 1 ден - изходът е - 1440, ако потребителският вход е 1 ден 2 часа 2 минути, тогава изходът трябва да бъде 1562.
Сега може да се види, че за да се поддържат различни видове входове, ще трябва да се напишат различни изпълняващи изпълнения в зависимост от вида на входовете. Например: За входове, имащи само част от деня, ще има отделна стъпка за изпълнение, за входове с ден, месец част - ще има отделна стъпка за изпълнение и т.н.
Нека да видим как това може да се приложи чрез реализация на една стъпка чрез трансформация на Step Argument и предоставеният вход просто се преобразува в обект с времеви клеймо и се връща към първоначалната стъпка, която се нарича трансформация на стъпката.
Помислете за това като за сканиране на регулярно изражение от първо ниво към вашия вход, което връща частично трансформираната стойност към стъпката на извикване.
Погледнете файла с характеристиките, който има 3 различни варианта на въвеждане, с едно преобразуване, като го преобразувате в пълен обект с времеви интервал и се върнете обратно.
Scenario: Convert timestamp to minutes - variant 1 Given I have entered 50 days into the timestamp to minute converter When I press calculate Then the result should be 72000.00 on the screen Scenario: Convert timestamp to minutes - variant 2 Given I have entered 1 day, 2 hours, 3 minutes into the timestamp to minute converter When I press calculate Then the result should be 1563.00 on the screen Scenario: Convert timestamp to minutes - variant 3 Given I have entered 1 day, 1 hour, 1 minute, 30 seconds into the timestamp to minute converter When I press calculate Then the result should be 1501.50 on the screen
Погледнете подчертаните стойности в горния пример за код. Всички те ще се погрижат за абсолютно същата трансформация и крайният резултат ще бъде преобразувана входна стойност на TimeSpan, която се изпраща обратно към извикващата стъпка Specflow.
Нека да разгледаме изпълнението на Трансформацията по-долу:
(StepArgumentTransformation(@'(?:(d*) day(?:s)?(?:, )?)?(?:(d*) hour(?:s)?(?:, )?)?(?:(d*) minute(?:s)?(?:, )?)?(?:(d*) second(?:s)?(?:, )?)?')) public TimeSpan convertToTimeSpan(String days, String hours, String minutes, String seconds) { int daysValue; int hoursValue; int minutesValue; int secondsValue; int.TryParse(days, out daysValue); int.TryParse(hours, out hoursValue); int.TryParse(minutes, out minutesValue); int.TryParse(seconds, out secondsValue); return new TimeSpan(daysValue, hoursValue, minutesValue, secondsValue); }
За да може рамката да знае, че тя е обвързваща трансформация, трябва да се добави атрибут StepArgumentTransformation към метода, реализиращ преобразуването на аргумент.
Другите важни моменти, които трябва да се отбележат по отношение на конвертирането на аргументи, са:
# 1) Стъпка Трансформациите на аргумент се изпълняват за всяка съвпадаща стъпка, т.е. независимо от вида на стъпката, т.е. дали е дадено, кога или след това, трансформацията ще се случи за всеки съвпадащ регекс.
# две) В зависимост от типа на връщане на преобразувания изход, ако действителната стъпка на извикване няма съответстващ тип на връщане за входния параметър, тогава преобразуването няма да се осъществи.
Това означава, че да предположим, че стъпката за извикване изисква трансформиран вход, но има споменатата клейма за вход като нещо, което не съответства на типа на връщане на преобразувания метод, тогава съвпадението на регулярните изрази ще бъде отменено и преобразуването няма да се осъществи.
Нека да разгледаме изпълнението на извикването на стъпката „Дадено“:
private TimeSpan ts; (Given(@'I have entered (.*) into the timestamp to minute converter')) public void GivenIHaveEnteredDaysIntoTheTimestampToMinuteConverter(TimeSpan tsTransformed) { ts = tsTransformed; }
Погледнете типа на входния параметър тук, т.е. неговия TimeSpan, който съответства на типа, върнат от стъпката на трансформация, ако това е променено на друг тип. Например String, тогава преобразуването на аргумент няма да се случи и съвпадението на регулярните изрази ще бъде заменено от оригиналното изпълнение на стъпка.
Професионален съвет: Тук е важно да се отбележи, че целият текст, който трябва да бъде преобразуван, трябва да бъде подаден / съчетан чрез трансформация на стъпка аргумент. Следователно дадената стъпка сега ще обгърне всички възможни входни формати в един низ и трансформационният регулярен израз ще го преобразува в обект TimeSpan и ще се върне обратно.Таблици за спектър
Таблиците за спектрометрия са начин за предаване на списък със стойностите на стъпковата функция за изпълнение. В предишните ни статии разгледахме начина за внедряване на тестове, управлявани от данни, използвайки схематични схеми и примери. Но това беше преди всичко да изпълни сценария с различни входове.
Тук, в таблици, става въпрос за предаване на всички данни наведнъж в таблична форма на изпълнението на стъпката, която доставя данни.
Например, помислете за пример, при който тествате система за управление на ученици и за да създадете нов студентски обект, трябва да попълните много подробности като собствено име, фамилия, възраст, година на раждане и т.н.
Един от начините е да предадете всяка от тази информация като отделна стъпка, която по същество ще представлява много примерни кодове и във всяка стъпка ще завършите актуализирането на същия обект, който трябва да бъде тестван. Друг начин може да бъде изграждането на сложен регулярен израз и опит за предаване на всички данни в една и съща стъпка, но е доста податлив на грешки и нестабилен.
Масите идват да ни спасят тук. Всички входни данни, свързани със студента, могат да бъдат изпратени в една и съща стъпка по хубав табличен начин чрез функцията за таблица на specflow.
Нека да видим пример за код по-долу за изпълнението на Feature и Step:
Scenario: Pass data through Specflow tables for StudentInfo object Given I have entered following info for Student | FirstName | LastName | Age | YearOfBirth | | test | student | 20 | 1995 | When I press add Then i student should get added to database and entered info should be displayed on the screen
Данните от таблицата са подчертани в горната сценария на сценария.
как да върна масив от метод в java
Specflow предоставя много TableHelpers, които директно позволяват полезни функции като създаване на екземпляр на обект от предоставените от потребителя входни данни, вместо да анализирате всяко поле самостоятелно.
Нека да видим стъпката по-долу:
private StudentInfo studInfo; (Given(@'I have entered following info for Student')) public void GivenIHaveEnteredFollowingInfoForStudent(Table table) { // converting supplied input data directly to instance of StudentInfo object studInfo = table.CreateInstance(); }
Погледнете подчертания раздел по-горе. Ето само един малък ред код, целият обект StudentInfo (който е POCO, съдържащ полетата за данни на студента, т.е. име, фамилия, възраст, година на раждане и т.н.)
Някои други функции / концепции, свързани с таблици Specflow, са показани по-долу:
# 1) Масите могат да бъдат хоризонтални или вертикални. Вертикалните таблици са по-скоро двойки ключ-стойност и в горния сценарий по-скоро съпоставяния име-стойност, докато хоризонталните таблици съдържат всички данни за обект в един ред (точно както видяхме в нашия пример).
# две) Вертикалните таблици могат да бъдат преобразувани само в един .NET обект, докато хоризонталните таблици също могат да бъдат преобразувани в набор или колекция от обекти.
# 3) Всяка стойност на полето в таблицата трябва да бъде атомарна, тъй като ще бъде преобразувана в едно съответно поле в анализирания обект.
Тук е важно да се отбележи, че дори и вие автоматично генериране стъпкови обвързвания с табличните данни, генераторът за обвързване Specflow автоматично ще отчита такива типове входни данни и ще го разпознава като валидни таблични данни.
Заключение
В тази статия се опитахме да обясним 2 важни и удобни концепции в Specflow.
Първата стъпка е Стъпка Аргумент трансформации които позволяват преобразуване на персонализиран тип за аргументи Specflow, за да се избегне шаблонния код (и дава възможност на тестовия скрипт да изглежда по-модулиран и логичен), а втората функция, която разгледахме, е Таблици за спектър които са полезни, когато трябва да предадете много полета / данни с една стъпка в удобен за потребителя табличен формат.
В нашия предстоящ урок ще научим повече за това как можете автоматично да генерирате красива документация, използвайки Specflow в различни формати, използвайки инструменти с отворен код като Pickles, които могат да служат за лесна справка за всички заинтересовани страни от проекта.
PREV Урок | СЛЕДВАЩ урок
Препоръчително четене
- Внедряване в MongoDB: Урок стъпка по стъпка
- Поетапна инсталация и настройка на Appium Studio
- Пример за Specflow и Selenium Webdriver End to End
- Ръководство стъпка по стъпка за интегриране на QTP с ALM / QC
- Топ 15 популярни въпроси за интервю за Specflow
- Разширени Specflow споделени и обхванати обвързвания, куки и повторна употреба на стъпки
- Инсталирайте MongoDB на Windows: Ръководство стъпка по стъпка
- Как да интегрираме JIRA с qTest: Ръководство стъпка по стъпка