Veel tankiga seenel käimisest

Tegelikult ajendas mind kirjutama Valdo postitus SOAPi testide automatiseerimisest. Ma ei tea kuidas teile teistele tundub, aga minule jätab Visual Studio SOAPi testide jaoks küll ebaproportsionaalse mulje. Kõik see GUI ja proxide genereerimise wizardid ja noh peamiselt siiski – Windows only vahend – ei kõla nagu veebi testimiseks mõstlik. Aga eks ole Youtubest nähtud kuidas tankiga seenel ka käiakse või õlle jahutamiseks reaktiivmootor ehitatakse.

Jutt keerukusest kõlas intrigeeriv. Mõtlesin, et prooviks siis ise ka. Ütlen ausalt, ei olnud ka minul varasemat kogemust selles vallas. Aga et mitte igavalt Valdoga samasse auku astuda valisin keeleks Ruby.

Ruby install on kõigis enamkasutatavates keskkondades (mida mina kasutanud olen) sirgejooneline. Installerid on olemas või on Ruby opsüsteemi vaikimisi ära installitud. Pole vaja midagi “internetist otsida” ja mööda foorumeid aurata. Hilisem librade install käib sisse ehitatud package manageriga imelihtsalt.

Väikse googeldamise peale selgus, et Ruby jaoks on olemas vähemalt 3 SOAPi librat. Mina leidsin sellised: soap4r, HandSoap ja Savon. Proovisin esimesena soap4r-i. Mingit head tutoriali või vähe keerulisema päringu näitelehekülge ma 10 minuti googeldamise peale ei leidnud. Projekti lehekülg, mida paljud kohad viitasid oli maha võetud aga päringu sain sellegi poolest tehtud:

require 'rubygems'
require 'soap/wsdlDriver'
 
#Connections
wsdl_url = 'http://test-server/NumberPoolService?wsdl'
proxy    = SOAP::WSDLDriverFactory.new(wsdl_url).create_rpc_driver
 
query = {:NumberPoolQuery => {:channelCode => 'APPCODE', :numberCount => 2} } 
 
response = proxy.getNumbersFromPool(query)

Tuleb tunnistada, et response objektist andmete lugemine pole soap4r-iga just nii mugav nagu ma oodanud oleks aga natuke RDoc-i ja selline ta siis tuli:

response['PoolNumbers']['numbers']['number'].each do |ele|
puts ele
end

Sellele nüüd veel ruby standardlibras oleva Test::Unit-i wrapper ümber ja korras. Aega kulus koos googeldamisega umbes 45 minutit. Aga midagi jäi ikkagi kripeldama – response objekti puisus. Kindlasti oleks saanud ka mingil moel elegantsemalt seda teha aga ausaltöeldes ei jaksanud ma kõike seda 100 klassi sealt suht tühjast RDoc-ist läbi vaadata. Kuskilt foorumist hakkas ka silma arvamus, et soap4r on nagu Ruby maailma EJB – bloat. Ei tahtnud uskuda, et tõsti pole mugavamat võimalust.

gem install savon

Savon-il on väga hästi kirjutatud tutoriali lehekülg. Ei hakka seda siinkohal ümber kirjutama. Tutoriali abiga kirjutasin umbes järgneva 10-15 mintsaga midagi järgmist:

require 'rubygems'
require 'savon'
require 'pp'
 
Savon.configure do |config|
	config.log = false
end
HTTPI.log = false
 
client = Savon.client('http://test-server/NumberPoolService?wsdl')
response = client.request :get_numbers_from_pool do 
soap.body = { 'NumberPoolQuery' => {:channel_code => 'APPCODE', :number_count => 2} }
end
 
pp response.to_hash

Savoni response hashmapina on ikka üksjagu elegantsem. Kui teste oleks vaja kirjutada valiksin neist kahest kindlasti Savoni.

Kokkuvõtlikult. Minu kogemusel on Rubyga SOAPi päringute tegemine äärmiselt lihtne ning hakkama saab minimaalse koodikirjutamisega. Päringu saab passida SOAPi XMLi struktuuri loogiliselt jäljendava hashmapiga ja vähemalt Savoni puhul saab ka response sarnasel kujul tagasi. Kindlasti eelistaksin SOAPi automaattestide kirjutamisel Rubyt Microsofti Visual Studiole.

Oma võlu on ka reaktiivmootoriga õllejahutaja ehitamises.

Leave a Reply

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