Pull to refresh

Разработка и тестирование веб сервисов на PHP/SoapUi

Reading time 4 min
Views 14K
Веб сервисы достаточно удобный метод организовать клиент-серверное общение, особенно если обе стороны используют разные платформы. Формализация общения позволяет однозначно определить словарь сообщений и применить огромное количество уже существующих библиотек и методик. Enterprise платформы (.net, jee) включают множество утилит для дизайна, разработки и тестирования веб сервисов, и многие из этих утилит вполне применимы на небольших проектах.

Эта статья описывает создание простого веб сервиса на php и его автоматизированное тестирование.

Веб сервис будет реализовывать три операции: реверс строки, суммирование и эхо.

План



Наш план: сначала планируем и объявляем, потом реализовываем. Таким образом у мы последовательно пройдем три этапа:

1. WSDL first — объявим наш словарь, или создадим контракт
2. Реализуем контракт на PHP
3. Автоматизируем процесс тестирования

Требования



Все инструменты open source
PHP 5+
NUSOAP — php библиотека для работы с WS (http://sf.net/projects/nusoap)
Eclipse от eclipse.org, версия for EE developers — мы воспользуемся только WSDL редактором.
SoapUI — soapui.org. Пакет для тестирования веб сервис ориентированных приложений

WSDL first



WSDL это контракт, т.е. соглашение по которому сервер обязуется обслуживать клиента и указывает параметры этого процесса. По сути это XML документ, который описывает методы, типы данных и другие параметры.

Существует два подхода к написанию веб сервисов:

1. Разработчик пишет программный код и средства платформы реализуют WSDL автоматически

2. Дизайнер или архитектор описывает интерфейсы в WSDL и под них имплементируют логику.

Многие разработчики идут по первому пути, т.е. они пишут код (java, c# и тп) м не задумываются о веб сервисах. С точки зрения разработчика это явный плюс.
Но эта стратегия сильно проигрывает в крупных проектах, с несколькими распределенными командами. В идеале, мы бы хотели стабилизировать интерфейсы и, например, позволить команде пишущей клиента не ждать релизов от команды пишущей сервер. И QA тоже должны начать писать тесты как можно раньше.
Таким образом мы приходим к необходимости написания WSDL в первую очередь.

Создадим WSDL с помощью Eclipse:

После запуска эклипса, создайте проект New->Other->Web services->WSDL
Имя файла укажите «ws.wsdl», namespace: «sample»
(namespace не имеет отношения к WS, так как является обычной практикой работы с XML)
После создания вы получите новый WSDL с одной операцией «NewOperation».
Удалите ее и создайте новую с именем «reverse». Клики по стрелкам позволяют просмотреть все параметры, но менять их не обязательно.

Сама операция revers будет получать строку от клиента и возвращать ее в обратном порядке следования символов, т.е. нужен один IN параметр String и результат String. Добавьте их в вашу операцию.

Вы можете сами добавить операции ping и sum с необходимыми параметрами (или откройте wsdl из архива, см линк в конце)
Сохраните ваши изменения как 'ws.wsdl'
Теперь у вас есть контракт, и вы можете отдать его разработчикам клиента, сервера, QA и тд. Все они могут начинать работу независимо друг от друга.

Реализуем WS на PHP



Создайте директорию soap в вашей public_html и скопируйте ws.wsdl (соответственно файл доступен как yourserver/soap/ws.wsdl)
Серверный код мы поместим в ws.php, и localhost/soap/ws.php будет линком вашего веб сервиса.
Дополнительно распакуйте nusoap в 'soap'.

Перейдем к непосредственной реализации логики:

Первые строки вашего ws.php:
require('lib/nusoap.php');
$server = new soap_server('ws.wsdl');


Эта конструкция сообщает скрипту, что надо реализовать указанный контракт. Сам вызов будет обработан:

$server->service($HTTP_RAW_POST_DATA);

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

Для каждой операции из контракта надо создать php функция с эквивалентным именем.
Вот пример всего файла:
<?php

require('lib/nusoap.php');
$server = new soap_server('ws.xml');

function reverse($in){
return strrev($in);
}

function ping() {
return time();
}

function sum($a, $b) {
return ($a + $b);
}

$server->service($HTTP_RAW_POST_DATA);

?>


Если вы откроете в браузере: localhost/soap/ws.php — вы увидите все доступные операции.

Теперь ваш сервер готов обслуживать клиентов! Но к вас нет клиента… и мы не будем его писать, так как применим автоматизированное тестирование…

(не забудьте, что мы будем тестировать веб сервис, что является интеграционным тестированием, и не отменяет написания юнит тестов на бизнес методы)

Тестируем с SoapUI



SoapUI это великолепное средство для тестирования и разработки систем на основе веб сервисов. Эта утилита достойна отдельной статьи, поэтому мы воспользуемся лишь одной из опций — протестируем наш сервер, эмулируя клиента.

Для этого нам понадобятся несколько кликов…

Запустите soapUi и создайте новый проект, в качестве wsdl укажите наш ws.wsdl. Не меняйте другие параметры.

Это создаст проект и вы уведете все операции в дереве. Кликнете правой кнопкой на сервисе и выберите 'Generate TestSuite'. Установите стиль на 'Singe suite ...'.

Результатом будет test suit в дереве и окно пакета (его можно закрыть.)

Сам тестовый пакет содержит ряд шагов, по одному на каждую операцию. Как вы уже догадались, это и есть элементы для проверки вашего сервиса. Вы можете запустить их все разом, или по одному, в зависимости от ваших целей.
Мы попробуем запускать их по одному, предварительно настроив.
Кликните на шаге reverse, вы увидете две панели, панель запроса и панель ответа. Контент запроса генерируется автоматически на основе контракта с знаками вопроса на месте данных. В нашем случае у нас есть один placeholder для строки, введем значение 123456789
Проверьте что target url наверху панели указывает на ваш сервис и вы можете запустить шаг на выполнение использую зеленый треугольник на панели.
Запрос уйдет на сервер и вторая панель отобразит ответ, который должен содержать 987654321 — входной параметр в обратном порядке.
Визуально мы можем убедится, что наша система работает корректно, но есть минус — мы видим это визуально. В идеале мы бы хотели это автоматизировать для регрессивного тестирования.

Обратите внимание на иконку сразу за 'Run'. Здесь собраны условия для проверки ответа и вы можете добавить условие наличие строки 987654321 в ответе.

Теперь у вас есть автоматизированный тест, который может выполняться как вручную, так и сервером сборки.

Пример



Пример в архиве содержит
ws.php имплементация веб сервиса
ws.wsdl контракт
WS-soapui-project.xml — soap ui проект
lib nusoap библиотеки
Скачать можно тут romanenco.com/sites/default/files/phpws.zip

English version romanenco.com/phpws

Andrew Romanenco
Tags:
Hubs:
+3
Comments 5
Comments Comments 5

Articles