Тестирование приложения на основе источников данных с помощью JUnit и IBM Rational Application Developer

В типичных корпоративных приложениях, состоящих из множества компонентов, может потребоваться модуль, который предлагает исключительно службы, относящиеся к базе данных (БД). Часто подобные специализированные модули используют источники данных, определенные в сервере приложений J2EE (например, IBM WebSphere Application Server). Поскольку эти модули находятся в контексте серверов приложений, их тестирование иногда может вызывать сложности. Один из самых частых способов их тестирования - это создание тестового приложения, которое использует компонент на базе источника данных, и последующее развертывание этого тестового приложения на сервер приложений. В таких случаях разработка тестовых приложений может потребовать от вас значительных усилий. Эта статья описывает методику тестирования компонентов на базе источников данных, которые могут развертываться на сервере приложений (например, WebSphere Application Server Version 6.0.2), с помощью JUnit на платформе IBM Rational Application Developer Version 7.0. В качестве примера компонента в этой статье используется простое приложение на базе Java™, которое предоставляет простую службу аутентификации пользователя. Статья предназначена для тех разработчиков, которые уже знакомы со средой JUnit и обладают рабочими знаниями продукта Rational Application Developer.

Введение

Довольно часто компонентные приложения используют несколько компонентов, которые, в свою очередь, используют ресурсы на сервере и работают в контексте сервера. Например, набор классов Java может использовать источник данных для популярной РСУБД (реляционной системой управления БД), сконфигурированной на сервере приложений. Эти объекты Java, таким образом, используют во время работы источник данных в контексте сервера.

Тестирование компонентов, которые используют ресурсы сервера, несколько затруднительно, поскольку эти компоненты находятся в контексте сервера. Подобные компоненты можно протестировать на уровне модуля одним из следующих способов.

  • Модульное тестирование компонента с локальным ресурсом. Например, предположим, что компонент использует источник данных РСУБД, настроенный на сервере приложений. Тогда тестирование этого компонента может включать в себя настройку его для локальной РСУБД или любой другой файловой системы. Хотя этот подход и помогает, если вы просто хотите быстро протестировать компонент без особой связи с серверными ресурсами, у него есть один недостаток. Он не отражает реальную среду, в которой находится компонент.
  • Модульное тестирование компонента путем создания поверх него приложения-оболочки с последующим развертыванием этой оболочки на сервере вместе с компонентом. Однако недостатком этого подходя является то, что разработка тестового приложения-оболочки может потребовать значительных усилий.
  • Модульное тестирование компонента путем запуска тестового кода в том же контексте, что и у компонента. Например, тестовый код можно запустить в самом серверном контексте, где будет работать компонент.

Данная статья описывает именно последний подход. В ней рассказано, как тестировать основанный на источнике данных компонент, который можно развернуть на сервере приложений с помощью среды JUnit и платформы Rational Application Developer.

Необходимое программное обеспечение

Мы предполагаем, что для выполнения примеров этой статьи у вас установлено и правильно настроено следующее программное обеспечение (ПО).

1.        WebSphere Application Server V6.0.2 или более поздняя версия (здесь и далее это ПО будет называться WebSphere).

2.        IBM® DB2® Enterprise Server Version 9.0 или более поздняя версия (здесь и далее это ПО будет называться DB2).

3.        Rational Application Developer V7.0 или более поздняя версия.

4.        JUnit V3.8.1 или более поздняя версия (здесь и далее это ПО будет называться JUnit).

Для получения дополнительной информации об указанном ПО см. раздел "Ресурсы".

Пример приложения

Чтобы сделать представленные в статье концепции понятнее, мы используем следующее приложение-пример, которое для хранения и извлечения данных использует систему DB2.

Предположим, что приложение устанавливает подлинность пользователя, который вводит свое имя и пароль. Также предположим, что список пользовательских имен и паролей уже загружен в БД, и что приложение проверяет соответствие этим данным каждый раз, когда пользователь пытается зарегистрироваться в приложении.

Теперь, в этом сценарии, компонент аутентификации должен взять в качестве входных параметров имя пользователя и пароль, проверить их соответствие данным в БД, и вернуть соответствующее сообщение о подтверждении личности пользователя. Таким образом, компонент аутентификации может использовать следующие классы (см. рис. 1):

  • класс User, который абстрагирует пользователя в приложении;
  • класс DataSource, который обеспечивает связь между БД и приложением;
  • класс Authenticator, который на самом деле проверяет соответствие введенных данных пользователя информации в БД.

