Я программирую на Java, и мои приложения активно используют БД. Следовательно, для меня важно иметь возможность легко протестировать использование моей БД.
Что такое тесты БД? Для меня они должны предоставить два простых требования:
- Проверка синтаксиса SQL.
- Что еще более важно, проверьте, что данные выбраны / обновлены / вставлены правильно, в соответствии с данной ситуацией.
Что ж, похоже, все, что мне нужно, это БД.
Но на самом деле я предпочитаю нет, так как при тестировании БД существует несколько трудностей:
- "Просто возьмите себе тестовую базу данных, насколько это может быть сложно?" - Ну, на моем рабочем месте, иметь личное тестирование БД довольно невозможно. Вы должны использовать «публичную» БД, доступную для всех.
- «Эти тесты, конечно, не быстрые ...» - тесты БД, как правило, медленнее, чем обычные тесты. На самом деле не стоит проводить медленные тесты.
- "Эта программа должна обрабатывать все случаи!" - Это становится несколько раздражающим и даже невозможным, чтобы попытаться смоделировать каждый случай в БД. Для каждого случая необходимо выполнить определенное количество запросов на вставку / обновление, что раздражает и занимает много времени.
- "Подождите секунду, откуда вы знаете, что в этой таблице 542 строки?" - Один из основных принципов в тестировании - это возможность тестировать функциональность, отличную от функциональности вашего тестируемого кода. При использовании БД обычно есть один способ что-то сделать, поэтому тест в точности совпадает с кодом ядра.
Итак, вы можете понять, что мне не нравятся БД, когда дело доходит до тестов (конечно, мне придется в какой-то момент разобраться с этим, но я бы лучше попал туда позже, после того как обнаружил большинство ошибки, используя остальные методы испытаний). Но что я ищу?
Я ищу способ имитации БД, фиктивной БД, используя файловую систему или просто виртуальную память. Я подумал, что, возможно, есть инструмент / пакет Java, который позволяет просто создать (используя интерфейс кода) макет БД для каждого теста, с имитированными таблицами и строками, с проверкой 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-запросы довольно просты и не должны отличаться от одной платформы к другой.