SoapUI jako narzędzie skryptowe

W poprzednim wpisie utworzyliśmy serwis wykorzystujący protokół SOAP, dzisiaj przeanalizujemy przykład z codziennej pracy programisty.


 
 
 
 
 
 
 
 

Podstawowe wykorzystanie soapUI

Głównym narzędziem którym będziemy posługiwać się w tym wpisie jest SoapUI, w większości przypadków programiści korzystają z jego podstawowej funkcji czyli odpytywaniu serwisu wykorzystującego protokół SOAP, przykładowy serwis tworzyliśmy tutaj. W porównaniu do poprzedniego wpisu dodałem do naszego serwisu web metodę do rejestracji jakiegoś itemu. W praktyce po wywołaniu metody registerItem serwis zwraca jakiś id wygenerowany losowo.

Na początek instalujemy program.

Następnie otwieramy soap’a i tworzymy nowy projekt SOAP. Musimy podać ścieżkę do wsdl’a. Uruchamiamy instancje naszego serwisu i dodajemy na końcu ?WSDL.

http://localhost:8080/itemService/ItemService?WSDL

Klikamy ok i mamy zaimportowany projekt który umożliwi odpytanie serwisu.

Teraz możemy przetestować działanie web metod checkItem oraz registerItem tak jak na powyższym screenie. To tyle najbardziej podstawowe wykorzystanie opisywanego narzędzia – w 90% przypadków właśnie tak jest wykorzystywany soapUI.

Teraz wyobraźmy sobie taki przykład. Mamy jakąś aplikację która rejestruje dokumenty w jakimś SOAP serwisie a następnie w odpowiedzi dostaje jakiś numer id który zapisuje u siebie w bazie i BUUMMMM coś się wywaliło w naszej aplikacji i wszystkie rejestracje jakie miały się wykonać nie powiodły się:(

Co tu zrobić??? ano można spróbować wykorzystać soapUI’a aby uzupełnić za pomocą skryptu nie zarejestrowane dokumenty. Do dzieła:)

Tabela Items która posłuży nam jako przykład:

Skrypty w soapie

SoapUI jest wykorzystywany do tworzenia testów integracyjnych różnego typu serwisów, opiera się o tworzenie kolejnych króków w zbiorze testów. Możemy wykorzystać to do utworzenia skryptu który pobierze wartości z bazy danych gdzie id dokumentu nie jest uzupełnione, zarejestruje przedmiot w zewnętrznym systemie i zaktualizuje naszą bazę danych o id zarejestrowanego przedmiotu. Jak mogłeś zauważyć na poprzednim screenie miałem dodatkowe wartości w drzewie projektu. Na początek tworzymy zestaw testów.

itemService > prawy przycisk > new test suite > prawy przycsik > new test case

