writing unit tests with spock framework
Psaní testů jednotek pomocí Spock Framework: Testování svítidel, tvrzení a hlášení
V tomhle Kompletní průvodce pro začátečníky na Spocku , krátký Úvod do Spock Framework a Groovy programování byl uveden v našem předchozím tutoriálu.
V tomto kurzu projdeme všemi podrobnostmi / kroky potřebnými k zahájení Testování jednotky ve Spocku.
Kvůli jednoduchosti otestujeme jednoduchou aplikaci Kalkulačka, která má různé metody, jako je sčítání, odčítání, násobení, dělení atd., Které všechny přijímají celočíselné parametry a vracejí celočíselný výstup.
Co se naučíte:
jaký je nejlepší diktovací software
- Testování jednotek s výukovým programem Spock Video
- Začínáme
- „Def“ klíčové slovo
- Životní cyklus specifikace Spock
- Spockova tvrzení
- Hlášení
- Závěr
- Doporučené čtení
Testování jednotek s výukovým programem Spock Video
Začínáme
Podobně jako u jiných rámců pro testování jednotek lze také Spock použít k psaní scénářů / testovacích případů pro testovanou aplikaci. Pokusíme se porovnat a porovnat různé funkce rámce Spock s existujícími / známými rámci jako JUnit .
„Def“ klíčové slovo
Nejprve se pokusíme stručně pochopit klíčové slovo „def“ Groovy. Klíčové slovo def se používá k definování typu-def a lze jej použít k deklaraci funkce i pole / proměnné.
„Def“ se obvykle používá, když nechceme omezit typ pole nebo vrátit typ metody. Podívejme se na několik příkladů klíčového slova def ve třídě groovy a všech jejích platných zvyklostech.
// 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 }
Životní cyklus specifikace Spock
Spock spec při spuštění vyhledá všechny definované testy a provede je jeden po druhém. Existuje však několik dalších funkcí / funkcí, které poskytuje Spock, aby byly testy méně redundantní a čitelnější.
Níže probereme některé funkce:
Definování vstupů / proměnných jako součásti Spec
Zvažte několik testů, které všechny používají stejné vstupní hodnoty. Jedním ze způsobů by bylo inicializovat vstupní hodnoty v každém testu jednotlivě, jinak můžeme přímo definovat pole na úrovni spec a zajistit, aby před každým testem byla pole inicializována a k dispozici pro prováděný test.
Podívejme se na příklad pro naši třídu aplikací kalkulačky .
Definujeme vstupní data na úrovni spec, aby byla k dispozici s počátečními hodnotami pro všechny testy přítomné ve specifikaci.
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 } }
V této ukázce kódu můžete vidět, že jsme definovali vstup1, vstup2, testovanou aplikaci a výsledek na úrovni spec. Tím je zajištěno, že pokaždé, když je spuštěn test ze souborů spec, a inicializovaná pole jsou předána tomuto testu. To skutečně eliminuje potřebu pokaždé nastavovat testy se vstupními hodnotami.
Testovací přípravky
Podobně jako většina rámců testování jednotek nabízí Spock také metody nastavení a čištění pro provádění speciální logiky / úkolů při konkrétních událostech životního cyklu provádění testu.
setupSpec & cleanupSpec
Tyto metody jsou volány jednou pro každé provedení Spec a jsou volány před a po provedení testu. Jsou srovnatelné s @ Před hodinou a @ Po hodině anotace JUnit.
nastavení a vyčištění
Tyto metody jsou volány před a po provedení každého testu ve specifikaci.
Tyto háčky jsou tím správným místem pro jakoukoli logiku / část kódu, kterou chcete provést před a po provedení testu. Například „Při vyčištění můžete napsat kód k uzavření připojení k databázi (pokud existuje), které bylo použito během testu.
Ty lze porovnat s @ BeforeTest a @ AfterTest anotace v JUnit.
Podívejme se na příklad těchto svítidel v našem testu aplikace kalkulačky.
def setupSpec() { println('###in setup spec!') } def cleanupSpec() { println('###in cleanup spec!') } def setup() { println('>>>in test setup!') } def cleanup() { println('>>>in test cleanup!') }
Pokud je výše uvedený testovací přípravek přidán do specifikace obsahující 4 testy, bude výstup vypadat takto:
###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!
Spockova tvrzení
Tvrzení ve Spocku se nazývají power assert (a byl přijat Groovy později poté, co byl představen Spockem). Spockova tvrzení poskytují mnoho diagnostických výjimek v případě jakýchkoli selhání prosazení.
Jeden může snadno zjistit, co se pokazilo, pouhým pohledem na diagnostiku selhání na rozdíl od podrobného AssertionErrors v JUnit a dalších rámcích.
Zkusme to pochopit pomocí příkladu a porovnejme to s JUnit
Budeme pracovat s jednoduchým testem, který zkontroluje rovnost řetězců a uvidí, jaké diagnostiky se generují v případě selhání tvrzení.
Spockův test
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 }
JUnit Test
@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); }
Spock výstup
Condition not satisfied: str1 == str2 | | | hello| hello world false 6 differences (45% similarity) hello(------) hello( world) Expected :hello world Actual :hello
Výstup JUnit
org.junit.ComparisonFailure: Expected :hello Actual :hello world
Jak můžete odvodit shora, diagnostické informace poskytované společností Spock mají lepší podrobnosti a jsou uživatelsky přívětivější ve srovnání s ostatními rámci, jako je JUnit.
Tipy a triky k uplatnění
Vkládání více prvků najednou - Spock poskytuje různé zkratky pro tvrzení a jednou takovou je „*“ notace, která umožňuje uplatnění prvků v seznamu.
Rozumíme tomu na příkladu:
Zvažte třídu CityInfo, která má jako pole cityName a populaci. Napíšeme Spockův test, abychom prosadili názvy měst, která jsou v daném seznamu.
public class CityInfo { public CityInfo(String cityName, int population) { this.cityName = cityName; this.population = population; } public String cityName; public int population; }
Podívejme se nyní na test:
jak převést znak na řetězec c ++
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') }
Jak je ukázáno ve zkratce tvrzení výše, můžete ověřit celý seznam pomocí klíčového slova „*“.
Podívejme se také, jak by vypadalo selhání. Z výše uvedeného tvrzení odstraním název kteréhokoli města.
Condition not satisfied: cityList*.cityName == ('Delhi', 'Chennai') | | | | | false | (Mumbai, Delhi, Chennai) (app.CityInfo@31368b99, app.CityInfo@1725dc0f, app.CityInfo@3911c2a7)
Uvidíte, že diagnostické informace o selhání tvrzení jsou bohaté a snadno srozumitelné.
Využití parametru uzavření - every ().
Podívejme se, jak můžeme využít uzavírací parametr s názvem every () a přidat tak tvrzení pro každý prvek seznamu nebo kolekce. Ve stejném příkladu zkusme přidat tvrzení, které ověří počet obyvatel každého města, pokud je daný vstup> 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 } }
Uplatňování vyvolávaných výjimek
Lze tvrdit, že jsou výjimky vyvolány v bloku „then“ (což znamená, když je blok také vyžadován). Podrobnosti o výjimce lze diagnostikovat přiřazením vyvolané výjimky k poli a uplatněním požadovaných vlastností vyvolané výjimky.
Pojďme použít stejnou třídu CityInfo a definovat metodu, která vyvolá výjimku, a napsat pro ni test.
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'); } }
Podívejme se nyní na test:
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' }
Hlášení
Aby bylo možné generovat krásné a podrobné sestavy založené na HTML, jsou k dispozici knihovny, které lze přidat do souboru sestavení a nyní, kdykoli se testy provedou během sestavení (nebo přímým provedením), se v výstupní složka.
Chcete-li získat vygenerované protokoly o zkouškách, přidejte následující knihovny do souboru build.gradle (a podobně i pro soubor Maven pom.xml).
testCompile 'com.athaydes:spock-reports:1.6.1' testCompile 'org.slf4j:slf4j-api:1.7.13' testCompile 'org.slf4j:slf4j-simple:1.7.13'
Nyní vytvořte projekt a proveďte testy spuštěním všech testů ve složce „test“ nebo provedením „ gradle čistý test “.
Můžete otevřít index.html soubor a získáte souhrnnou zprávu o všech specifikacích Spocku, které byly k dispozici k provedení.
Chcete-li zobrazit podrobnou zprávu pro konkrétní specifikaci, klikněte na specifikaci z výše uvedeného seznamu a uvidíte podrobnou zprávu o selháních i úspěších.
Závěr
V tomto kurzu jsme probrali základy testování jednotek pomocí Spock Framework. Viděli jsme různé způsoby a zkratky pro psaní tvrzení a druh bohatých diagnostických informací generovaných Spock frameworkem pro selhání tvrzení.
Podívali jsme se také na to, jak bychom mohli vygenerovat tiché pěkné zprávy založené na HTML pro testy Spock, které obsahují stejnou podrobnou diagnostiku pro provedené testy.
Náš nadcházející výukový program vás podrobně informuje o psaní parametrizovaných testů se Spockem !!
Výukový program PREV | DALŠÍ výuka
Doporučené čtení
- Testování na základě dat nebo parametrizace pomocí Spock Framework
- Spock Interview Otázky s odpověďmi (nejoblíbenější)
- Spock pro integraci a funkční testování se selenem
- Spock Mocking and Stubbing (Příklady s videonávody)
- Výukový program Spock: Testování pomocí Spocka a Groovyho
- Výukový program Mockito: Rámec Mockito pro zesměšňování při testování jednotek
- Rozdíly mezi testováním jednotek, testováním integrace a funkčním testováním
- Klíč k úspěšnému testování jednotky - Jak vývojáři testují svůj vlastní kód?