Архив

Powered by mod LCA

Разработка

Первый тест

В данном примере мы создадим простой проект в котором мы используем инструмент сборки проектов Maven 2, фреймоврк Spring, ORM Hibernante, и библиотеку для тестирования JUnit.

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

@Entity
@Table(name = "TE_USERS")
@NamedQueries({
        @NamedQuery(
                name = "findUserByLoginAndPassword",
                query = "select u from User u where LOWER(u.login)=LOWER(:login) and u.password=:password"
        )
})
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ID")
    private long id;
    @Column(name = "LOGIN")
    private String login;
    @Column(name = "PASSWORD")
    private String password;
    @Column(name = "FIO")
    private String fio;

    ...

}

Как видно, данный класс транслируется на таблицу "TE_USERS". А так же в классе определён запрос поиска пользователя по комбинации логин/пароль. Причём в запросе определено, что поиск по логину идёт без учёта регистра, а пароль регистрозависимый.  

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

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:appcontext.xml"})
public class FindUserTest extends TestCase {
    @Autowired
    private UserProcessor userProcessor;

    @Test
    public void testRightLogin() {
        User user = userProcessor.findUserByLoginAndPassword("login1", "password1");
        assertNotNull(user);
    }

    @Test
    public void testUppercaseLogin() {
        User user = userProcessor.findUserByLoginAndPassword("LOGIN1", "password1");
        assertNotNull(user);
    }

    @Test
    public void testUppercasePassword() {
        User user = userProcessor.findUserByLoginAndPassword("login1", "PASSWORD1");
        assertNull(user);
    }
}

В первой строке теста мы говорим, что JUnit тест выполняется с использованием Spring-фрейворка. На второй строке мы указываем, откуда брать Spring-контекст. Первые два метода проверяют, что регистр ввода логина не влияет на выдачу результата - мы получаем сущность пользователя отличную от null. В последнем методе обраьная ситуация, когда ввод логина в неправильном регистре должен приводить к возврату null.

Следующим этапом нам надо сделать следующие вещи:

  1. Обновить схему БД(создать таблицы для сущностей, если появились новые свойства сущностей, добавить колонок). Изменение типов колонок и удаление колонок автоматически не работает, в данном случае эту раоту надо делать вручную или удалить всю тестовую БД, после чего будет создана нормальная структура БД.
  2. После обновления структуры БД надо отчистить от "левых" данных. И наполнить БД "идеальными" данными, для которых спроектированны тесты.

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

  1. org.codehaus.mojo.hibernate3-maven-plugin. Данный плагин использует Hibernate сущности из проекта. Проверяет актуальность структуры БД. И добавляет необходимые таблицы и колонки в БД.
  2. org.codehaus.mojo.sql-maven-plugin. Данный плагин выполняет указанные SQL скрипты над нужной БД.

Все параметры для проекта я хроню в файле build.properties. В данном файле указаны все необходимые настройки для подключения к БД и конфигурировании Hibernate.
Что делает Maven во время сборки проекта:

  1. На этапе compile происходит обновление структуры БД. Об этом говорит строка true.
  2. На этапе process-test-resources. Происходит выполнение скрипта src/test/resources/dropdata.sql, который очищает таблицы БД от всех данных, которые в ней сейчас находятся.
  3. На этапе компиляции тестовых классов (test-compile), Maven выполняет скрипт наполнения БД из файла src/test/resources/createtestdata.sql

Пример полностью можно выкачать из SVN репозитория https://gubber-samples.googlecode.com/svn/trunk/smpl-001. Либо просмотреть здесьздесь(новое окно)

Добавить комментарий