soapUI - practiQA
Transkrypt
soapUI - practiQA
soapUI Przedstawione informacje pochodzą ze źródeł wymienionych w ostatniej części dokumentu oraz własnych doświadczeń. Wstęp SoapUI to zyskujące sobie coraz większą popularność narzędzie wspomagające testy funkcjonalne, obciążeniowe oraz bezpieczeństwa. Zwolenników zyskuje przede wszystkim ze względu na łatwość obsługi i dużą funkcjonalność. Jego możliwości wykraczają poza protokół SOAP i pozwalają testować aplikację wykorzystujące technologie REST, JMS, AMF oraz JDBC. Korzystając z języka Groovy możliwa jest też rozbudowa jego możliwości. Struktura obiektów soapUI Właściwości (ang. properties) Właściwość (ang. property) to tekst dostępny poprzez odpowiedni identyfikator. Właściwości i opowiadające im identyfikatory wydoczne są w panelu 'Properties'. Wszystkie elementy projektu soapUI posiadają domyślny zestaw właściwości, które kontrolują ich zachowanie. Użytkownik ma również możliwość dodawania własnych właściwości. Istnieje kilka sposobów odczytywania i zapisywania wartości właściwości. Dostęp do właściwości z treści zapytań i asercji W teściach wysyłanych zapytań oraz asercjach możliwe jest odwołanie się do właściwości poprzez zapis: ${[zakres]nazwaWłaściwości[#wyrażenie-xpath]} Struktua obiektów soapUI to struktura drzewiasta, w której każdy z obiektów posiada referencję do obiektu nadrzędnego oraz obiektów podrzędnych. Odpowiada to strukturze i hierarchii elementów z jakich zbudowany jest projekt. Posiadając referencję do dowolnego elementu w tej struktórze, dzięki poniższym funkcjom, możliwy jest dostęp do dowolnego innego obiektu w drzewie projektu. Project getTestSuiteByName(name) getTestSuiteCount() getTestSuiteAt(index) Test Suite getProject() getTestCaseByName(name) getTestCaseCount() getTestCaseAt(index) TestCase getTestSuite() getTestStepByName(name) getTestStepCount() getTestStepAt(index) TestStep getTestCase() MockService getProject() Do pobrania referencji do początkowego obiektu w skryptach Groovy należy wykorzystać obiekt testRunner. W zależności od tego na jakim poziomie wykonywany jest skrypt inny element początkowy będzie dostępny. Poniżej znajduje się fragment kodu jaki można wykorzystać w kroku GroovyScript. Przykłady: def testCase def testSuite def project def testStep = testRunner.testCase = testCase.getTestSuite() = testSuite.getProject() = testCase.getTestStepByName("SendReq") Dostępne są następujące zakresy Zakres #Project# #TestSuite# #TestCase# #MockService# #Global# TestStep_name# odwołanie do właściwości projektu odwołanie do właściwości aktualnego TestSuite odwołanie do właściwości aktualnego TestCase odwołanie do właściwości MockService odwołanie do właściwości globalnych odwołanie do właściwości aktualnego TestStep Przykłady: ${#Project#hostName} ${#TestCase#temperature} ${Search Request#Response#//ns1:Item[1]/n1:Author[1]/text()} Dynamiczne zmienne soapUI daje użytkownikowi możliwość dynamicznego generowania wartości właściwości. Jest to przydatne by np. dokonać obliczeć wygenerować losowy identyfikator lub wykorzystać aktualną datę. Umożliwia to zapis: ${=<wyrażenie groovy>} Przykłady: ${=214 + ${#TestCase#temperature} ${=Math.random() * 1000} ${=String.format('%tH%<tM%<td%<tm%<ty', new Date())} Odczyt z wykorzystaniem obiektu context Rozwinięcie nazwy i odczytanie właściwości w skrypcie możliwe jest poprzez prosty zapis: def url = context.expand( '${#Project#url}' ) www.practiqa.pl ver 1.0.0 Pobieranie i zapis poprzez obiekt testRunner Odczytywanie i zapis wartości właściwości w skryptach Groovy możliwe jest poprzez metody: getPropertyValue(String propertyName) setPropertyValue(String propertyName, String propertyValue) Przykład: def testCaseProp = tc.getPropertyValue( "MyProp" ) tc.setPropertyValue( "MyProp", “MyVal” ) Pobieranie i zapis poprzez obiekt messageExchange W kroku Script Assertion dostęp do właściwości możliwy jest poprzez zapis: def tc = messageExchange.modelItem.testStep.testCase def testCaseProp = tc.getPropertyValue( "MyProp" ) Konwersja tekstu na typy numeryczne Ponieważ właściwości są zapisywane jako teksty, by dokonać na nich obliczeń, konieczna jest konwersja na jeden z typów numerycznych. Konwersja jest wymagana również podczas zapisu danych numerycznych do właściwości. Przykład: Logowanie w przypadku niepowodzenia testu for ( testCaseResult in runner.results ){ testCaseName = testCaseResult.getTestCase().name log.info testCaseName if ( testCaseResult.getStatus().toString() == 'FAILED' ){ log.info "$testCaseName has failed" for ( testStepResult in testCaseResult.getResults() ) { testStepResult.messages.each() { msg -> log.info msg } } } } Przetwarzanie treści XML def groovyUtils = new com.eviware.soapui.support.GroovyUtils( context ) def holder = groovyUtils.getXmlHolder( "Request 1#Response" ) holder.namespaces["ns"] = "http://acme.com/mynamspace" for( item in holder.getNodeValues( "//ns:item" )) log.info "Item : [$item]" XPath & Xquery XPath umożliwia pobieranie i dokonywanie operacji na wartościach tagów XML Pobranie tag'a w oparciu o ścieżkę bezwzględną /catalog/product[1]/name Pobranie tag'a w oparciu o kolekcję elementów //product[@dept="WMN"]/name def testCaseProp def tempInteger def tempDecimal = tc.getPropertyValue( "Temp" ) = testCaseProp as Integer = testCaseProp as BigDecimal def updatedTemp = temperature + 214.5 Wykorzystanie XPath do obliczeń count(/catalog/product) /catalog/product[1]/number + /catalog/product[2]/number def testCaseProp = tc.getPropertyValue( "Temp", updatedTemp as String) Manipulacja tekstami //product[4]/substring(name, 1, 10) Przydatne fragmenty skryptów Katalog domowy projektu def projectdir = context.expand('${projectDir}'); Sprawdzenie czy projekt wykonywany jest z linii poleceń if( com.eviware.soapui.SoapUI.isCommandLine() ){ log.info "This code is executed by Command Line soapUI" } Sprawdzenie czy test wykonywany jest jako Load Test if( context.LoadTestContext != null ) { log.info "This code is executed from a LoadTest" } Zmienne dostępne w skryptach Load Test context.ThreadIndex - numer wątka context.RunCount - numer iteracji www.practiqa.pl XQuery umożliwia oeracje na kolekcjach tagów XML. Filtrowanie i sortowanie tagów xml <result>{ for $prod in /catalog/product where $prod/@dept = "ACC" order by $prod/name return $prod/name }</result> Przetwarzanie tagów xml <ul>{ for $prod in /catalog/product return <li class="{$prod/@dept}">{data($prod/name)}</li> }</ul> Referencje http://soapui.org ver 1.0.0