Рисунок 1. Диаграмма класса для приложения-примера.

 

После создания приложения-примера мы создадим проект с клиентом приложения, который содержит контрольные примеры JUnit для приложения-примера. Этот проект клиента будет храниться на сервере, где выполняются контрольные примеры.

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

Подготовка приложения

Перед созданием примера приложения с компонентом аутентификации и тестового клиента приложения создайте необходимые объекты БД и данные в БД, а также настройте источник данных в WebSphere.

Создание необходимых объектов и данных в БД

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

1.        Для нашего примера создайте в DB2 БД под названием SAMPLEDB .

2.        Создайте в ней таблицу под названием SAMPLEUSER . Это делается с помощью команды, показанной в листинге 1.

Листинг 1. Создание таблицы для упражнений.

               

CONNECT TO SAMPLEDB;

CREATE TABLE SAMPLEUSER (

  USERNAME VARCHAR (50) NOT NULL,

  PASSWORD VARCHAR (20) NOT NULL

);

CONNECT RESET;

3.        Добавьте в таблицу данные пользователя, как показано в листинге 2.

Листинг 2. Создание данных для упражнений.

               

CONNECT TO SAMPLEDB;

INSERT INTO SAMPLEUSER (USERNAME, PASSWORD) VALUES ('Mohan','mohan');

Настройка источника данных для DB2 в WebSphere Application Server

Процедуру настройки источника данных в WebSphere для БД, созданной нами в DB2, можно посмотреть в WebSphere InfoCenter.

Подробнее об источниках данных в WebSphere можно узнать в разделе "Ресурсы".

Тестирование приложения-примера

Теперь, когда мы кратко описали шаги и определили приложение, необходимо выполнить следующие задачи, чтобы, наконец, протестировать наш пример.

1.        Создание приложения-примера.

2.        Создание проекта для тестового клиента приложения.

3.        Настройка ресурсов для проекта клиента.

4.        Создание контрольных примеров JUnit для приложения.

5.        Создание рабочей конфигурации для проекта клиента приложения.

Создание приложения-примера

Вам не нужно создавать ранее описанный компонент аутентификации.

1.        Откройте Rational Application Developer и создайте новый Java-проект под названием SampleDataSourceApp.

2.        Создайте два пакета с названиями com.ibm.datasource.sample и com.ibm.datasource.sample.db. Они будут размещаться в папке для исходных кодов проекта SampleDataSourceApp.

3.        Создайте классы User.java, SampleDataSource.java и Authenticator.java, как показано в листингах с 3 по 5.

Листинг 3. User.java

               

package com.ibm.datasource.sample;

public class User {

  private String userName;

  private String password;

  public User() {}

  public User(String name, String pwd) {

    userName = name;

    password = pwd;

  }

  public String getUserName() { return userName; }

  public String getPassword() { return password; }

  public void setUserName(String userName) { this.userName = userName; }

  public void setPassword(String password) { this.password = password; }

}

Листинг 4. Authenticator.java

               

package com.ibm.datasource.sample;

import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.Statement;

import com.ibm.datasource.sample.db.SampleDataSource;

public class Authenticator {

  public static boolean isAuthentic(User user) {

    boolean authentic = false;

   

    try {

      SampleDataSource sampleDataSource = SampleDataSource.getDataSource();             

      Connection connection = sampleDataSource.getConnection();                                      

      Statement statement = connection.createStatement();                                  

      String sql = "SELECT count(*) AS count FROM SAMPLEUSER WHERE username='"

        + user.getUserName() + "' and password='" + user.getPassword() + "'";                                        

      ResultSet resultSet = statement.executeQuery(sql);               

      

      if(resultSet != null) {

        if(resultSet.next()) {

          int count = resultSet.getInt("count");

          if(count > 0) { authentic = true; }

        }

      }

    } catch(Exception e) { e.printStackTrace(); }

    return authentic;

  }

}

Листинг 5. SampleDataSource.java

               

package com.ibm.datasource.sample.db;

import java.sql.Connection;

import java.sql.SQLException;

import javax.naming.InitialContext;

import javax.naming.NamingException;

import javax.sql.DataSource;

public class SampleDataSource {

  public static final String resourceRefName="jdbc/SampleDataSource";

  private static SampleDataSource sampleDataSource = null;      

  private DataSource dataSource = null;                   

  protected SampleDataSource() {}     

  private void setupDataSource() throws SQLException {

    try {

      InitialContext ctx = new InitialContext();

      dataSource = (DataSource)ctx.lookup(resourceRefName);

    } catch(NamingException e) { e.printStackTrace(); }

  }

  public static synchronized SampleDataSource getDataSource() throws SQLException {

    if(sampleDataSource == null) {

      try {

        sampleDataSource = new SampleDataSource();

        sampleDataSource.setupDataSource();

      } catch(SQLException e) { e.printStackTrace(); }

    }

    return sampleDataSource;

  }

  public Connection getConnection() throws SQLException        {

    return dataSource.getConnection();

  }

}

Модель должна выглядеть аналогично рисунку 2.

 

Создание проекта для клиента приложения

В предыдущем разделе мы создали компонент аутентификации, где метод isAuthentic() в классе Authenticator вызывает экземпляр класса User и проверяет данные, введенные пользователем, на соответствие данным в БД.

Теперь код для проверки подлинности готов, так что в этом разделе мы теперь создадим проект для тестового клиента.

1.        Перейдите в меню New > Project > Application client project (Создать > Проект > Проект для клиента приложения).

На странице модуля клиента приложения (Application client module) введите нужные данные, как показано на рис. 3.

Рисунок 3. Модуль клиента приложения.

 

1.        Нажмите Next ("Далее").

На странице данных проекта (Project Facets) оставьте все значения, установленные по умолчанию, как показано на рис. 4.

 

1.        Нажмите Next ("Далее").

Уберите флажок с опции Create a default main class ("Создать класс main по умолчанию"), как показано на рис. 5.

Рисунок 5. Модуль клиента приложения.

1.        Нажмите Finish ("Готово").

Настройка ресурсов для проекта клиента приложения

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

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

1.        В представлении Project Explorer раскройте проект SampleDataSourceAppTest и дважды щелкните мышью дескриптор развертывания.

Выберите закладку References ("Ссылки"), как показано на рис. 6.

Рисунок 6. Модуль клиента приложения.

]

 

1.        Нажмите Add ("Добавить").

Выберите опцию Resource reference ("Ссылки на ресурсы"), как показано на рис. 7.

Рисунок 7. Добавление ссылок на ресурсы.

 

1.        Нажмите Next ("Далее").

2.        Внесите данные следующим образом (см. рис. 8):

o    Name: SampleDataSource;

o    Type: javax.sql.DataSource;

o    Authentication: Container;

o    Sharing scope: Shareable;

Description: Sample data source.

Рисунок 8. Ссылка на ресурс.

 

1.        Нажмите Finish ("Готово").

В разделе JAAS login information выберите опцию Use default method ("Использовать метод по умолчанию"). Кроме того, сделайте псевдоним для аутентификации таким же, как тот псевдоним, который вы создали при определении источника данных в WebSphere (как показано на рис. 9).

Рисунок 9. Настройка элементов аутентификации.

 

1.        Сохраните дескриптор развертывания.

Создание контрольных примеров JUnit для приложения

В этом разделе мы добавим контрольные примеры JUnit для приложения-примера.

Создайте пакет com.ibm.datasource.sample.test в папке appClientModule, как показано на рис. 10.

Рисунок 10. Создание пакета для тестов JUnit.

Щелкните на пакете правой кнопкой мыши и выберите пункт меню New > Other > JUnit Test Case (Создать > Другое > Контрольный пример JUnit). Появится экран, показанный на рис. 11.

Рисунок 11. Контрольный пример JUnit.

 

1.        В нижней части диалогового окна, показанного на рис. 11, мастер попросит вас добавить библиотеки JUnit, щелкнув по ссылке Click here ("Щелкните здесь"). Щелкните ссылку и добавьте библиотеки JUnit в проект для клиента приложения.

2.        Введите UserAuthenticationTest в поле Name. Это будет название контрольного примера.

3.        Добавьте к тестовым классам код, показанный в листинге 6.

Листинг 6. UserAuthenticationTest

                

package com.ibm.datasource.sample.test;

import com.ibm.datasource.sample.Authenticator;

import com.ibm.datasource.sample.User;

import junit.framework.TestCase;

public class UserAuthenticationTest extends TestCase {

  public void testAuthenticUser() {

    User user = new User("Mohan","mohan");

    assertTrue(Authenticator.isAuthentic(user));

  }

  public void testNonAuthenticUser() {

                    // пароль для пользователя "Mohan" неверен

    User user = new User("Mohan","");                                       

    assertFalse(Authenticator.isAuthentic(user));      

  }

}

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

6.        В проектеSampleDataSourceAppTest создайте папку lib. Затем экспортируйте проект SampleDataSourceApp в архивный файл Java™ (JAR), расположенный в папке lib.

7.        Добавьте этот файл JAR в путь сборки проекта SampleDataSourceAppTest.

8.        Запустите сборку проекта.

Теперь мы создадим набор тестов. Щелкните правой кнопкой мыши на пакете com.ibm.datasource.sample.test и выберите пункт меню New > Other > JUnit Test Suite (Создать > Другое > Набор тестов JUnit). Появится диалоговое окно, показанное на рис. 12.

Рисунок 12. Набор тестов JUnit.

 

6.        Нажмите Finish ("Готово").

7.        Проект для клиента приложения требует наличия обязательного класса main, который содержит стандартный для Java выполняемый метод main. Сейчас мы добавим метод main в класс AllTests.java. Добавьте метод main() к классу AllTests.java, как показано на рис. 7.

Листинг 7. AllTests.java

               

package com.ibm.datasource.sample.test;

public class AllTests {

  public static void main(String[] av) { 

    junit.textui.TestRunner.run(UserAuthenticationTest.class);

  }

}

12.     Теперь сделайте AllTests.java классом main для проекта клиента приложения. Снова откройте дескриптор развертывания для проекта клиента приложения.

В закладке Overview отредактируйте поле Main Class таким образом, чтобы оно указывало на класс AllTests.java, как показано на рис. 13.

Рисунок 13. Настройка класса Main.

 

12.     Сохраните дескриптор развертывания.

Создание рабочей конфигурации для клиента приложения.

В предыдущих разделах вы в Rational Application Developer создали приложение-пример и проект для тестового клиента приложения. Вы также создали два теста JUnit в контрольном примере и добавили в проект для тестового клиента приложения серверные ресурсы.

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

1.        Щелкните правой кнопкой мыши на проекте клиента приложения и выберите пункт меню Run As > Run (Выполнить как > Выполнить).

Поскольку проект клиента приложения создан для WebSphere Application Server V6.0, выберите на левой панели WebSphere v6.0 App Client, как показано на рис. 14.

Рисунок 14. Новая рабочая конфигурация.

 

1.        Чтобы создать новую конфигурацию, щелкните на пиктограмме, расположенной вверху слева на экране.

Задайте название конфигурации (в данном случае это "SampleDataSource App test"), как показано на рис. 15.

Рисунок 15. Создание, управление и запуск конфигураций.

 

1.        Убедитесь, что поля Enterprise application ("Корпоративное приложение") и Application client module ("Модуль клиента приложения") содержат правильные значения.

Также убедитесь в том, что файл SampleDataSourceApp.jar включен в переменную окружения classpath, как показано на рис. 16.

Рисунок 16. Переменная Classpath для рабочего окружения.

 

1.        Кроме того, добавьте в переменную classpath рабочей конфигурации JAR-файлы драйверов для DB2.

2.        Для сохранения настроек конфигурации щелкните Apply ("Применить").

В следующем разделе мы запустим тесты.

Запуск контрольных примеров JUnit для тестирования приложения-примера

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

1.        Откройте представление Servers ("Серверы"). Для этого в рабочей области Rational Application Developer  выберите пункты меню Window > Show View > Other > Server > Servers (Окно > Показать представление > Другое > Сервер > Серверы).

Запустите WebSphere. Для этого в представлении Servers щелкните правой кнопкой мыши строку WebSphere Application Server v6.0, как показано на рис. 17.

Рисунок 17. Представление Servers.

 

1.        Теперь, после запуска WebSphere, щелкните правой кнопкой мыши проект для клиента приложения и выберите пункты меню Run As > Run.

Выберите конфигурацию, которую вы настроили в предыдущем разделе, как показано на рис. 18.

Рисунок 18. Выбор рабочей конфигурации.

 

1.        Щелкните Run, чтобы запустить тесты JUnit.

Результаты выполнения теста должны появиться на консоли, как показано на рис. 19.


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