step argument transformations specflow tables
Посібник із трансформації аргументів кроку та таблиць спектрів:
Наш попередній підручник із Specflow коротко розповів нам про все Загальні прив'язки, гачки та повторне використання детально. Тут, у цьому посібнику, ми розглянемо більше про трансформацію крокових аргументів у Specflow.
Не соромтеся читати наші Повний посібник з підготовки спекфлоу для початківців для чіткого розуміння концепції. Функція перетворення аргументів кроку Specflow дозволяє користувачеві забезпечити власну трансформацію для параметрів, поданих у кроках.
Це дозволяє додавати власну логіку для перетворення вхідних параметрів у конкретний параметр. Наприклад, Ви можете безпосередньо створити об'єкт класу з параметрів і повернути побудований об'єкт із функції перетворення.
Ще однією особливістю Specflow, яку ми розглянемо, є таблиці Specflow, які дозволяють передавати вхідні дані у табличній формі за один крок, і помічники таблиці можуть отримати їх безпосередньо зіставленим до екземпляра 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.
Тепер можна помітити, що для підтримки різних типів входів потрібно писати різні реалізації прив’язки залежно від типу входів. Наприклад: Для вхідних даних, які мають лише частину дня, буде окремий крок реалізації, для входів, що мають день, місячну частину - буде окремий крок реалізації тощо.
Давайте подивимося, як це можна реалізувати за допомогою одного кроку за допомогою перетворення аргументу кроку, а наданий вхід просто перетворюється в об’єкт мітки часу і повертається до початкового кроку, який називається кроковим перетворенням.
Подумайте про це як про сканування регулярного виразу першого рівня на ваш вхід, яке повертає частково перетворене значення на виклик.
Подивіться на файл функції, що має 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, яке надсилається назад на викликаючий крок спекфлоу.
Давайте розглянемо реалізацію Трансформації нижче:
(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 і поверне назад.Таблиці спектру
Таблиці спектру - це спосіб передачі списку значень у функцію покрокової реалізації. У наших попередніх статтях ми розглядали спосіб реалізації тестів, керованих даними, використовуючи схему сценарію та приклади. Але це мало насамперед виконати сценарій з різними вхідними даними.
Тут, у таблицях, йдеться про передачу всіх даних одночасно у табличній формі до етапу реалізації, який постачає дані.
Наприклад, розглянемо приклад, коли ви тестуєте систему управління студентами, і для того, щоб створити новий студентський об’єкт, вам пропонується ввести безліч деталей, таких як ім’я, прізвище, вік, рік народження тощо.
Одним із способів є передача кожної цієї інформації як окремого етапу, який, по суті, буде великою кількістю зразкового коду, і на кожному кроці ви в кінцевому підсумку оновите той самий об’єкт, який потрібно протестувати. Іншим способом може бути побудова складного регулярного виразу та спроба передати всі дані за один і той же крок, але це досить схильне до помилок і нестійке.
Тут нам виручають столи. Всі вхідні дані, пов'язані зі студентом, можуть бути надіслані в один і той же крок реалізації в приємній табличній формі за допомогою табличної функції спекфолу.
Давайте подивимося нижче зразка коду для реалізації функції та кроку:
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, які можуть слугувати легким довідником для всіх зацікавлених сторін проекту.
НАЗАД Підручник | НАСТУПНИЙ підручник
Рекомендована література
- Розгортання в MongoDB: Покроковий посібник
- Покрокове встановлення та налаштування Appium Studio
- Приклад Specflow та Selenium Webdriver від кінця до кінця
- Покрокове керівництво з інтеграції QTP з ALM / QC
- 15 найпопулярніших запитань щодо інтерв’ю Specflow
- Розширені Specflow Shared & Scoped Bindings, Hooks і Step Reuse
- Встановіть MongoDB у Windows: покрокове керівництво
- Як інтегрувати JIRA із qTest: Покрокове керівництво