data driven parameterized testing with spock framework
Дослідіть способи написання керованих даними або параметризованих тестів за допомогою Spock Framework:
У цьому Безкоштовна серія навчальних підручників Spock , ми дослідили все про Одиничне тестування в Spock та Тестові прилади, твердження та звітність у нашому попередньому уроці.
У цьому підручнику ми спробуємо зрозуміти, що таке параметризовані тести та як ви можете використовувати вбудовані функції Spock для досягнення керованого даними тестування.
Давайте розпочнемо!!
Перегляньте відеоурок
Що ви дізнаєтесь:
- Що таке параметризовані тести?
- Написання параметризованих тестів за допомогою Spock
- Життєвий цикл блоку “де”
- Поради та підказки
- Висновок
- Рекомендована література
Що таке параметризовані тести?
Для тих, хто працював з автоматизацією / модульними тестами, тестування на основі даних - не новий термін.
Параметризовані тести - це ніщо інше, але це будь-які тести, які мають однакову логіку виконання і в деяких випадках відрізняються лише вхідними даними та результатами.
Приклад: Припустимо, у вас є програма Калькулятор, щоб повністю перевірити функціональність, можливо, ви захочете запустити свої тести з різними наборами вводу.
Приклад: Негативні значення, дробові числа, звичайні цілі числа, цілі числа, що наближаються до максимально дозволеного діапазону тощо. Незалежно від того, які вхідні значення у вас є, ви хочете запустити ту саму логіку виконання.
Ще однією вагомою причиною для написання параметризованих тестів є те, що він не просто тестує щасливий шлях, він також тестує шлях помилок або негативні сценарії.
Приклад: Припустимо, існує програма, яка повертає, чи є дане розширення файлу дійсним чи ні. Тести, керовані даними, можуть швидко дозволити розробнику виконувати тести на підтримувані розширення файлів та будь-які сценарії помилок або негативні вхідні тести.
Зараз традиційно ви можете думати про те, щоб написати або скопіювати тести для кількох вхідних значень, але це не правильний або розумний спосіб досягти такого типу виконання тесту. Більше того, оскільки у вашому додатку кількість тестів починає збільшуватися, їх буде важко підтримувати.
Написання параметризованих тестів за допомогою Spock
Де: блок
Блок where у тесті Spock - це блок, що містить дані для параметризованого тесту. За бажанням він може містити як вхідні, так і очікувані вихідні значення. Важливим моментом щодо цього блоку є те, що це повинен бути останній блок у тесті Spock.
Сказавши це, його можна комбінувати з усіма іншими блоками, як дано, коли і тоді, але має бути останнім блоком.
Давайте подивимось на Приклад, щоб краще його зрозуміти
Ми будемо використовувати додаток калькулятора, який приймає 2 вхідні параметри і повертає суму наданих входів. Ми напишемо параметризований тест, що надає кілька входів та очікувані вихідні значення.
def 'sample parameterized test'() input2
У наведеному вище зразку коду ви можете побачити наступне:
- Блок “where”, який містить дані для запуску тесту.
- “Where” - це останній блок тесту.
- 'Де' поєднується з іншими блоками, тобто дається, коли і тоді.
- Представлення даних - це спеціальний формат, який називається таблицями даних, який ми детально розглянемо у наступних розділах цього посібника.
- Рядок заголовка даних - це, по суті, властивості / вхідні змінні, які можна безпосередньо використовувати в тесті. Наприклад Зверніться до твердження в блоці 'коли', де ми безпосередньо використовували вхід1 і вхід2 як вхідні параметри, не визначаючи їх явним чином.
Використання таблиць даних
Спробуємо зараз детально розібратися в таблицях даних. Кожен рядок таблиці даних представляє дані для окремого сценарію (виконання тесту).
За домовленістю, тобто вхідним значенням передує одна труба (‘|’), тоді як вихідним значенням передує подвійна труба (‘||’). Це не має жодного логічного значення, але це умовність і покращує читабельність. Таким чином, обидва наведені нижче приклади справедливі.
input1 |input2 |expectedResult 10 |15 |25 -4 |6 |2 input1 |input2 || expectedResult 10 |15 || 25 -4 |6 || 2
Рядок заголовка, як показано вище, має назву для кожного з параметрів, що подаються як дані для перевірки. Тут важливо зауважити, що ці назви параметрів не повинні суперечити будь-яким існуючим локальним / глобальним змінним у тесті, інакше будуть помилки під час компіляції вирішити імена змінних.
Важливим моментом, який слід зазначити під час використання таблиць даних, є те, що потрібно мінімум 2 стовпці. Якщо вам просто потрібен один стовпець, то порожній стовпець зі значеннями як символ підкреслення - це обхідний спосіб, як показано нижче.
input1 ||_ 10 ||_ -4 ||_
Перевагою цього формату є простота, читабельність та розширюваність. Додавання нового введення даних так само просто, як додавання нового рядка зі значеннями даних.
Ще один момент, на який слід звернути увагу, полягає в тому, що таблиці даних можуть використовуватися для зберігання будь-яких типів змінних, класів, об'єктів, перерахувань тощо, що робить їх ще більш потужними. Оскільки groovy є додатково введеною мовою, якщо явний тип не вказаний, змінні в таблиці даних мають на увазі, залежно від типу поданих даних.
Подивимось інший Приклад використання таблиць даних зі списком рядків як вхідних та вихідних даних як підрахунок елементів у рядку.
def 'sample parameterized test with list data type'() when: def actualCount = input1.size() then: actualCount == expectedCount where: input1
У наведеному вище прикладі ви можете помітити, що ми надали вхідні дані як масив із рядків, а вихідні дані - це розмір цього списку масивів. Таким чином, це дає велику гнучкість при введенні вхідних даних різних типів.
Ви також можете просто згадати будь-які вирази, які повертають дані відповідного типу введення та використовують їх безпосередньо в таблицях даних.
Життєвий цикл блоку “де”
Для тестів, що містять де блок і зразки даних у вигляді таблиць даних, кожен рядок даних являє собою одне виконання методу тестування.
Наприклад, якщо є 5 рядків даних, і тест містить блоки 'задано' і 'коли', тоді для такого рядка даних тестові блоки виконуються один раз. Отже, загалом буде виконано 5 методів тестування.
Поради та підказки
Давайте подивимось кілька порад та підказок для параметризованих тестів під час роботи з цими таблицями даних.
# 1) Відображення результатів виконання окремих рядків окремо. Як ми бачили в розділі життєвого циклу, для кожного рядка даних існує одне виконання тестового коду. Для того, щоб ці рядки або результати відображалися окремо для кожного такого рядка, для таких тестів може використовуватися анотація “@Unroll”.
Спробуємо зрозуміти це на прикладі:
Ми будемо використовувати ту саму програму-калькулятор із 3 наборами вхідних даних, що надходять у досліджуваний метод.
зробити копію масиву java - -
def 'sample parameterized test'() -20
Без анотації '@Unroll' давайте подивимося, як результат виглядає в терміналі (а також звіти на основі HTML). При такому виданні даних стає важко з’ясувати, який набір вхідних даних спричинив провал тесту.
Тепер давайте подивимося, як тестовий результат звітується окремо для кожного рядка після додавання анотації “@Unroll” до методу тестування (який має таблиці даних як вхідні дані).
# два) Тепер давайте зрозуміємо, як додати значущу інформацію до цих тестів, керованих даними (замість деяких автоматично доданих індексів, як на скріншоті вище).
Ми можемо використовувати заповнювачі для властивостей вводу та виводу (відповідно до таблиці даних), а потім ми можемо бачити значення, заповнені в іменах тестів з даними з таблиць даних.
Давайте використаємо той самий приклад і оновимо назву тесту, щоб отримати дані із вхідних даних та очікуваних результатів, як зазначено в таблицях даних:
@Unroll def 'result of adding #input1 & #input2 should be #expectedResult'() given: def app = new CalculatorApp() when: def resultSum = app.add(input1, input1) then: resultSum == 2 * input1 where: input1
Тепер давайте подивимося, як висновок виглядає в терміналі та звітах на основі HTML:
Отже, як ви можете бачити тут, дані з вводу та виводу тепер відображаються разом з іменами тестів, коли вони виконуються. Таким чином це значно полегшує пошук та усунення несправностей, оскільки чітко вказує, яке введення призвело до збою тесту або неправильної поведінки.
Висновок
У цьому підручнику ми дізналися про написання параметризованих тестів за допомогою фреймворка Spock. Ми також обговорили різні особливості таблиць даних та те, як їх можна використовувати.
Ознайомтесь з нашим майбутнім посібником, щоб дізнатись, як користуватися Mocks and Stubs with Spock !!
НАЗАД Підручник | НАСТУПНИЙ підручник
Рекомендована література
- Написання модульних тестів із Spock Framework
- Запитання для інтерв’ю з Spock (найпопулярніші)
- Spock для інтеграції та функціональних випробувань із селеном
- Спок знущання та придушення (приклади з відеоуроками)
- Підручник з Spock: Тестування за допомогою Spock and Groovy
- Data Driven Framework у Selenium WebDriver з використанням Apache POI
- Як проводити тестування на основі даних за допомогою інструмента TestComplete
- Як працює тестування на основі даних (приклади QTP та селену)