Где хранить ожидаемый результат теста? - PullRequest
5 голосов
/ 18 мая 2011

Написание теста Я ожидаю, что тестируемый метод выдаст определенные результаты. Обычно я проверяю, что для данной операции базы данных я получаю определенный вывод. Моя практика обычно заключалась в написании массива в виде файла быстрой карты / свойств в самом тесте. Это быстрое решение, не подверженное изменениям внешнего файла во время выполнения для загрузки ожидаемых результатов.

Решение состоит в том, чтобы поместить данные в исходный файл Java, поэтому я раздуваю тест меньше и все же получаю проверенный во время компиляции тест. Как насчет этого?

Или загрузка ожидаемых результатов в качестве ресурсов - лучший подход? Файл .properties недостаточно хорош, поскольку у меня может быть только одно значение на ключ. commons-config путь?

Я бы предпочел простое решение, в котором я называю свойства для ключа, поэтому для каждой записи у меня может быть значение свойства doc-length и numFound (звучит как элементы узла xml)?

Как вы идете об этом?

Ответы [ 3 ]

3 голосов
/ 18 мая 2011

Вы должны помнить о ведении таких тестов.После написания нескольких тестов веб-сервисов с поддержкой тестов Spring-WS я должен признать, что хранение запросов (настройка теста) и ожидаемых ответов во внешних XML-файлах было не очень хорошей идеей.Каждая пара запрос-ответ имеет тот же префикс имени, что и тестовый пример, поэтому все было автоматизировано и очень чисто.Но все же рефакторинг и диагностика ошибок теста становятся болезненными.Через некоторое время я понял, что встраивание XML в тестовый пример в виде String, хотя и некрасиво, гораздо проще в обслуживании.

В вашем случае я предполагаю, что вы вызываете какой-то запрос к базе данных и получаете ответный список карт.А как насчет написания какого-нибудь симпатичного DSL, чтобы сделать утверждения об этих структурах?На самом деле, FEST-Assert вполне подходит для этого.

Допустим, вы тестируете следующий запрос (я знаю, что это упрощение):

List<Map<String, Object>> rs = db.query("SELECT id, name FROM Users");

, тогда вы можетепросто напишите:

assertThat(rs).hasSize(1);
assertThat(rs.get(0))
  .hasSize(2)
  .includes(
    entry("id", 7),
    entry("name", "John")
  )
);

Конечно, это можно и нужно еще больше упростить, чтобы лучше соответствовать вашим потребностям.Не проще ли иметь полный тестовый сценарий на одном экране, а не переходить от одного файла к другому?

Или, может быть, вам стоит попробовать Fitnesse (похоже, вы больше не выполняете юниттестирование, поэтому должна быть приемлема среда приемочного тестирования), где тесты хранятся в вики-подобных документах, включая таблицы?

2 голосов
/ 18 мая 2011

Учитывая, что вы упоминаете, что обычно проверяете, что определенная операция БД возвращает ожидаемый результат, вы можете захотеть взглянуть на использование DBUnit :

 // Load expected data from an XML dataset
    IDataSet expectedDataSet = new FlatXmlDataSetBuilder().build(new File("expectedDataSet.xml"));
    ITable expectedTable = expectedDataSet.getTable("TABLE_NAME");

    // Assert actual database table match expected table
    Assertion.assertEquals(expectedTable, actualTable);

DBUnit обрабатывает сравнение состояния таблицы после завершения какой-либо операции и подтверждает, что данные в таблице соответствуют ожидаемому DataSet. Наиболее распространенный формат для DataSet, с которым вы сравниваете фактическое состояние таблицы, вероятно, использует XmlDataSet, где ожидаемые данные загружаются из файла XML, но есть и другие подклассы.

Если вы уже проводите такое тестирование, похоже, вы уже написали большую часть той же логики, но DBUnit может предоставить вам дополнительные функции, которые вы еще не реализовали самостоятельно, бесплатно.

2 голосов
/ 18 мая 2011

Да, использование ресурсов для ожидаемых результатов (а также данных настройки) работает хорошо и довольно распространено.

XML вполне может быть полезным форматом для вас - иерархическая структура, безусловно, может помочь (один элемент на метод тестирования). Это зависит от конкретной ситуации, но это определенно вариант. Кроме того, JSON может быть проще для вас. Что вас устраивает с точки зрения API-интерфейсов сериализации?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...