2013-04-15 2 views
3

Я пишу модульные тесты для класса DAO, с которым я только что вносил некоторые изменения. Поскольку производительность этого DAO очень важна, поэтому я хочу сделать некоторую проверку производительности в модульных тестах. И поскольку мои изменения для этого DAO могут вызвать несколько запросов, я хочу проверить, запрашивает ли DAO DB только один раз. Если нет, модульный тест должен завершиться неудачей.Проверьте производительность DAO/время запроса в модульном тесте

Я не знаю, возможно ли это. Пожалуйста, помогите :)

ответ

0

для тестирования времени вы можете использовать

тайм-аут аннотаций как.

@Test (таймаут = 500)

1

Тестирование производительности в модульных тестах будет бесполезна, если вы не копируют реальную БД, и это полезная нагрузка. Конечно, вы могли бы измерить время, необходимое для выполнения запроса, но это результат чего? Запрос, который вы выполняете в модульных тестах, как это будет переводиться в те, которые используются для реальной БД?

Что вы можете измерить, так это то, как ваш новый запрос изменился по сравнению с старым в модульных тестах. Я бы использовал рамки для этого (вы должны учитывать JVM-разминку здесь, и может быть, в каркасе также есть кеширование, которое должно прогреться), я бы порекомендовал: Caliper

Также, если у вас есть вопросы которые должны выполняться только один раз против БД, звучит очень похоже на то, что вам нужен кеш. Если это не слишком сложно вы можете посмотреть на

Cache

0

вы можете вводить код (используя aspectJ, например) для подсчета DB доступа - всякий раз, когда вы запрашиваете БД увеличивает счетчик и принять временные мерки.

Более простым решением было бы использовать анонимный класс при создании экземпляра DAO в контексте тест:

DAObject dao = new DAObject(){ 
         @override 
         public void QueryDB(args){ 
          incrementCounter(); 
          long startTime = System.currentTimeMillis(); 
          super.QueryDB(args); 
          _queryTime = System.currentTimeMillis() - startTime; 
         } 
        } 

, а затем

assertEquels(counter,1); 
assertTrue(_queryTime < MAX_ALLOWED_TIME); 
Смежные вопросы