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

    Веб сервисы достаточно удобный метод организовать клиент-серверное общение, особенно если обе стороны используют разные платформы. Формализация общения позволяет однозначно определить словарь сообщений и применить огромное количество уже существующих библиотек и методик. 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
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 5

      0
      Недавно тоже пришлось заниматься написанием веб сервиса на php, хотелось бы узнать в чем плюсы nusoap.php относительно стандартных средств php для создания веб сервисов?
        0
        к плюсам: независимость от настроек сервера и простота в использовании.
        Обычно WSDL создается еще на этапе уточнения srs (по крайней мере первая версия) и с nusoap очень просто сделать сервис для примера.

        Думаю стандартные методы написания веб сервисов не хуже, если есть опыт.
          0
          Пока единственное что я вижу это что функции привязываются автоматом, но возможно есть более гибкии настройки. Вот например пример из одной статьи phpclub.ru/detail/article/soap#part_3_3
          <?php
          $quotes = array(
          «ibm» => 98.42
          );

          function getQuote($symbol) {
          global $quotes;
          return $quotes[$symbol];
          }

          ini_set(«soap.wsdl_cache_enabled», «0»); // отключаем кэширование WSDL
          $server = new SoapServer(«stockquote1.wsdl»);
          $server->addFunction(«getQuote»);
          $server->handle();
          ?>

          кстати по дефолту в nusoap soap.wsdl_cache выключается или остается как в настройках? просто при отладки wsdl описания включенный кэш просто убивает.
            0
            на счет кэша не знаю. Когда пробовал пример сделать, вроде не мешал
            0
            вот тут в комментах немного обсуждают nusoap. последняя версия почти два года назад кстати вышла.
            А если кратце, похоже единственная прелесть nusoap против SOAP Extension это поддержка вложений

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

        Самое читаемое