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