Мохан К. Джадхав, Мансур Ахмед
Все чаще Web-сервисы становятся основными компонентами в бизнес-приложениях. С появлением таких парадигм, как сервис-ориентированная архитектура (Service-Oriented Architecture, SOA), разработчики все больше внимания уделяют Web-сервисам. При этом вопросы тестирования Web-сервисов для важных сервис-ориентированных приложений приобретюет большую значимость. В результате быстрого создания и развертывания сложных Web-сервисов перед группой обеспечения качества возникают дополнительные проблемы. Автоматизация тестирования Web-сервисов может помочь группе эффективно управлять объемом работ.
Тестирование Web-сервисов обычно включает следующие задачи:
- Генерирование клиентского или скелетного кода для Web-сервиса;
- Определение входных данных теста;
- Вызов Web-сервиса при помощи клиентского или скелетного кода;
- Сверка реального и ожидаемого отклика.
Из всех перечисленных действий наибольших усилий требуют генерирование скелетного кода и верификация отклика.
Для генерирования скелетного кода для 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-сервисе систему безопасности. Чтобы использовать систему безопасности, выполните следующие шаги:
- Откройте Rational Software Architect;
- Выберите команду Window > Open Perspective > Java;
- Разверните элемент Sample Project;
- Выполните двойной щелчок на элементе Deployment Descriptor;
- Перейдите на вкладку Security, как показано на рисунке 1.
Рисунок 1. Вкладка Security в дескрипторе развертывания
Далее мы создадим новую роль для нашего приложения. Позже мы предоставим пользователям, принадлежащим к этой конкретной роли, привилегии доступа к Web-сервису;
- В секции Security Roles нажмите кнопку Add для создания новой роли;
- В диалоговом окне Add Security Role введите имя роли и ее описание, например, SampleRole;
- Нажмите кнопку Finish , чтобы закрыть окно Add Security Role, как показано на рисунке 2;
Рисунок 2. Добавление роли безопасности
- В секции Security Constraints нажмите кнопку Add для создания нового ограничения безопасности. Определяя это ограничение, в действительности вы накладываете ограничения на то, какие роли к каким ресурсам будут обращаться;
- В окне Add Constraints введите имя ограничения, например, Sample Constraint, как показано на рисунке 3;
Рисунок 3. Добавление ограничения
- Нажмите кнопку Next.
- В секции Add Web Resource введите сведения, показанные на рисунке 4;
Рисунок 4. Добавление Web- ресурса
- Нажмите кнопку Finish;
- В секции Authorization Roles нажмите кнопку Add , чтобы предоставить роли разрешение на доступ к Web-сервису, как показано на рисунке 5;
Рисунок 5. Разрешения роли
- В окне Add Authorization Constraint выделите роль SampleRole и введите описание, например, такое: Sample Auth Constraint;
- Нажмите кнопку Finish.
Теперь мы определим тип транспортной гарантии, которую необходимо обеспечить между клиентом и сервером. Для нашего примера Web-сервиса выберите вариант без гарантии;
- Перейдите в секцию User Data Constraint на вкладке Security, показанную на рисунке 6;
Рисунок 6. Ограничение пользовательских данных
- Из раскрывающегося списка Type выберите NONE;
- Сохраните эту конфигурацию, выбрав команды File > Save;
- Разверните EAR-файл для проекта SampleProject и выполните двойной щелчок на элементе Deployment Descriptor, как показано на рисунке 7;
Рисунок 7. Дескриптор развертывания EAR
- Перейдите на вкладку Security и нажмите кнопку Gather. Мастер выполнит сбор всех ролей, определенных для приложения. Например, он добавит в список роль SampleRole, как показано на рисунке 8.
Рисунок 8. Сбор ролей
Далее мы добавим в роль SampleRole пользователя;
- Создайте в локальной операционной системе нового пользователя с именем SampleUser и паролем SampleUser. Это имя будет использоваться для доступа к Web -сервису;
- Нажмите на SampleRole и установите флажок в поле Users/Groups;
- Добавьте имя пользователя SampleUser;
- Сохраните конфигурацию;
- Разверните приложение, нажав правой кнопкой мыши на SampleProject и выбрав команду Run As.
Активизация системы безопасности на сервере приложений WebSphere Application Server
В предыдущем разделе мы использовали систему безопасности на учебном Web-сервисе и развернули этот Web-сервис на сервере приложений WebSphere Application Server. В этом разделе мы активизируем систему безопасности на сервере приложений WebSphere Application Server.
- Откройте консоль WebSphere Administrator. Как правило, для этих целей можно использовать URL http://localhost:9060/admin;
- Перейдите к категории Security > Global Security;
- Выберите ссылку Custom в категории User Registries;
- Введите любые имя пользователя и пароль в поле Server user ID, вам придется использовать эти данные для доступа к реестру пользователей WebSphere Application Server; нажмите кнопку Apply , чтобы применить изменения.
Примечание: Если вы уже задали идентификатор пользователя и пароль, переходите к следующему шагу;
- Вернитесь к Security > Global Security;
- Установите флажок Enable global security. Убедитесь, что флажок Enforce Java 2 security снят, как показано на рисунке 9;
Рисунок 9. Активизация глобальной системы безопасности
- Убедитесь, что вариант Local OS выбран в раскрывающемся списке Active user registry;
- Примените изменения.
Далее мы сопоставим пользователей ролям приложений в WebSphere Application Server;
- Перейдите к категории Applications > Enterprise Applications, как показано на рисунке 10;
Рисунок 10. Enterprise applications
- Нажмите мышью на ссылке SampleProjectEAR, как показано на рисунке 11;
Рисунок 11. Пример EAR-файла
- Нажмите на ссылку Map security roles to users/groups в секции Additional Properties, как показано на рисунке 12;
Рисунок 12. Сопоставление пользователей ролям безопасности
- Выберите роль SampleRoleи нажмите кнопку Look up users;
- Нажмите кнопку Search, как показано на рисунке 13;
Рисунок 13. Поиск ролей
- Выберите пользователя, например, SampleUser, которого вы создали в локальной операционной системе;
- Нажмите кнопку >>, чтобы добавить имя пользователя в список, расположенный с правой стороны;
- Примените изменения;
- Нажмите кнопки OK на всех страницах, чтобы сохранить изменения в главной (master) конфигурации;
- Перезапустите WebSphere Application Server.
Верификация безопасности Web-сервиса
В предыдущем разделе мы активизировали систему безопасности для учебного Web -сервиса и настроили параметры безопасности WebSphere Application Server. В этом разделе мы убедимся в том, что система безопасности на Web-сервисе активизирована.
Чтобы проверить, активизирована ли система безопасности на Web-сервисе, выполните следующие шаги:
- Откройте Web-браузер;
- Введите URL Web-сервиса. Браузер предложит ввести имя пользователя и пароль;
- Введите 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.