writing unit tests with spock framework
Писање јединствених тестова са Споцк Фрамеворк-ом: Испитивања, тврдње и извештавање
У ово Комплетан водич за почетнике на Споцк-у , кратак Увод у Споцк Фрамеворк и Гроови програмирање је дато у нашем претходном водичу.
У овом упутству ћемо проћи кроз све детаље / кораке потребне за почетак Јединствено тестирање у Споцку.
Ради једноставности тестираћемо једноставну апликацију Калкулатор која има различите методе као што су сабирање, одузимање, множење, дељење итд., Које све прихватају целобројне параметре и враћају целобројни излаз.
шта је описно програмирање у ктп-у
Шта ћете научити:
- Јединствено тестирање са Споцк видео упутством
- Почетак
- „Деф“ кључна реч
- Животни циклус Споцк спецификације
- Споцк Ассертионс
- Извештавање
- Закључак
- Препоручено читање
Јединствено тестирање са Споцк видео упутством
Почетак
Слично било којем другом оквиру за тестирање јединице, и Споцк се може користити за писање сценарија / тест случајева за апликацију која се тестира. Покушаћемо да упоредимо и упоредимо различите карактеристике Споцк оквира са постојећим / познатим оквирима попут ЈУнит .
„Деф“ кључна реч
Покушајмо прво да укратко разумемо Гроови-јеву „деф“ кључну реч. Кључна реч деф користи се за дефинисање типе-деф и може се користити за декларисање функције као и поља / променљиве.
„Деф“ се обично користи када не желимо да ограничимо тип поља или повратни тип методе. Погледајмо неке примере кључне речи деф у гроови класи и све њене важеће употребе.
// def as variable types def inputNum = 100 def inputStr = 'hello world!!' def app = new CalculatorApp() // def as return type of function def 'test function'() { // function body here }
Животни циклус Споцк спецификације
Споцк спец када се изврши тражи све дефинисане тестове и извршава их један по један. Међутим, постоји неколико других функционалности / карактеристика које нуди Споцк како би тестови били мање сувишни и читљивији.
Размотримо неке карактеристике у наставку:
Дефинисање улаза / променљивих као дела спецификације
Размислите о томе да имате више тестова који сви користе исте улазне вредности. Један од начина био би иницијализација улазних вредности у сваком тесту појединачно, иначе можемо директно дефинисати поља на нивоу спецификација и осигурати да ће поља пре сваког теста бити иницијализована и доступна тесту који се извршава.
Погледајмо Пример за нашу класу апликације за калкулатор .
Улазне податке ћемо дефинисати на нивоу спецификација тако да буду доступни са почетним вредностима свим тестовима који су присутни у спецификацији.
class CalculatorAppSpec extends Specification { def input1 = 50 def input2 = 10 def result = 0 def app = new CalculatorApp() def 'addition with valid inputs return expected result'() { when: result = app.add(input1, input2) then: result == 60 } def 'multiplication with valid inputs return expected result'() { when: result = app.multiply(input1, input2) then: result == 500 } def 'division with valid inputs return expected result'() { when: result = app.divide(input1, input2) then: result == 5 } def 'subsctraction with valid inputs return expected result'() { when: result = app.substract(input1, input2) then: result == 40 } }
У овом узорку кода можете видети да смо дефинисали инпут1, инпут2, апликацију која се тестира и резултат на нивоу спецификација. Ово осигурава да се сваки пут када се тест покрене из датотека са спецификацијама, а иницијализована поља проследе том тесту. Ово заиста елиминише потребу за постављањем тестова сваки пут са улазним вредностима.
Тест Фиктурес
Слично већини оквира за јединствено тестирање, Споцк такође нуди методе подешавања и чишћења за извршавање посебне логике / задатака у одређеним догађајима животног циклуса извршења теста.
сетупСпец & цлеанупСпец
Ове методе се позивају једном за свако извршавање Спец-а и позивају се пре и после извршавања теста. Они су упоредиви са @ Пре наставе и @ После часа напомене ЈУнит-а.
подешавање и чишћење
Ове методе се позивају пре и после извршавања сваког теста у спецификацији.
Ове куке су право место за било коју логику / део кода који желите да извршите пре и после извршавања теста. На пример , У чишћењу можете написати код за затварање везе са базом података (ако постоји) која је коришћена током теста.
Они се могу упоредити са @ БефореТест и @ АфтерТест напомене у ЈУнит-у.
Погледајмо Пример ових чвора у нашем тесту апликације за калкулатор.
def setupSpec() { println('###in setup spec!') } def cleanupSpec() { println('###in cleanup spec!') } def setup() { println('>>>in test setup!') } def cleanup() { println('>>>in test cleanup!') }
Ако се горњи код учвршћивача за тестирање дода спецификацији која садржи 4 теста, тада ће излаз бити као у наставку:
како да пронађем мрежни безбедносни кључ на свом рачунару
###in setup spec! >>>in test setup! >>>in test cleanup! >>>in test setup! >>>in test cleanup! >>>in test setup! >>>in test cleanup! >>>in test setup! >>>in test cleanup! ###in cleanup spec!
Споцк Ассертионс
Тврдње у Споцк-у називају се потврђивањем моћи (а Гроови га је усвојио касније након што га је Споцк представио). Спокове тврдње пружају пуно дијагностичких изузетака у случају било каквих неуспеха у тврдњи.
Једноставно се може сазнати шта је пошло по злу једноставним гледањем дијагностике квара, за разлику од опширног АссертионЕррорс у ЈУнит-у и другим оквирима.
Покушајмо ово да разумемо на примеру и упоредимо са ЈУнит
Радићемо са једноставним тестом који проверава да ли постоји једнакост низова и видећемо која се дијагностика генерише у случају неуспеха тврдње.
Споцк Тест
def 'check case-insensitive equality of 2 strings'() { given: 'two input strings' String str1 = 'hello' String str2 = 'HELLO world' when: 'strings are lowercased' str1 = str1.toLowerCase() str2 = str2.toLowerCase() then: 'equal strings should return success' str1 == str2 }
ЈУнит тест
@Test public void compareStrings_withValidInput_shouldReturnSuccess() { // Arrange String str1 = 'hello'; String str2 = 'HELLO world'; // Act str1 = str1.toLowerCase(); str2 = str2.toLowerCase(); // Assert Assert.assertEquals(str1,str2); }
Споцк Оутпут
Condition not satisfied: str1 == str2 | | | hello| hello world false 6 differences (45% similarity) hello(------) hello( world) Expected :hello world Actual :hello
ЈУнит Оутпут
org.junit.ComparisonFailure: Expected :hello Actual :hello world
Као што можете да закључите одозго, дијагностичке информације које пружа Споцк имају боље детаље и једноставније су за употребу у поређењу са другим оквирима као што је ЈУнит.
Савети и трикови за тврдње
Утврђивање више елемената одједном - Споцк пружа разне скраћенице за тврдње, а једна од њих је ознака „*“ која омогућава потврђивање елемената на листи.
Да разумемо ово на примеру:
Узмите у обзир класу ЦитиИнфо која као поља има Име града и становништво. Написаћемо Споков тест како бисмо утврдили имена градова који се налазе на датој листи.
public class CityInfo { public CityInfo(String cityName, int population) { this.cityName = cityName; this.population = population; } public String cityName; public int population; }
Погледајмо сада тест:
def 'Assert multiple elements of list' () { given: def cityList = new LinkedList() cityList.add(new CityInfo('Mumbai', 120)) cityList.add(new CityInfo('Delhi', 80)) cityList.add(new CityInfo('Chennai', 100)) expect: cityList*.cityName == ('Mumbai', 'Delhi', 'Chennai') }
Као што је приказано у горе наведеном стенографском тексту, можете потврдити целу листу уз помоћ кључне речи „*“.
Да видимо и како би изгледао неуспех. Уклонићу име било ког града из горње тврдње.
Condition not satisfied: cityList*.cityName == ('Delhi', 'Chennai') | | | | | false | (Mumbai, Delhi, Chennai) (app.CityInfo@31368b99, app.CityInfo@1725dc0f, app.CityInfo@3911c2a7)
Можете видети да су дијагностичке информације о неуспеху тврдње богате и лако разумљиве.
Употреба параметра затварања - сваки ().
Погледајмо како можемо искористити параметар затварања именован сваки () да бисмо додали тврдњу за сваки елемент листе или колекције. У истом примеру, покушајмо да додамо тврдњу која потврђује становништво сваког града ако је дати унос> 50.
def 'Assert multiple elements of list' () { given: def cityList = new LinkedList() cityList.add(new CityInfo('Mumbai', 120)) cityList.add(new CityInfo('Delhi', 80)) cityList.add(new CityInfo('Chennai', 100)) expect: cityList*.cityName == ('Mumbai', 'Delhi', 'Chennai') and: cityList.population.every() { it > 50 } }
Утврђивање избачених изузетака
Изузеци се могу тврдити да се бацају у блок „тада“ (што значи да када је блок такође потребан). Детаљи изузетка могу се дијагностиковати додељивањем баченог изузетка пољу и утврђивањем потребних својстава баченог изузетка.
Користимо исту класу ЦитиИнфо и дефинишемо методу која доноси изузетак и напишимо тест за њу.
public class CityInfo { public CityInfo(String cityName, int population) { this.cityName = cityName; this.population = population; } public String cityName; public int population; public CityInfo() { } public int getCleanlinessScore() { throw new RuntimeException('method not implemented'); } }
Погледајмо сада тест:
def 'cleanliness score throws runtime exception with message - method not implemented'() { given: CityInfo app = new CityInfo(); when: app.cleanlinessScore() then: def e = thrown(RuntimeException) e.message == 'method not implemented' }
Извештавање
Да би се генерисали прелепи и детаљни ХТМЛ извештаји, на располагању су библиотеке које се могу додати у датотеку израде и сада кад год се тестови изврше током градње (или директним извршавањем), детаљни извештај заснован на ХТМЛ-у биће генерисан у излаз фолдера.
Да бисте генерисали извештаје о тестирању, додајте следеће библиотеке у датотеку буилд.градле (а слично и у датотеку Мавен пом.кмл).
testCompile 'com.athaydes:spock-reports:1.6.1' testCompile 'org.slf4j:slf4j-api:1.7.13' testCompile 'org.slf4j:slf4j-simple:1.7.13'
Сада изградите пројекат и извршите тестове покретањем свих тестова у директоријуму „тест“ или извршавањем „ тест чист градле ”.
Можете отворити индек.хтмл датотеку да бисте добили резимирани извештај за све Споцкове спецификације које су биле доступне за извршење.
ворлд оф варцрафт приватни сервер ванила
Ако желите да видите детаљан извештај за одређену спецификацију, кликните на спецификацију са горње листе и моћи ћете да видите детаљан извештај о неуспесима као и о успесима.
Закључак
У овом водичу покрили смо основе Унит тестирања помоћу Споцк Фрамеворк-а. Видели смо различите начине и скраћенице за писање тврдњи и врсте богатих дијагностичких информација које генерише Споков оквир за грешке у тврдњама.
Такође смо размотрили како бисмо могли да генеришемо тихе прилично лепе ХТМЛ извештаје за Споцк тестове који укључују исту детаљну дијагностику за извршене тестове.
Наш предстојећи водич ће вас детаљно упознати са писањем параметарских тестова са Споцком !!
ПРЕВ Туториал |. | СЛЕДЕЋА Лекција
Препоручено читање
- Тестирање на основу података или параметризовано са Споцк Фрамеворк-ом
- Споцк интервју питања са одговорима (најпопуларније)
- Споцк за интеграцију и функционална испитивања са селеном
- Споцк ругање и стубирање (примери са видео водичима)
- Водич за Споцк: Тестирање са Споцком и Гроовием
- Водич за Моцкито: Моцкито оквир за ругање у јединственом тестирању
- Разлике између јединственог тестирања, интеграционог тестирања и функционалног тестирања
- Кључ успешног јединственог тестирања - како програмери тестирају сопствени код?