Я использую SoapUi 5.5.0 для создания функциональных тестов для моего веб-сервиса REST. Мой проект уже может делать запросы REST и отображать ответ JSON. Теперь мне нужно сделать утверждение об этом ответе. Но я не могу заставить свое утверждение работать так, как я хочу.
Например, допустим, я хочу утверждать, что ответ JSON содержит либо строку «args», либо «brgs». Если JSON содержит одну или обе эти строки, утверждение пройдет; в противном случае утверждение не будет выполнено. Для этого я открываю тестовый шаг «REST Request» и добавляю новое утверждение «Contains». Я настраиваю утверждение, чтобы проверить, содержит ли ответ JSON совпадение с регулярным выражением «[ab] rgs».
После выполнения запроса REST я вижу, что ответ JSON содержит (среди прочего) строку "args": {},
. Я ожидал, что мое регулярное выражение «Содержит» пройдет в этот момент. Но утверждение по-прежнему говорит, что это не удалось. Утверждение всегда терпит неудачу. Я не могу передать одно регулярное выражение «Содержит». Я принципиально неправильно понимаю, как работает SoapUi? или программа глючит?
Для справки, вот ответ JSON конечной точки REST, которую я тестирую:
{
"args": {},
"headers": {
"Accept-Encoding": "gzip,deflate",
"Host": "httpbin.org",
"User-Agent": "Apache-HttpClient/4.1.1 (java 1.5)"
},
"origin": "199.82.243.104, 199.82.243.104",
"url": "https://httpbin.org/get"
}
Вот изображение конфигурации моего утверждения «Содержит»:
Вот весь мой файл проекта SoapUi:
<?xml version = "1.0" encoding = "UTF-8"?>
<con:soapui-project id = "ee46fa47-c454-437d-82a3-1b61154f78ea" activeEnvironment = "Default" name = "REST Project 1" resourceRoot = "" soapui-version = "5.5.0" abortOnError = "false" runType = "SEQUENTIAL" xmlns:con = "http://eviware.com/soapui/config">
<con:settings/>
<con:interface xsi:type = "con:RestService" id = "a6af7b2e-3c2a-4419-8524-141b5cbe02b5" wadlVersion = "http://wadl.dev.java.net/2009/02" name = "https://httpbin.org" type = "rest" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance">
<con:settings/>
<con:definitionCache type = "TEXT" rootPart = ""/>
<con:endpoints>
<con:endpoint>https://httpbin.org</con:endpoint>
</con:endpoints>
<con:resource name = "Get" path = "/get" id = "29a38000-2a32-420a-b33e-f978cc1bd088">
<con:settings/>
<con:parameters/>
<con:method name = "Get 1" id = "8d40ae42-98f1-4bcb-8247-7fdfad1415d6" method = "GET">
<con:settings/>
<con:parameters/>
<con:representation type = "RESPONSE">
<con:mediaType>application/json</con:mediaType>
<con:status>200</con:status>
<con:params/>
<con:element xmlns:get = "https://httpbin.org/get">get:Response</con:element>
</con:representation>
<con:request name = "Request 1" id = "f5c85bda-524b-4d2f-baf7-635f88774a17" mediaType = "application/json">
<con:settings>
<con:setting id = "com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers"><xml-fragment/></con:setting>
</con:settings>
<con:endpoint>https://httpbin.org</con:endpoint>
<con:request/>
<con:originalUri>https://httpbin.org/get</con:originalUri>
<con:credentials>
<con:authType>No Authorization</con:authType>
</con:credentials>
<con:jmsConfig JMSDeliveryMode = "PERSISTENT"/>
<con:jmsPropertyConfig/>
<con:parameters/>
</con:request>
</con:method>
</con:resource>
</con:interface>
<con:testSuite id = "6cd7e9db-fb93-4f99-a47c-f0b9a0450e16" name = "TestSuite 1">
<con:settings/>
<con:runType>SEQUENTIAL</con:runType>
<con:testCase id = "3b79550c-f88b-455e-9c26-008971a68641" failOnError = "true" failTestCaseOnErrors = "true" keepSession = "false" maxResults = "0" name = "TestCase 1" searchProperties = "true">
<con:settings/>
<con:testStep type = "restrequest" name = "REST Request" id = "2ada1bc8-3541-4918-a937-d83de9b2e395">
<con:settings/>
<con:config service = "https://httpbin.org" methodName = "Get 1" resourcePath = "/get" xsi:type = "con:RestRequestStep" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance">
<con:restRequest name = "REST Request" id = "d17f2536-e9a3-4ddb-ad93-08db2e4a5551" mediaType = "application/json">
<con:settings>
<con:setting id = "com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers"><xml-fragment/></con:setting>
</con:settings>
<con:encoding>UTF-8</con:encoding>
<con:endpoint>https://httpbin.org</con:endpoint>
<con:request/>
<con:originalUri>https://httpbin.org/get</con:originalUri>
<con:assertion type = "Simple Contains" id = "8e6831f2-a067-4dc5-9ba7-163a73dd003b" name = "Contains">
<con:configuration><token>[ab]rgs</token><ignoreCase>false</ignoreCase><useRegEx>true</useRegEx></con:configuration>
</con:assertion>
<con:credentials>
<con:authType>No Authorization</con:authType>
</con:credentials>
<con:jmsConfig JMSDeliveryMode = "PERSISTENT"/>
<con:jmsPropertyConfig/>
<con:parameters/>
</con:restRequest>
</con:config>
</con:testStep>
<con:properties/>
</con:testCase>
<con:properties/>
</con:testSuite>
<con:properties/>
<con:wssContainer/>
<con:oAuth2ProfileContainer/>
<con:oAuth1ProfileContainer/>
</con:soapui-project>
Спасибо за помощь.
Вы неправильно поняли, как SoapUI обрабатывает регулярные выражения в утверждении «Содержит».
Ваше регулярное выражение [ab]rgs
предполагает, что все тело будет состоять только из этого текста. Что, вероятно, не то, что вы хотите.
Если вы хотите, чтобы ваше выражение было в любом месте тела, оно должно быть: .*[ab]rgs.*
, где .*
, конечно же, представляет любой текст.