понедельник, 26 ноября 2012 г.

SoapUI. Циклы. Часть 1. Conditional Goto.

К сожалению, в бесплатной версии нормальных циклов, только кастрированный Conditional Goto, который можно представить циклом do...while(condition)
В части первой о нем и напишу, затем планируется написание цикла типа for c использованием Groovy.
Итак, постановка задачи.

Дано:
некий сервис сообщений осуществляющий отправку сообщения, получение статуса сообщения. Все сообщения имеют статусы INWORK, DONE, ERROR. После отправки сообщения, ему присваивается статус INWORK, затем DONE. В случае ошибки обработки сообщения возвращается статус ERROR.

Извратимся и будем записывать возникающие статусы в проперти тест-кейса status.
Т.к. тест-кейс может запускаться вручную несколько раз, необходимо каждый раз сбрасывать значение property status.

Решение:
1. открываем  свойства TestCase и пишем SetupScript:

testRunner.testCase.setProperty('status', '')

2. Создаем Request для метода отправки сообщения
3. Создаем Request для метода проверки статуса сообщения.
4. Передаем идентификатор сообщения из Response метода sendMessage в Request метода getMessage при помощи Property Transfer.

5. Добавляем шаг Groovy Script, где будем записывать получившиеся статусы в Property status тест-кейса, для это парсим Response getMessage одним из двух способов (способов гораздо больше, описал пока 2).
Например,

import com.eviware.soapui.support.XmlHolder;
def soapRequest = testRunner.testCase.getTestStepByName("getMessage");
def responseValue = soapRequest.getProperty('Response').getValue();
def parcedResponse =  new XmlParser().parseText(responseValue);
def tc = testRunner.testCase;

def tcProperty = testRunner.testCase.getPropertyValue('status')
if (tcProperty.equals(''))
 tc.setPropertyValue('status', parcedResponse.depthFirst().grep{it.@status}.'@status'[0]);
else{
 StringBuffer sb = new StringBuffer();
 sb.append(tcProperty);
 sb.append(', ');
 sb.append(parcedResponse.depthFirst().grep{it.@status}.'@status'[0]);
 tc.setPropertyValue('status',sb.toString());
}

6. Добавляем шаг Conditional Goto.
    - Добавляем Новое состояние, назовем его status.
    - Пишем, с помощью XPath Condition, что в случае, если статус равен INWORK, то повторяем шаг getMessage, иначе останавливаем цикл:

declare namespace ns4='http://example/NS4';
//ns4:Message/@status = 'INWORK'

  - Указываем шаг getMessage в поле Target Step

Вставляем Delay там где необходимо. Делаем проверки результатов теста. Цикл готов.

Комментариев нет:

Отправить комментарий