Kuidas automatiseerida veebiteenuse testimist üle SOAP protokolli

Proeksperdi plaan on testide laialdane automatiseerimine. Esimeseks katsetuseks sai telekommunikatsiooni projekt, kus iseteeninduse veebileht suhtleb teenuste serveriga ja infovahetus toimub vana hea SOAP protokolli abil. Regressiooni käigus tuleb testida, kas teenused käituvad õigesti ja seda saab teha käsitsi iseteeninduse lehte kasutades. Lühidalt öeldes: serverile on vaja saata HTTP päringuid ja veenduda, et tagasi tuleva paketi sees on õige info. Säherdune ülesanne tundub jõukohane just arvutile meie eest ära teha.

SOAP – Simple Object Access Protocol on tuntud asi, aga kohe kuulsin lisaks, et nii “lihtne” see ka ei ole. SOAPiga käib kaasas WSDL (Web Services Description Language) kirjeldus, mis on antud teenuse kirjeldus veebilehel. Sellest saab teada, mis funktsioone teenuselt kutsuda saab, mis argumente tahetakse, milline objekt tagastatakse ja mida objektid sisaldavad. Õnneks on asi nii standardne, et on olemas erinevates keeltes library’d, mis funktsioonide ja klasside genereerimise automaatselt ära teevad, ega ole vaja ise WSDLi dešifreerida. Tulemuseks on PROXY, mis võimaldab funktsioonide näol veebiserverile päringuid saata ja mingeid XMLi ega HTTP päringuid pole üldse vaja näppida.

1. päev – PERL

Automatiseerimise üks eesmärk on asjad võimalikult lihtsana hoida. Kuna olin sellega veidi kokku puutunud, sai esimeseks valikuks PERL. Otsimise peale selgus, et on kaks pakki: SOAP:Lite ja SOAP:WSDL, mis mõlemad oskavad WSDLi lehelt teenuse selgeks õppida, seejuures teine genereerib reaalselt klassifailid ka valmis. Esimesed probleemid tekkisid nende pakkide paigaldamise ajal Windows keskkonnas.

– ehkki gcc oli paigaldatud.

Pärast paaritunnist häkkimist sai otsustatud, et Windows pakk võib katki olla ja viimaks suure punnitamisega saime asja tööle virtuaalmasinas Ubuntu all. SOAPi näiteteenus hakkas tööle ja tuju läks paremaks. Päeva esimese edu eest andis Lego (meie staažikast mentor-programmeerija) mulle ühe õlle. Kahjuks jäi rõõm üürikeseks, sest kõik näited veebis olid sellised, kus argumendiks oli kas string või integer, aga meil oli vaja argumendiks objekt anda. Takistavaid asjaolusid oli veel: autocomplete’i PERLis ei ole, veateated olid üsna kasutud ja eelnevat SOAPi kogemust mul ei olnud. Sellele lisaks oli objekti kirjeldus parajalt keeruline/segane ja nõnda ei suutnudki päeva jooksul välja mõelda, kuidas täpselt seda neetud objekti koostada.

2. päev – Python ja C#

Uus päev, uus keel. Võtsin kõige uuema versiooni Pythonist (3.2). Kiiresti avastasin, et nii uut versiooni et toeta mitte miski. Seepeale paigaldasin versiooni 2.4 ja paki SOAPpy 0.12. Viimane pakk vajas töötamiseks veel kolme pakki, mis tuli käsitsi veebist üles otsida ja peale panna. Pärast pikka ja valulikku installeerimist hakkas asi lõpuks tööle ja veateated olid sootuks etemad kui PERLis. Eriti täpseks läksid veateated siis, kui andsin kaasa nimeruumi aadressi.

DHCPServ = SOAPProxy(url, namespace)

Komistuskiviks sai jällegi objekti koostamine. Loogika ütles, et asi on võimalik ja nimeruumis on vajalike klasside definitsioonid olemas. Aga tööle ei hakanud. Lõpuks lugesin kuskilt, et objektide saatmine ei olegi eriti hästi toetatud, mis oli viimane piisk minu kannatusele.

Oli aeg võtta välja suured relvad. Visual Studio 2010 Express peale, keeleks C#. Menüüst: Project -> Add Service Reference. Sinna lisada WSDL kirjelduse aadress ja Go!

OK – ja klassid on olemas. Autocomplete hakkab neid kohe arvestama ja testi kirjutamine on lihtsalt lust ja lillepidu. Uutele objektidele pakutakse automaatselt property-d ja meetodid, nagu ikka. Ainuke kood, mida ise peab kirjutama on objekti loomised ja funktsiooni kutsed:

NumberPoolServiceClient numberPoolService = new NumberPoolServiceClient();
getNumbersFromPool get_nums = new getNumbersFromPool();
getNumbersFromPoolResponse num_result = new getNumbersFromPoolResponse();

get_nums.NumberPoolQuery.numberCount = NR;
get_nums.NumberPoolQuery.channelCode = "APPCODE";

 

num_result = numberPoolService.getNumbersFromPool(get_nums);

Lisaks mõni test ka:

testcase.checkIfLenghtOfNumbersIsCorrect(num_result, 12);

Poole tunniga sai esimene test automatiseeritud.

Lõppsõna

Kui eesmärk on Linuxi masinasse testimine panna, tasub tehnoloogia vallas ka Java-s kirjutamist kaaluda, et ta näiteks iga deploy järel automaatselt kõik testid läbi jooksutaks. Tegelikult saab ka .NETi programmi Linuxi all käima, aga siis on vaja paigaldada MonoCross platform, open source .NET development framework.

Üldiselt proovisin automatiseerida nii hea kui halvaga, isegi PERLi ja PYTHONiga, aga miski ei suutnud SOAPist jagu saada. Skriptimiskeeltes on SOAPi päringule objektide kaasa andmine kindlasti võimalik, aga kui selleks kulub rohkem kui üks päev, tundub see ebapraktiline. Seega, kui SOAPiga „sina peal“ ei ole, soovitan sarnastel puhkudel kasutada Visual Studiot ja C#, millega saab lihtsalt ja kiiresti (teste) kirjutada.

2 thoughts on “Kuidas automatiseerida veebiteenuse testimist üle SOAP protokolli”

Leave a Reply

Your email address will not be published. Required fields are marked *