Статьи

Тестирование функциональных веб-сервисов стало проще с SoapUI — Часть 2

Первая часть этой серии статей помогла предоставить справочную информацию, необходимую для начала изучения тестирования веб-сервисов. Мы изучили основы
SoapUI и то, как легко было писать функциональные тесты без написания одной строки кода. Мы также видели, как добавить утверждения к этим тестам. Теперь мы рассмотрим, как использовать
Groovy в SoapUI для настройки теста, разбора теста, проверки ответа и многого другого.

Прежде чем мы начнем, быстрый Groovy учебник для начинающих. Начнем с того, что Groovy — это Java, а Java — это Groovy. Если вы написали код Java, вы написали код Groovy. Наши задачи в этой статье состоят в том, чтобы сделать 3 вещи: отформатировать дату, прочитать и записать в файл свойств и проанализировать XML. Давайте посмотрим на код Groovy для каждого из них подробно.

1. Форматирование даты
Стандартный класс Java для этой задачи — SimpleDateFormat . Это конкретный подкласс форматов DateFormat , который анализирует даты и время с использованием строкового шаблона, в нашем случае «yyyy-MM-dd» . Давайте начнем с написания этого на Java; позже мы увидим, как легко мы можем улучшить это для использования в SoapUI. Вот код Java для получения даты в формате «гггг-мм-дд».

java.util.Date today = new java.util.Date();
java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy-MM-dd");
String todayStr = sdf.format(today);

Мы могли бы оставить код Groovy в точности так, как он есть выше, но давайте сделаем его более подходящим, удалив навороты, необходимые в Java. Наш код наконец-то выглядит так:

today = new Date()
sdf = new java.text.SimpleDateFormat("yyyy-MM-dd")
todayStr = sdf.format(today)

Не много изменений, но значительно быстрее набирать текст. Сходство с Java так же, как мы уже говорили.

2. Чтение и запись в файл свойств.

Объект java.util.Properties выполняет чтение и запись в файл свойств на Java. На этот раз мы перейдем непосредственно к коду Groovy:

sdf = new java.text.SimpleDateFormat("yyyy-MM-dd")
todayStr = sdf.format(new Date())
props = new java.util.Properties ()
file = new File("C:/web-services-test/testprops.txt")
if(!file.exists())
{
file.createNewFile()
props.today = todayStr
props.zipCode = "20904"
fos = new java.io.FileOutputStream ( file )
props.store(fos, "Writing the zipcode and today's date")
}fis = new FileInputStream (file )
props.load (fis)
today = props.getProperty ( "today" )
zipCode = props.getProperty ( "zipCode" ) 

Просто, правда? Точно так же, если вам нужно читать из базы данных, вы можете сделать это в несколько простых строк кода Groovy.

3.Parse XML

Если вы писали корпоративные Java-приложения, вам, безусловно, нужно было использовать XML, и вы можете подтвердить, что XML и Java не легки. Разбор XML в Java требует большого количества стандартного кода и действительно утомителен.

Вы можете помнить из первой части, что я сказал, что я ленивый. К счастью, Groovy приходит на помощь. Мы можем проанализировать XML всего за 5 строк кода. Да, это то, что я сказал, только 5 строк. Давайте посмотрим, как разобрать ответ от веб-службы LatLonListZipCode из части 1. XML выглядит следующим образом:

<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<ns1:LatLonListZipCodeResponse xmlns:ns1="http://www.weather.gov/forecasts/xml/DWMLgen/wsdl/ndfdXML.wsdl">
<listLatLonOut xsi:type="xsd:string"><?xml version='1.0' ?>
<dwml version='1.0' xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.nws.noaa.gov/mdl/survey/pgb_survey/dev/DWMLgen/schema/DWML.xsd">
<latLonList>39.0138,-77.0242</latLonList>
</dwml></listLatLonOut>
</ns1:LatLonListZipCodeResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Код для анализа этого в Groovy очень прост:

