Разработка
В данном примере мы создадим простой проект в котором мы используем инструмент сборки проектов 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.
Следующим этапом нам надо сделать следующие вещи:
- Обновить схему БД(создать таблицы для сущностей, если появились новые свойства сущностей, добавить колонок). Изменение типов колонок и удаление колонок автоматически не работает, в данном случае эту раоту надо делать вручную или удалить всю тестовую БД, после чего будет создана нормальная структура БД.
- После обновления структуры БД надо отчистить от "левых" данных. И наполнить БД "идеальными" данными, для которых спроектированны тесты.
Выполнение этих задач возложено на Maven. Для этого при сборке используются два плгина:
- org.codehaus.mojo.hibernate3-maven-plugin. Данный плагин использует Hibernate сущности из проекта. Проверяет актуальность структуры БД. И добавляет необходимые таблицы и колонки в БД.
- org.codehaus.mojo.sql-maven-plugin. Данный плагин выполняет указанные SQL скрипты над нужной БД.
Все параметры для проекта я хроню в файле build.properties. В данном файле указаны все необходимые настройки для подключения к БД и конфигурировании Hibernate.
Что делает Maven во время сборки проекта:
- На этапе compile происходит обновление структуры БД. Об этом говорит строка true.
- На этапе process-test-resources. Происходит выполнение скрипта src/test/resources/dropdata.sql, который очищает таблицы БД от всех данных, которые в ней сейчас находятся.
- На этапе компиляции тестовых классов (test-compile), Maven выполняет скрипт наполнения БД из файла src/test/resources/createtestdata.sql
Пример полностью можно выкачать из SVN репозитория https://gubber-samples.googlecode.com/svn/trunk/smpl-001. Либо просмотреть здесь
(новое окно)
Добавить комментарий