Часть 3. Тестируем защищенный Web-сервис при помощи IBM Rational Software Architect и XMLUnit

Источник: IBM Rational
Мохан К. Джадхав, Мансур Ахмед

О данной серии

Все чаще Web-сервисы становятся основными компонентами в бизнес-приложениях. С появлением таких парадигм, как сервис-ориентированная архитектура (Service-Oriented Architecture, SOA), разработчики все больше внимания уделяют Web-сервисам. При этом вопросы тестирования Web-сервисов для важных сервис-ориентированных приложений приобретюет большую значимость. В результате быстрого создания и развертывания сложных Web-сервисов перед группой обеспечения качества возникают дополнительные проблемы. Автоматизация тестирования Web-сервисов может помочь группе эффективно управлять объемом работ.

Тестирование Web-сервисов обычно включает следующие задачи:

  1. Генерирование клиентского или скелетного кода для Web-сервиса;
  2. Определение входных данных теста;
  3. Вызов Web-сервиса при помощи клиентского или скелетного кода;
  4. Сверка реального и ожидаемого отклика.

Из всех перечисленных действий наибольших усилий требуют генерирование скелетного кода и верификация отклика.

Для генерирования скелетного кода для Web -сервиса на базе соответствующего WSDL-файла существуют различные инструменты; однако сгенерированный код может быть частным; возможно, его придется генерировать заново при каждом изменении WSDL. Одним из решений данной проблемы может стать отказ от генерации клиентского или скелетного кода и вызов Web-сервиса непосредственно через общий HTTP-клиент. Позже в этой серии статей вы познакомитесь с одним из таких наборов инструментов, предоставляемых API Apache Commons HttpClient (далее - HttpClient).

Верификация отклика обычно тоже требует некоторой доли ручного вмешательства, в зависимости от сложности содержимого отклика. Если отклик содержит простые элементы, то верификация может быть простой, поскольку она требует только проверки значения в простом элементе. Для откликов, содержащих сложные элементы и большой список таких сложных элементов, верификация вручную может потребовать значительных усилий.

В нашей серии статей рассказывается о методике автоматизации тестирования типичного Web-сервиса с использованием нескольких технологий, в том числе, JUnit, HttpClient и Apache XMLUnit (далее в этой статье- XMLUnit). Методика демонстрируется на платформе разработки, которую предлагает IBM Rational(R) Software Architect.

Активизация системы безопасности для Web-сервиса

В части 1 рассказывалось о том, как создать учебный Web-сервис, который возвращает список пользователей. Теперь вы сможете с помощью данного учебного руководства использовать на Web-сервисе систему безопасности. Чтобы использовать систему безопасности, выполните следующие шаги:

  1. Откройте Rational Software Architect;

  2. Выберите команду Window > Open Perspective > Java;

  3. Разверните элемент Sample Project;

  4. Выполните двойной щелчок на элементе Deployment Descriptor;

  5. Перейдите на вкладку Security, как показано на рисунке 1.

    Рисунок 1. Вкладка Security в дескрипторе развертывания
    Вкладка Security в дескрипторе развертывания

    Далее мы создадим новую роль для нашего приложения. Позже мы предоставим пользователям, принадлежащим к этой конкретной роли, привилегии доступа к Web-сервису;

  6. В секции Security Roles нажмите кнопку Add для создания новой роли;

  7. В диалоговом окне Add Security Role введите имя роли и ее описание, например, SampleRole;

  8. Нажмите кнопку Finish , чтобы закрыть окно Add Security Role, как показано на рисунке 2;

    Рисунок 2. Добавление роли безопасности
    Добавление роли безопасности

  9. В секции Security Constraints нажмите кнопку Add для создания нового ограничения безопасности. Определяя это ограничение, в действительности вы накладываете ограничения на то, какие роли к каким ресурсам будут обращаться;

  10. В окне Add Constraints введите имя ограничения, например, Sample Constraint, как показано на рисунке 3;

    Рисунок 3. Добавление ограничения
    Добавление ограничения

  11. Нажмите кнопку Next.

  12. В секции Add Web Resource введите сведения, показанные на рисунке 4;

    Рисунок 4. Добавление Web- ресурса
    Добавление Web-ресурса

  13. Нажмите кнопку Finish;

  14. В секции Authorization Roles нажмите кнопку Add , чтобы предоставить роли разрешение на доступ к Web-сервису, как показано на рисунке 5;

    Рисунок 5. Разрешения роли
    Разрешения роли

  15. В окне Add Authorization Constraint выделите роль SampleRole и введите описание, например, такое: Sample Auth Constraint;

  16. Нажмите кнопку Finish.

    Теперь мы определим тип транспортной гарантии, которую необходимо обеспечить между клиентом и сервером. Для нашего примера Web-сервиса выберите вариант без гарантии;

  17. Перейдите в секцию User Data Constraint на вкладке Security, показанную на рисунке 6;

    Рисунок 6. Ограничение пользовательских данных
    Ограничение пользовательских данных

  18. Из раскрывающегося списка Type выберите NONE;

  19. Сохраните эту конфигурацию, выбрав команды File > Save;

  20. Разверните EAR-файл для проекта SampleProject и выполните двойной щелчок на элементе Deployment Descriptor, как показано на рисунке 7;

    Рисунок 7. Дескриптор развертывания EAR
    Дескриптор развертывания EAR

  21. Перейдите на вкладку Security и нажмите кнопку Gather. Мастер выполнит сбор всех ролей, определенных для приложения. Например, он добавит в список роль SampleRole, как показано на рисунке 8.

    Рисунок 8. Сбор ролей
    Сбор ролей

    Далее мы добавим в роль SampleRole пользователя;

  22. Создайте в локальной операционной системе нового пользователя с именем SampleUser и паролем SampleUser. Это имя будет использоваться для доступа к Web -сервису;

  23. Нажмите на SampleRole и установите флажок в поле Users/Groups;

  24. Добавьте имя пользователя SampleUser;

  25. Сохраните конфигурацию;

  26. Разверните приложение, нажав правой кнопкой мыши на SampleProject и выбрав команду Run As.