groovyUtils = new com.eviware.soapui.support.GroovyUtils( context )
holder = groovyUtils.getXmlHolder("LatLonListZipCode - Request 1#Response")
listLatLonOut = holder.getNodeValue( "//listLatLonOut" )
latlonNode = groovyUtils.getXmlHolder(listLatLonOut)
latlon = latlonNode.getNodeValue("//latLonList")

Так много для преамбулы, давайте приступим к работе. Если вы выполнили часть 1 этой серии, у вас уже должен быть проект NOAA-Weather-Service . Мы продолжим с тем же веб-сервисом здесь. В нашем предыдущем тесте; мы использовали сегодняшнюю дату, а также широту и долготу Серебряной весны. В NDFDgenByDay запросу, STARTDATE должен быть строкой в формате «YYYY-MM-DD» . У веб-службы NOAA есть функция, которая возвращает нам широту и долготу, если предоставляется почтовый индекс. На этот раз мы будем читать данные, которые нам нужны для этого функционального теста, из файла свойств.

Давайте вспомним шаги для создания Test в SoapUI:

1. Создайте новый набор тестов и тестовый набор.
2. В сценарии установки Test Suite, если файл свойств не существует, запишите в новый файл свойств сегодняшнюю дату и почтовый индекс по умолчанию.
3. Создайте объект Properties и присвойте ему значения, считанные из файла свойств.
4. В сценарии установки тестового примера прочитайте файл свойств.
5. Используйте свойство zipCode из вышеприведенного шага в запросе LatLonListZipCode, который вернет нам широту и долготу.
6. Используйте Groovy, чтобы утверждать, что мы получили правильный почтовый индекс и передали широту и долготу по линии.
7.Просмотр NDFDgenByDayLatLonList теперь использует дату из шага свойства 1, а также широту и долготу из шага 6.
8. Наконец, используйте шаг Groovy для анализа XML, проверьте ответ и подтвердите результаты.

1. Создайте новый набор тестов и тестовый набор. Выполните следующие действия:
a. Щелкните правой кнопкой мыши по проекту и выберите пункт меню «Новый TestSuite». Укажите название WeatherTestSuite .

б. Щелкните правой кнопкой мыши на Test Suite, который вы создали выше, и выберите пункт меню New TestCase. Укажите имя WeatherTestCase .

 

2. В сценарии установки для этого набора тестов мы запишем в файл свойств с помощью Groovy; форматированная дата и почтовый индекс.

log.info("In the WeatherTestSuite Setup Script")
sdf = new java.text.SimpleDateFormat("yyyy-MM-dd")
todayStr = sdf.format(new Date())
props = new java.util.Properties ()
file = new File("C:/web-services-test/testprops.txt")
if(!file.exists())
{
file.createNewFile()
fis = new FileInputStream (file )
props.setProperty ( "today" , todayStr)
props.setProperty ( "zipCode" , "20904")
fos = new java.io.FileOutputStream ( file )
props.store(fos, "Writing the zipcode and today's date")
}

 

3. Добавьте шаг свойств.

Щелкните правой кнопкой мыши на WeatherTestCase и выберите Добавить шаг -> Свойства . Это открывает новый редактор, в этом редакторе создайте два новых свойства, startDate и zipCode .

4.В сценарии установки для тестового примера мы прочитаем обратно из файла свойств и присвоим значения шагу свойств, который мы добавили выше. Подведем итог:

log.info("In the WeatherTestCase Setup Script")
props = new java.util.Properties()
fis = new FileInputStream ("C:/web-services-test/testprops.txt")
props.load (fis)
today = props.getProperty ( "today" )
zipCode = props.getProperty ( "zipCode" )
targetStep = testRunner.testCase.getTestStepByName( "Properties" )
// transfer all properties
targetStep.setPropertyValue( "startDate", today)
targetStep.setPropertyValue( "zipCode", zipCode)
log.info(today)
log.info(zipCode)

 


 

