Я программирую на Java, и мои приложения много используют DB. Следовательно, для меня важно, чтобы я мог легко проверить использование БД.
Что такое тесты БД? Для меня они должны предоставить два простых требования:
- Проверить синтаксис SQL.
- Что еще более важно, убедитесь, что данные выбраны/обновлены/вставлены правильно, в зависимости от конкретной ситуации.
Ну, тогда мне кажется, что мне нужна только база данных.
Но на самом деле, я предпочитаю не, поскольку существует несколько трудностей с использованием БД для теста:
- "Просто возьмите себе тестовую БД, как сильно это может быть?" - Ну, на моем рабочем месте, чтобы иметь личную тестовую БД, это довольно невозможно. Вы должны использовать "общедоступную" БД, доступную для всех.
- "Эти тесты верны не быстро..." - тесты БД имеют тенденцию быть медленнее, чем обычные тесты. Это действительно не идеальный вариант для медленных тестов.
- "Эта программа должна обрабатывать любой случай!" - Это становится несколько раздражающим и даже невозможным попытаться имитировать каждый случай в БД. Для каждого случая должно быть сделано определенное количество запросов на вставку/обновление, что раздражает и требует времени.
- "Подождите, как вы знаете, что в этой таблице есть 542 строки?" - Один из основных принципов тестирования - это возможность тестировать функциональность не так, как у тестируемого кода. При использовании БД обычно существует один способ сделать что-то, поэтому тест в точности совпадает с основным кодом.
Итак, вы можете понять, что мне не нравятся БД, когда дело доходит до тестов (конечно, мне нужно будет дойти до этого в какой-то момент, но я предпочел бы попасть туда позже на мое тестирование, после того как я нашел больше ошибок, использующих остальные методы тестирования). Но что я ищу?
Я ищу способ имитировать БД, макетную БД, используя файловую систему или просто виртуальную память. Я подумал, что, возможно, есть инструмент/пакет Java, который позволяет просто построить (используя интерфейс кода) DB mock для каждого теста с имитируемыми таблицами и строками с проверкой SQL и с интерфейсом кода для контроля его статуса (а не с использованием SQL).
Вы знакомы с этим инструментом?
Изменить: Спасибо за ответы! Хотя я просил инструмент, вы также предоставили мне несколько советов относительно проблемы:) Мне потребуется некоторое время, чтобы проверить ваши предложения, поэтому я не могу сказать прямо сейчас, не удовлетворяют ли ваши ответы.
В любом случае, здесь лучшее представление о том, что я ищу - Представьте себе класс с именем DBMonitor, что одной из его функций является поиск количества строк в таблице. Вот мнимый код того, как я хотел бы проверить эту функцию с помощью JUnit:
public class TestDBMonitor extends TestCase {
@Override
public void setUp() throws Exception {
MockConnection connection = new MockConnection();
this.tableName = "table1";
MockTable table = new MockTable(tableName);
String columnName = "column1";
ColumnType columnType = ColumnType.NUMBER;
int columnSize = 50;
MockColumn column = new MockColumn(columnName, columnType, columnSize);
table.addColumn(column);
for (int i = 0; i < 20; i++) {
HashMap<MockColumn, Object> fields = new HashMap<MockColumn, Object>();
fields.put(column, i);
table.addRow(fields);
}
this.connection = connection;
}
@Test
public void testGatherStatistics() throws Exception {
DBMonitor monitor = new DBMonitor(connection);
monitor.gatherStatistics();
assertEquals(((MockConnection) connection).getNumberOfRows(tableName),
monitor.getNumberOfRows(tableName));
}
String tableName;
Connection connection;
}
Надеюсь, этот код достаточно ясен, чтобы понять мою идею (извините за ошибки синтаксиса, я печатал вручную без моего дорогого Eclipse: P).
Кстати, я частично использую ORM, и мои необработанные SQL-запросы довольно просты и не должны отличаться от одной платформы к другой.