Teraz do naszego zaestawu dodajemy kolejne kroki. Dodamy od razu trzy testy które tworzyć bedą nasz skrypt:

  • JDBC Request – tutaj sprawdzamy połączenie z bazą danych.
  • SOAP Request > tutaj wybieramy krok registerItem – za pomocą tego kroku będziemy wysyłać request do zewnętrznego serwisu.
  • Groovy Script – tutaj będzie cała logika naszego skryptu.
  • Definiowanie zmiennych

    Dobrze. Podstawowe elementy skryptu mamy zdefiniowane. Prawidłowo napisany skrypt charakteryzuje się tym, iż jest łatwo parametryzowany, aby mógł być odpalany dla różnych środowisk.

    W soapie możemy definiować zmienne na poziomie np propertisów które wykorzystać możemy w każdym kroku naszego testu. Zdefiniujmy nasze zmienne na poziomie elementu TestSuite.

  • CONNECTION_STRING_DATABASE – string connection do bazy items.
  • DATABASE_DRIVER – sterownik JDBC do postgresql’a.
  • SERVER_ADRESS – adres serwera w którym rejestrujemy przedmioty.
  • JDBC Request

    Dobrze. Przejdźmy do pierwszego kroku naszego zestawu testów czyli JDBC Request. Aby korzystać z polączenia do baz danych musimy ściągnąć i dodać sterownik do postgreSQL’a (lub do innej bazy, zależy z jakiej bazy korzystamy). Pobieramy sterownik i kopiujemy do:

    /Applications/SoapUI-5.4.0.app/Contents/java/app/bin/ext

    Zapisujemy projekt i restartujemy soap’a. Otwieramy pierwszy krok JDBC Request i odwołujemy się do naszych zmiennych ustawionych wcześniej.

    ${#POZIOM_ELEMNTU#NAZWA_ZMIENNEJ}

    Ustawiamy connection string oraz nazwę drivera i sprawdzamy czy nawiązaliśmy połączenie, jeżeli dostaliśmy info „The connection successfully tested” wszyskto jest ok, w innym przypadku musimy sprawdzić connection string który powinien mieć format:

    jdbc:postgresql://HOST:PORT/BAZA?user=USER_NAME&password=PASSWORD

    SOAP Request

    Następnie ustawiamy zmienną w adresie serwisu w którym będziemy rejestrować przedmiot:

    http://${#TestSuite#SERVER_ADRESS}/itemService/ItemService

    Groovy Script

    Wszystko mamy przygotowane, a więc pora wszystko złączyć w całość w ostatnim kroku czyli skrypcie w groovy:

    Na początek pobiermy wartości naszych zmiennych i inicjalizujemy połączenie z bazą danych.

    import groovy.sql.Sql
    import groovy.xml.*
    
    //Get properties
    String CONNECTION_STRING_DATABASE = testRunner.testCase.testSuite.getPropertyValue("CONNECTION_STRING_DATABASE")
    String DATABASE_DRIVER = testRunner.testCase.testSuite.getPropertyValue("DATABASE_DRIVER")
    
    //Init Database connection
    def sql = Sql.newInstance(CONNECTION_STRING_DATABASE, DATABASE_DRIVER)
    
    //Query
    String query = "SELECT * FROM items WHERE document_id is null"
    

    Następnie wykonujemy zapytanie i wykonujemy kod dla każdego pobranego rekordu.

    //Query excecution
    sql.eachRow(query) { row ->
    
    	Integer id = row.id as Integer
    	String name = row.name as String
    	
    	//Assign values from DB to request parameters
    	def defaultRequest = new XmlSlurper().parseText(getDefaultRequest())
    
    	defaultRequest.Body.registerItem.item.id = id
    	defaultRequest.Body.registerItem.item.name = name
    
    	//Init SOAP test step
    	def registerItem = testRunner.testCase.getTestStepByName("registerItemStep")
    
    	//Assign content with assigned attributes
    	registerItem.getHttpRequest().setRequestContent(XmlUtil.serialize(defaultRequest))
    
    	//Run insertItem Step
    	registerItem.run(testRunner, context)
    
    	//Get response from service
    	def responseXml = new XmlSlurper().parseText(registerItem.getAssertableContent())
    
    	//Assign document id from response
    	String documentId = responseXml.Body.registerItemResponse.ItemServiceResponse.itemId
    
    	if(documentId != null && documentId != ""){
    
    		log.info('Register successfuly ' + documentId)
    
    		sql.execute("UPDATE items SET document_id = ? WHERE id = ?", [documentId, id])
    		
    	}else{
    
    		log.info(responseXml.Body.registerItemResponse.ItemServiceResponse.description as String)		
    	}
    }
    
    log.info("Done")
    
  • 4,5 – Przypisujemy zmienne z pobranego wiersza.
  • 8 – Pobieramy domyslny request metody registerItem z metody pomocniczej
  • 10, 11 – Przypisujemy wartosci do xml’a reqeust’u.
  • 14 – Pobieramy poprzedni krok testu za pomocą którego odpytamy serwis.
  • 17 – Ustawiamy nową zawartość request’u z przypisanymi wartościami.
  • 20 – Wysyłamy reqeust do serwisu.
  • 23 – Parsujemy odpowiedź na xml za pomocą dedykowanej biblioteki.
  • 26 – Zczytujemy wartość parametru documentId.
  •  
    W następnych liniach w przypadku powodzenia operacji robimy update wiersza w innym przypadku logujemy komunikat serwisu. Po zakończeniu wykonywania skryptu wyświetlana jest informacja „Done”.

    //Default reqeust from schema for insertItem webMethod
    private String getDefaultRequest(){
       
       return '''
       
       
          
             
                
                ?
                
                ?
             
          
       
    '''
    }
    
    

    Metoda pomocnicza która zwraca domyślną wartość reqeust’u do web metody registerItem.

    Dotarliśmy do końca dla wytrwałych link do githuba, gdzie dostępny jest projekt do importu w soapie oraz źródła serwisu który wykorzystywaliśmy.

    Po wykonaniu skryptu:

    Pzdr.

    Dodaj komentarz

    Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *