data driven parameterized testing with spock framework
Разгледайте начините за писане на управлявани от данни или параметризирани тестове с Spock Framework:
В това Безплатни поредици за обучение на Spock , разгледахме всичко Единично тестване в Spock и Тестови тела, твърдения и отчети в нашия предишен урок.
В този урок ще се опитаме да разберем какво представляват параметризираните тестове и как можете да използвате вградените функции на Spock, за да постигнете тестване, управлявано от данни.
Да започваме!!
Гледайте видео урока
Какво ще научите:
- Какво представляват параметризираните тестове?
- Писане на параметризирани тестове със Spock
- Жизнен цикъл на блока „къде“
- Съвети и трикове
- Заключение
- Препоръчително четене
Какво представляват параметризираните тестове?
За всеки, който е работил с автоматизация / модулни тестове, управляваното от данни тестване не е нов термин.
Параметризираните тестове не са нищо друго, но представляват всякакъв вид тестове, които споделят една и съща логика на изпълнение и се различават само във входните данни и резултата в някои случаи.
Пример: Да предположим, че имате приложение Калкулатор, за да тествате напълно функционалността, може да искате да стартирате тестовете си срещу различен набор от входни данни.
Пример: Отрицателни стойности, дробни числа, нормални цели числа, цели числа, приближаващи максимално допустимия обхват и др. Без значение какви входни стойности имате, искате да изпълните същата логика на изпълнение.
Друга добра причина да се напишат параметризирани тестове е, че той не просто тества щастлив път, а също така тества пътя на грешките или отрицателните сценарии.
Пример: Да предположим, че има приложение, което връща дали дадено разширение на файла е валидно или не. Тестовете, управлявани от данни, могат бързо да позволят на разработчика да изпълнява тестове за поддържани файлови разширения и всякакви сценарии за грешки или отрицателни входни тестове.
Сега по традиция можете да мислите за писане или копиране на тестовете за множество входни стойности, но това не е правилният или интелигентен начин за постигане на този вид изпълнение на теста. Освен това, тъй като броят на тестовете започва да се увеличава във вашето приложение, тези тестове ще станат трудни за поддръжка.
Писане на параметризирани тестове със Spock
Блокът къде:
Блокът where в Spock тест е блокът, който съхранява данни за параметризирания тест. По избор може да съдържа както входни, така и очаквани изходни стойности. Важен момент, който трябва да се отбележи за този блок е, че това трябва да е последният блок в Spock тест.
Като каза това, той може да се комбинира с всички останали блокове, както е дадено, кога и тогава, но трябва да бъде последният блок.
Нека разгледаме един пример, за да го разберем по-добре
Ще използваме приложение за калкулатор, което взема 2 входни параметъра и връща сумата от предоставените входове. Ще напишем параметризиран тест, предоставящ множество входове и очаквани изходни стойности.
def 'sample parameterized test'() input2
В горния пример на кода можете да видите следното:
- Блок „къде“, който съдържа данните за провеждане на теста.
- „Къде“ е последният блок от теста.
- „Къде“ се комбинира с другите блокове, т.е. даден, кога и тогава.
- Представянето на данни е специален формат, наречен таблици с данни, който ще разгледаме подробно в следващите раздели на този урок.
- Заглавният ред от данни е по същество свойствата / входните променливи, които могат да бъдат директно използвани в теста. E.g. Обърнете се към изявлението в блока „кога“, където сме използвали директно вход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 комплекта входни данни, които се предоставят на тествания метод.
конвертирате char * в int c ++
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 с Spock !!
Препоръчително четене
- Писане на единични тестове със Spock Framework
- Спок интервю въпроси с отговори (Най-популярни)
- Spock за интеграция и функционални тестове със селен
- Спок подигравки и сбиване (Примери с видео уроци)
- Урок за Spock: Тестване със Spock и Groovy
- Управлявана от данни рамка в Selenium WebDriver, използваща Apache POI
- Как да извършите тестване на данни с помощта на инструмента TestComplete
- Как работи тестването, управлявано от данни (примери за QTP и селен)