Активизация системы безопасности на сервере приложений WebSphere Application Server

В предыдущем разделе мы использовали систему безопасности на учебном Web-сервисе и развернули этот Web-сервис на сервере приложений WebSphere Application Server. В этом разделе мы активизируем систему безопасности на сервере приложений WebSphere Application Server.

  1. Откройте консоль WebSphere Administrator. Как правило, для этих целей можно использовать URL http://localhost:9060/admin;

  2. Перейдите к категории Security > Global Security;

  3. Выберите ссылку Custom в категории User Registries;

  4. Введите любые имя пользователя и пароль в поле Server user ID, вам придется использовать эти данные для доступа к реестру пользователей WebSphere Application Server; нажмите кнопку Apply , чтобы применить изменения.

    Примечание: Если вы уже задали идентификатор пользователя и пароль, переходите к следующему шагу;

  5. Вернитесь к Security > Global Security;

  6. Установите флажок Enable global security. Убедитесь, что флажок Enforce Java 2 security снят, как показано на рисунке 9;

    Рисунок 9. Активизация глобальной системы безопасности
    Активизация глобальной системы безопасности

  7. Убедитесь, что вариант Local OS выбран в раскрывающемся списке Active user registry;

  8. Примените изменения.

    Далее мы сопоставим пользователей ролям приложений в WebSphere Application Server;

  9. Перейдите к категории Applications > Enterprise Applications, как показано на рисунке 10;

    Рисунок 10. Enterprise applications
    Enterprise applications

  10. Нажмите мышью на ссылке SampleProjectEAR, как показано на рисунке 11;

    Рисунок 11. Пример EAR-файла
    Пример EAR-файла

  11. Нажмите на ссылку Map security roles to users/groups в секции Additional Properties, как показано на рисунке 12;

    Рисунок 12. Сопоставление пользователей ролям безопасности
    Сопоставление пользователей ролям безопасности

  12. Выберите роль SampleRoleи нажмите кнопку Look up users;

  13. Нажмите кнопку Search, как показано на рисунке 13;

    Рисунок 13. Поиск ролей
    Поиск ролей

  14. Выберите пользователя, например, SampleUser, которого вы создали в локальной операционной системе;

  15. Нажмите кнопку >>, чтобы добавить имя пользователя в список, расположенный с правой стороны;

  16. Примените изменения;

  17. Нажмите кнопки OK на всех страницах, чтобы сохранить изменения в главной (master) конфигурации;

  18. Перезапустите WebSphere Application Server.

Верификация безопасности Web-сервиса

