Mocking и модульное тестирование Solr и Lucene Index
Нам нужен контроль данных в индексе solr производства, и нам нужно, чтобы он был совместим с новыми разработками. В идеале мы хотели бы смоделировать индекс на локальных машинах, запросить его с помощью solr и написать модульные тесты, чтобы запросить его для более быстрых итераций.
RamDirectory используется в другом вопросе, чтобы сделать что-то подобное, но вопрос от 2 лет назад. Этот пример, кажется, делает именно это (используя FSDirectory вместо RamDirectory). Это правильные подходы к этой проблеме? Есть ли лучшие способы сделать это?
Мы хотели бы написать такие тесты:
setup mock index;
query mock index;
assert(stuff that should be true);
teardown mock index;
РЕДАКТИРОВАТЬ: Дополнительные детали:
Мы думали, что создадим индекс, у нас будет простой способ добавления документов без индексатора и остальной части системы, за исключением, возможно, локальной базы данных, которую мы могли бы хранить в системе контроля версий. В прошлом мы генерировали индекс, а когда возникали несовместимости, мы обновляли его.
Если мы переиндексируем, мы добавляем много накладных расходов, и насмешка над индексатором не кажется хорошим вариантом, учитывая, что наш индексатор содержит много логики обработки данных (например, добавление данных в доступные для поиска поля из БД), Наш индексатор подключается к внешнему БД, поэтому нам тоже нужно это поддерживать. Мы могли бы иметь локальную тестовую базу данных, как указано выше, которая не имеет никаких накладных расходов.
После того, как у нас есть тестовая база данных, нам нужно построить индекс, а затем мы можем перейти по второй ссылке выше. Возникает вопрос: как быстро построить индекс для тестирования, скажем, документов размером 1000?
Проблема в том, что нам нужно поддерживать синхронизацию локальной схемы БД с производственной схемой. Производственная схема меняется достаточно часто, что является проблемой. Нам бы хотелось иметь тестовую инфраструктуру, которая была бы достаточно гибкой, чтобы справиться с этим - на данный момент мы просто перестраиваем базу данных каждый раз, что медленно и бесит других людей!
1 ответ
Если вы используете Solr, я бы даже не стал насмехаться или эмулировать (т.е. не менять его конфигурацию).
Вместо этого напишите интеграционный тест, который устанавливает ваш индекс Solr. Настройка будет заключаться в том, чтобы просто индексировать данные, как вы это обычно делаете. Возможно, вы захотите, чтобы ваши разработчики запускали свой собственный solr.
Я не стал бы сильно беспокоиться о скорости, потому что solr индексирует невероятно быстро (100000 документов менее чем за 30 секунд для нашей среды... на самом деле бутылочная горловина извлекает данные из базы данных).
Поэтому на самом деле ваш фиктивный индекс должен быть небольшим подмножеством производственных данных, которые вы будете индексировать в solr (вы можете сделать это один раз для каждого класса TestCase с помощью @BeforeClass).
РЕДАКТИРОВАТЬ (на основе ваших правок):
Я расскажу вам, как мы это делаем (и как я видел, как это делают другие):
У нас есть схема разработки / DB и производственная схема / DB. Когда разработчики работают над чем-то, они просто копируют базу данных разработки "сборки машин" и восстанавливают ее локально. Эта база данных намного меньше производственной базы данных и идеально подходит для тестирования. Ваша производственная база данных не должна сильно отличаться от вашей схемы разработки (делайте меньшие изменения и выпускайте чаще, если это так).