4. prosince 2018

SoapUI - maily, databáze, knihovny a další…

V rámci výzkumu jsem dostal za úkol vyzkoušet možnosti SoapUI, týkající se posílání mailů a práce s databází. Už dopředu jsme tušili, že to půjde, takže hlavní úkol byl zjistit jak na to. Bylo mi řečeno, že by šlo použít jazyk Groovy, pro který má SoapUI podporu a Groovy skripty se dají používat jako jednotlivé kroky. Rozhodl jsem se tedy vydat touto cestou a v následujícím článku Vám o tom řeknu něco víc a i něco o tom,  jak použít Groovy skript jako obecnou knihovní funkci.


Měl jsem zadaný testovací scénář, na kterém to bylo potřeba vyzkoušet. Scénář provede následující operace:
1. Odešle mail na CCA hotline.
2. Zavolá službu na zpracování inboxu.
3. Zkontroluje, zda je zapsáno hlášení. V rámci tohoto kroku si uloží i jeho číslo a rok.
4. Založí komunikaci.
5. Zkontroluje, zda se komunikace založila.
6. Odešle odpověď.


Jak na odesílání mailů

Hned v prvním kroku mého testovacího scénáře jsem potřeboval odeslat mail na náš hotline. Využil jsem tedy jazyka Groovy, který je přinejmenším hodně podobný Javě. Udělal jsem nový test step SendMail, pod kterým byl schován skript ve kterém nebylo nic zázračného, klasické Java Mail API. Vytvořil jsem message, přidal do ní požadovaný text a přílohu, nastavil property (smtp host, port), vytvořil session a poslal mail.
Druhý krok byl pouze o poslání http requestu, který vyvolal zpracování inboxu.


Jak se podívat do DB

Po provedení předchozích kroků, se při zpracování inboxu zapsalo hlášení do naší DB. Potřebuji ale teď v SoapUI zkontrolovat, zda se to skutečně stalo. Opět jsem k tomu využil Groovy skript a postupoval stejně jako u Javy. Musel jsem ovšem přidat do SoapUI jdbc driver do složky \bin\ext. Po té už jsem se mohl do DB připojit:

1) Bylo třeba udělat init připojení pomocí těchto dvou příkazů:
     * GroovyUtils.registerJdbcDriver("oracle.jdbc.driver.OracleDriver");
     * Sql.newInstance("jdbc:oracle:thin:@${server }:${port}:${sid}", "${username}", "${password}", "oracle.jdbc.OracleDriver");

2) Provedení samotného dotazu pomocí: res = sql.rows(query)

3) Vrátila se mi kolekce, ze které už jsem si mohl vybrat co potřebuji.

Zajímalo mne především, jestli hlášení existuje. Takže jsem zkontroloval, zda je kolekce plná a uložil si tuto informaci do proměnné pomocí příkazu:
testRunner.testCase.setPropertyValue( "hlaseniExists" , "TRUE")

Pomocí tohoto příkazu se dá cokoliv z kódu předat do proměnné v SoapUI, například u test casu. Takže jsem si stejně uložil i číslo a rok hlášení.


Volání databázových procedur

V dalším kroku jsem potřeboval založit komunikaci. Znovu jsem využil Groovy skript. Na založení komunikace u nás existuje API a já ho jen potřeboval zavolat a předat mu číslo a rok hlášení, které jsem si předtím zjistil. Opět jsem tedy provedl init databáze a pak mi stačil pouze jeden příkaz.
sql.call("BEGIN zaloz_komunikaci( ${cisloHlaseni }, ${rokHlaseni}); END;")
Pomocí anonymního SQL bloku jsem zavolal proceduru a komunikaci založil. Parametry použité při volání procedury jsem si vytáhl z proměnných Soapka. Slouží k tomu příkaz: testRunner.testCase.getPropertyValue( "cisloHlaseni")
Uvedeny v ‘${}‘ jsou jen kvůli tomu, že jsou součástí řetězce a takto nemusím k sobě řetězce lepit.


Zjištění, zda byla založena komunikace aneb jak vytvořit knihovnu

U tohoto kroku jsem si řekl, že podobnou věc jsem už jednou dělal. O pár kroků výše, kde jsem zjišťoval, zda bylo založeno hlášení. Trošku jsem zapátral, jestli by se dala vytvořit nějaká knihovna, ve které by byly utility pro práci s DB. Napřed se zdálo, že tato možnost je jen v placené verzi SoapUI, ale později jsem dohledal způsob který existuje. Udělal jsem nový test suite s názvem Library do kterého jsem vložil test case s názvem DBUtils a test step což už byla moje třída. Musel jsem proto vzít svůj skript pro kontrolu hlášení a trochu ho upravit.

1) Skript, který měl pouze „metodu“ jsem proměnil na Class, do které jsem metodu zabalil.

2) Metodě jsem přidal parametry takto: def doQuery(server, password, sid, username, port, query).

3) Upravil jsem vnitřek metody, aby se používaly místo lokálních proměnných parametry.

4) Vytvořil jsem context třídy: context.setProperty( "checker", new DBChecker()).


S vytvořeným contextem už jsem pak mohl pomocí pár příkazů svoji metodu volat i z jiného skriptu:

1) Vytvoření reference test suitu:
library = testRunner.testCase.testSuite.project.testSuites["Library"]

2) Nalezení metody, kterou chci volat přes referenci:
module = library.testCases["DBUtils"].testSteps["DBChecker"]

3) Inicializace knihovny, díky čemuž se vytvoří instance třídy:
module.run(testRunner, context)

4) Získání instance z contextu:
def checker = context.checker

5) Nyní už mohu zavolat svoji parametrizovanou metodu:
checker.checkKom(par1, par2…)

V posledním kroku, jsem potřeboval poslat další mail, tak jsem vytvořil knihovní proceduru i pro tento případ. Knihovna se dá takto použít v rámci jednoho projektu.


Závěrem

Ve výsledku nebyl velký problém dosáhnout všeho, co bylo v zadání. Většinu času zabralo zkoumání, jak na to. Samotné psaní kódu nebylo tak časově náročné. Posílání mailů přes Java Mail API je jistě všem javistům známé a v Groovy je to to samé. S databází to bylo těžší jen o shánění driveru, později ale bylo vše opět velmi jednoduché. Největší výzva byla založení knihovny, free verze Soapka toto totiž nepodporuje, takže jsem si musel poradit jinak. Co jsem koukal na různé zdroje, jak to funguje v placené verzi, tak jediný rozdíl je v tom, že se musí pracovat s kontextem, abychom potřebné metody mohli najít a zavolat.


Autor článku: Michal Průša

Žádné komentáře:

Okomentovat