В предыдущем разделе мы активизировали систему безопасности для учебного Web -сервиса и настроили параметры безопасности WebSphere Application Server. В этом разделе мы убедимся в том, что система безопасности на Web-сервисе активизирована.

Чтобы проверить, активизирована ли система безопасности на Web-сервисе, выполните следующие шаги:

  1. Откройте Web-браузер;
  2. Введите URL Web-сервиса. Браузер предложит ввести имя пользователя и пароль;
  3. Введите SampleUser и SampleUser в качестве имени пользователя и пароля, которые вы выбрали для этого примера. Если система безопасности на Web- сервисе активизирована, вы увидите сообщение Web-сервиса Hi there, this is a Web service!

Тестирование защищенного Web-сервиса

Поскольку мы активизировали систему безопасности на Web-сервисе, придется изменить тестовый код в файле SampleHttpClient.java, который вы создали в части 2. Сначала измените метод invokeWebService() method в классе, как показано в листинге 1.

Листинг 1

                    
package com.ibm.ws.sample.test;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.ArrayList;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.UsernamePasswordCredentials;
import org.apache.commons.httpclient.auth.AuthPolicy;
import org.apache.commons.httpclient.auth.AuthScope;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.RequestEntity;
import org.apache.commons.httpclient.methods.StringRequestEntity;

public class SampleHttpClient 
{
  public static String invokeWebService(String webServiceURL,
  String  requestXMLPath) throws FileNotFoundException, Exception
  {
    PostMethod post = null;
    HttpClient client = new HttpClient();
    try 
    {
      // Читаем  SOAP-запрос из файла.
      StringBuffer requestFileContents = new StringBuffer();
      BufferedReader bufferedReader = new BufferedReader(new FileReader(requestXMLPath));
      String line = null;
		
      while((line = bufferedReader.readLine()) != null)
      {
        requestFileContents.append(line);
      }

      post = new PostMethod(webServiceURL);
      post.setRequestHeader("Accept", "application/soap+xml, 
        application/dime, multipart/related, text/*");
      post.setRequestHeader("SOAPAction", "");

      /*
       * 
       * SECURITY CODE START
       * 
       * */
      
      UsernamePasswordCredentials defaultcreds = new 
        UsernamePasswordCredentials("SampleUser","sampleuser");
      client.getState().setCredentials(AuthScope.ANY, defaultcreds);

      ArrayList authPrefs = new ArrayList(3);
      authPrefs.add(AuthPolicy.BASIC);
      authPrefs.add(AuthPolicy.NTLM);
      authPrefs.add(AuthPolicy.DIGEST);
      client.getParams().setParameter(AuthPolicy.AUTH_SCHEME_PRIORITY, authPrefs);
      client.getParams().setAuthenticationPreemptive(true);
      
      // Для обеспечения безопасности
      //client.getState().setCredentials(authScope, credentials);
      post.setDoAuthentication(true);

      /*
       * 
       * SECURITY CODE END
       * 
       * */

      // Запрашиваемый контент будет извлекаться непосредственно из потока ввода.
      RequestEntity entity = new StringRequestEntity(requestFileContents.toString(), 
        "text/xml",  "utf-8");
      post.setRequestEntity(entity);
      
      // Возвращает число, показывающее статус отклика	    
      int result = client.executeMethod(post);
      String response = post.getResponseBodyAsString();
      return response;
    } 
    finally 
    {
      // После того, как все сделано, освободите соединение в пул соединений
      post.releaseConnection();
     }
  }
}

Обратите внимание на то, что код изменился - в него добавлены новые строки между комментариями , относящимися к безопасности. Код в контрольном примере JUnit изменять не придется, потому что он делегирует вызов Web-сервиса классу SampleHttpClient. Кроме того, обратите внимание на то, что регистрационные данные пользователя передаются через объект UsernamePasswordCredentials .

И наконец, чтобы протестировать Web-сервис, запустите контрольный пример, как описывалось в части 2. Сверьте ожидаемый и реальный отклики от Web-сервиса.

Заключение

В этой статье мы на практике изучили процесс автоматизации тестирования защищенного Web-сервиса. В частности, вы научились:

  • Определять параметры безопасности на Web-сервисе;
  • Настраивать параметры безопасности на сервере приложений WebSphere Application Server;
  • Верифицировать безопасность Web-сервиса;
  • Тестировать Web-сервис при помощи HttpClient и XMLUnit.

Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=18508