5. Добавьте LatLonListZipCode — Запрос 1 в контрольный пример с почтовым индексом $ {Properties # zipCode} . Это извлекает почтовый индекс из шага свойств, который мы определили выше. XML-запрос:

<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ndf="http://www.weather.gov/forecasts/xml/DWMLgen/wsdl/ndfdXML.wsdl">
<soapenv:Header/>
<soapenv:Body>
<ndf:LatLonListZipCode soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<zipCodeList xsi:type="dwml:zipCodeListType" xmlns:dwml="http://www.weather.gov/forecasts/xml/DWMLgen/schema/DWML.xsd">${Properties#zipCode}</zipCodeList>
</ndf:LatLonListZipCode>
</soapenv:Body>
</soapenv:Envelope>

 

 

6.Парсируйте ответ от вышеупомянутого запроса, используя Groovy и assert.

Щелкните правой кнопкой мыши на Test Case и выберите Add Step -> Groovy Script . Это откроет редактор. В этом редакторе мы напишем скрипт Groovy, который проанализирует ответ, а также добавит несколько утверждений. Кроме того, назначьте широту и долготу контексту, который может использоваться в следующем запросе.

groovyUtils = new com.eviware.soapui.support.GroovyUtils( context )
holder = groovyUtils.getXmlHolder("LatLonListZipCode - Request 1#Response" )
listLatLonOut = holder.getNodeValue( "//listLatLonOut" )
assert listLatLonOut != null
assert listLatLonOut.length() > 0
latlonNode = groovyUtils.getXmlHolder(listLatLonOut)
latlon = latlonNode.getNodeValue("//latLonList")
log.info(latlon)
assert latlon !=null
context["latlon"] = latlon

 

 

7.Добавьте NDFDgenByDayLatLonList — запрос 1 в контрольный пример.

В этом запросе мы собираемся извлечь дату, а также широту и долготу из контекста.

<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ndf="http://www.weather.gov/forecasts/xml/DWMLgen/wsdl/ndfdXML.wsdl">
<soapenv:Header/>
<soapenv:Body>
<ndf:NDFDgenByDayLatLonList soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<listLatLon xsi:type="dwml:listLatLonType" xmlns:dwml="http://www.weather.gov/forecasts/xml/DWMLgen/schema/DWML.xsd">${latlon}</listLatLon>
<startDate xsi:type="xsd:date">${Properties#startDate}</startDate>
<numDays xsi:type="xsd:integer">1</numDays>
<format xsi:type="dwml:formatType" xmlns:dwml="http://www.weather.gov/forecasts/xml/DWMLgen/schema/DWML.xsd">12 hourly</format>
</ndf:NDFDgenByDayLatLonList>
</soapenv:Body>
</soapenv:Envelope>

 

 

8. Наконец, давайте создадим еще один шаг Groovy, который анализирует ответ и добавит несколько утверждений assert.

groovyUtils = new com.eviware.soapui.support.GroovyUtils( context )
holder = groovyUtils.getXmlHolder("NDFDgenByDayLatLonList - Request 1#Response" )
dwmlByDayOut = holder.getNodeValue( "//dwmlByDayOut" )
//log.info(dwmlByDayOut)
assert dwmlByDayOut.length() > 298
dwml = groovyUtils.getXmlHolder(dwmlByDayOut)
headTitle = dwml.getNodeValue("//head/product/title")
headField = dwml.getNodeValue("//head/product/field")
//log.info(headTitle)
//log.info(headField)
assert "NOAA's National Weather Service Forecast by 12 Hour Period".equals(headTitle)
assert "meteorological".equals(headField)

 

Теперь запустите его и увидите много зелени!

 

Вы также можете щелкнуть правой кнопкой мыши на WeatherTestSuite и выбрать пункт меню Launch TestRunner , который открывает диалоговое окно как таковое:

 

 

Нажмите кнопку Launch , и вы сможете увидеть результаты в другом окне:

Running soapUI TestRunner for [Weather]
directory: C:\Program Files\eviware\soapUI-2.0.2\bin\.
command: cmd.exe /C testrunner.bat -sWeatherTestSuite -cWeatherTestCase -r -a -j -f C:\web-services-test C:\Documents and Settings\msubbarao\Desktop\Weather-soapui-project-part2.xml
soapUI 2.0.2 TestCase Runner
Configuring log4j from [jar:file:/C:/Program%20Files/eviware/soapUI-2.0.2/bin/soapui-2.0.2.jar!/soapui-log4j.xml]
18:32:30,692 INFO [DefaultSoapUICore] initialized soapui-settings from [C:\Program Files\eviware\soapUI-2.0.2\bin\soapui-settings.xml]
18:32:31,723 INFO [WsdlProject] Loaded project from [file:/C:/Documents%20and%20Settings/msubbarao/Desktop/Weather-soapui-project-part2.xml]
18:32:32,494 INFO [SoapUITestCaseRunner] Running soapUI tests in project [Weather]
18:32:32,504 INFO [SoapUITestCaseRunner] Running soapUI suite [WeatherTestSuite], runType = SEQUENTIAL
18:32:33,015 INFO [log] In the WeatherTestSuite Setup Script
18:32:33,125 INFO [log] In the WeatherTestCase Setup Script
18:32:33,165 INFO [log] 2008-05-11
18:32:33,175 INFO [log] 20904
18:32:33,175 INFO [SoapUITestCaseRunner] Running soapUI testcase [WeatherTestCase]
18:32:33,336 INFO [SoapUITestCaseRunner] running step [Properties]
18:32:33,376 INFO [SoapUITestCaseRunner] running step [LatLonListZipCode - Request 1]
18:32:34,577 INFO [HttpClientSupport$Helper] Initializing SSL
18:32:35,008 WARN [AbstractSoapVersion] Ignoring validation error: error: cvc-complex-type.3.2.2: Attribute not allowed: encodingStyle@http://schemas.xmlsoap.org/soap/envelope/ in element Envelope@http://schemas.xmlsoap.org/soap/envelope/
18:32:35,008 INFO [SoapUITestCaseRunner] Assertion [SOAP Response] has status VALID
18:32:35,048 INFO [SoapUITestCaseRunner] running step [AssertLatLon]
18:32:35,719 INFO [SoapUITestCaseRunner] running step [NDFDgenByDayLatLonList - Request 1]
18:32:35,909 WARN [AbstractSoapVersion] Ignoring validation error: error: cvc-complex-type.3.2.2: Attribute not allowed: encodingStyle@http://schemas.xmlsoap.org/soap/envelope/ in element Envelope@http://schemas.xmlsoap.org/soap/envelope/
18:32:35,909 INFO [SoapUITestCaseRunner] Assertion [SOAP Response] has status VALID
18:32:35,969 INFO [SoapUITestCaseRunner] running step [AssertWeatherResponse]
18:32:36,049 INFO [SoapUITestCaseRunner] Finished running soapUI testcase [WeatherTestCase], time taken: 1097ms, status: FINISHED
18:32:36,110 INFO [log] In the WeatherTestCase TearDown Script
18:32:36,120 INFO [log] In the WeatherTestSuite TearDown Script
18:32:36,120 INFO [SoapUITestCaseRunner] soapUI suite [WeatherTestSuite] finished in 3616ms

SoapUI 2.0.2 TestCaseRunner Summary
-----------------------------
Time Taken: 3621ms
Total TestSuites: 1
Total TestCases: 1 (0 failed)
Total TestSteps: 5
Total Request Assertions: 2
Total Failed Assertions: 0
Total Exported Results: 5

В этой статье мы увидели, как использовать Groovy с SoapUI для создания свойств, передачи свойств запросам, а также для проверки ответов и подтверждения ожидаемых результатов. Если вы знаете Java, написание скриптов на Groovy — это просто. Вы можете запустить эти скрипты из пользовательского интерфейса, как мы видели. Конечно, мы рассмотрели лишь небольшую часть того, что мы фактически делаем в любом корпоративном приложении. Как только мы узнаем, как использовать Groovy, вам доступен весь API Java для удобного использования в SoapUI.

Следующая часть этой серии статей посвящена интеграции тестов с вашим инструментом сборки, запуску этих тестов как части ваших сборок и созданию отчетов JUnit.

Оставайтесь в курсе.

Дополнительные ресурсы:

1. SoapUI

2. Groovy

3. API Java 6

4. Groovy в действии

5. Groovy Рецепты