Показаны сообщения с ярлыком SoapUI. Показать все сообщения
Показаны сообщения с ярлыком SoapUI. Показать все сообщения

среда, 5 декабря 2012 г.

SoapUI, JDBC. Подключаемся к БД один раз на проект/тест-кейс/тест-сьют

В бесплатной версии SoapUI, к сожалению, отсутствует явный JDBC connection, поэтому пришлось потанцевать с бубном дабы подружить soapUI c базой данных.
Конечно, простое подключение, когда для каждого шага создается новое подключение к БД реализуется легко и этот способ вполне себе описан в документации.

import groovy.sql.Sql
com.eviware.soapui.support.GroovyUtils.registerJdbcDriver("com.microsoft.sqlserver.jdbc.SQLServerDriver")
def dbUrl='jdbc:sqlserver://<DBIp>\\<DBInstance>;databaseName=<DBName>'
def sql = Sql.newInstance(dbUrl,'user','pass', 'com.microsoft.sqlserver.jdbc.SQLServerDriver')
def row = sql.firstRow("select count(*) cnt from Table")log.info row.cnt

Но делать это в каждом шаге абсолютно не хотелось. Поэтому решил найти выход из данной ситуации. И таки нашел!

вторник, 27 ноября 2012 г.

Deadlock SoapUI

Пока писал циклы с использованием "Conditional Goto" SoapUI задолбал падать... Никак не мог понять почему... Сначала подумал, что сам дурак...  написал assert в TearDown Script к тест-кейсу, но все оказалось не так просто.

Сначала словил первый баг: когда assert не выполнялся soapUI "засеривал" (дизейблил) все элементы интерфейса кроме главного меню, но как оказалось - это еще полбеды...

Убрал я TearDown Script, добавил шаг Groovy Script с необходимыми проверками (вне цикла) и попытался запустить тест несколько раз снова.
Если цикл повторялся несколько раз, то SoapUI зависал с deadlock на  AWT-EventQueue-0... и тогда приходится убивать процесс с SoapUI, причем если отключить добавленный groovy script вроде как все проходит нормально (возможно повезло). Как этот скрипт влияет на цикл, ведь он находится вне его и до конца цикла обычно еще далеко, не понятно.

Шаги тесты следующие:
1. request
2. property trasfer
3. request
4. Delay
5. Groovy script для обработки пропертей
6. Goto step 3, если не выполнены условия
7. Groovy script with assertion

Есть подозрение, что падает чаще всего именно на Delay. Также под подозрением собственный Garbage Collector SoapUI.
В общем запостил баг разработчикам SoapUI, посмотрим что ответят...
------------------------------------------------------------------------------------------------------------

В общем нашел я, вроде бы, причину дедлока:
если при запуске теста открыты лог тест-кейса или окно с реквестом на заднем фоне, то при перерисовке этих элементов у SoapUI походу случается когнитивный диссонанс кого обновлять первым...

понедельник, 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 там где необходимо. Делаем проверки результатов теста. Цикл готов.

SoapUI. Пара способов достать атрибут из Response

Предположим, что имеем Response вида:

<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
   <env:Header/>
   <env:Body>
      <ns2:getTestResponse>
        <return startTime="2012-11-26T14:40:31" endTime="2012-11-26T14:40:32">
            <ns4:Message status="SENT"/>
        </return>
      </ns2:getTestResponse>
   </env:Body>
</env:Envelope>

Как получить атрибут status?
Способ 1.

import com.eviware.soapui.support.XmlHolder;
def soapRequest = testRunner.testCase.getTestStepByName("YourTestCase");
//ответ soapRequest'а является property тест-кейса
def responseValue = soapRequest.getProperty('Response').getValue();
def parcedResponse =  new XmlParser().parseText(responseValue);
def getStatus = parcedResponse.depthFirst().grep{it.@status}.'@status';
log.info  getStatus[0]

Способ 2.
def groovyUtils = new com.eviware.soapui.support.GroovyUtils( context )
def holder = groovyUtils.getXmlHolder( "YourTestCase#Response" )
log.info (holder.getNodeValue('//ns4:Message/@status'));

пятница, 23 ноября 2012 г.

Посыпая голову пеплом... SoapUI org.mozilla.javascript.EvaluatorException: syntax error

Помогал коллеге решить проблему с тем, что не работает ни один скрипт на Groovy в  SoapUI. Все время выдавалось исключение: org.mozilla.javascript.EvaluatorException: syntax error

Перепробовали кучу разных вариантов пытаясь решить проблему - ничего не помогало... пока один умный человек не сказал, что неправильно выставлены Project properties: Script Language = Groovy. Оказалось, что параметр был выставлен в Javascript...

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

- Что ты скажешь об этом больном? 
- Я в шоке! Сделал ему две операции, а он все еще жив!
Подробнее - на сайте анекдотов "Чортова Задница", посмотри, не пожалеешь:http://www.hellass.com/doctor/1015-shock.html

вторник, 20 ноября 2012 г.

Создание MockService. SoapUI

Сложилось впечатление, что в документации к SoapUI часто чего-то да недоговаривают. Возможно это связано с тем, что "а купите у нас Pro версию, там все интуитивно понятно", а может просто криво пишут документацию.

Итак, озадачился проблемкой как тестировать сервис, когда он недоступен или использование веб-сервиса лимитировано.

Есть хорошая статья по поводу использования Mock Service.
Переведу несколько ключевых моментов.

Тестирование Web-services. SoapUI. Использование Groovy Script для изменения Properties

Изменение переменных в Property TestStep

Создаем новый Property TestStep.

Предположим, что нам необходимо изменить значение переменной login перед использованием в Request'е.
Для этого создаем Groovy Script TestStep
И добавляем следующий код:

def propertyStep = testRunner.getTestCase().getTestSuite()
 .getTestCaseByName("TestCase 1").getTestStepByName("Properties")
//Get Нужен скорее для проверок того, что сейчас лежит в переменной login
def login = propertyStep.getPropertyValue("login");
propertyStep.setPropertyValue("login", "YourLogin");
//Также можно добавлять новые переменные по ходу теста:
propertyStep.setPropertyValue("pass", "Pwd");

Далее создаем шаг с request'ом:

<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:soap="http://soap.rpc.jira.atlassian.com">
   <soapenv:Header/>
   <soapenv:Body>
      <soap:login soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
         <in0 xsi:type="xsd:string">${Properties#login}</in0>
         <in1 xsi:type="xsd:string">${Properties#pass}</in1>
      </soap:login>
   </soapenv:Body>
</soapenv:Envelope>

Результат выполнения тестового шага: успешная авторизация. Ура!!!