Интеграционный тест для JUnit - PullRequest
0 голосов
/ 07 июня 2011

Я вообще новичок в TDD, поэтому, пожалуйста, прости меня, если мой вопрос не имеет большого смысла.

Посмотрев немного, кажется, что jUnit способен реализовать интеграционный тест. Я надеюсь, что сообщество может дать мне несколько советов о том, как написать интеграционный тест. Вот простой обзор моего дизайна.

У меня есть Main1, которые принимают список zip-файлов. Main извлечет zip-файлы, отредактирует содержимое pdf внутри zip-файлов и поместит окончательные pdf-файлы в папку X. Если число pdf достигнет THRESHOLD, тогда будет вызван Main2Processor (не основной класс), и все ZIP-файлы будут заархивированы, а также будет создан текстовый файл отчета с тем же именем, что и вновь созданный ZIP-файл.

Если я запускаю Main2, он также запускает Main2Processor, что приведет к заархивированию файла pdf и созданию отчетов в виде текстовых файлов (даже если число pdf в папке X не достигло THRESHOLD).

Как мне написать интеграционный тест, проверяющий правильность моего дизайна?

Ответы [ 4 ]

2 голосов
/ 07 июня 2011

Вы действительно хотите "интеграционный тест" (этот термин перегружен за пределами понимания сейчас, так что если бы вы могли указать свои конечные цели, которые могли бы помочь)? Как насчет приемочного теста, когда вы используете это приложение консоли / графического интерфейса как настоящий пользователь с определенным вводом и проверяете ожидаемый результат?

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

Если вы хотите провести интеграционный тест - вам придется изменить дизайн приложения, чтобы его можно было вызывать из тестов (если это не так). Поднимите конкретные препятствия для написания этого теста, и я могу предложить более конкретный совет.

2 голосов
/ 07 июня 2011

Ты прав; JUnit может использоваться для написания тестов, которые будут называться интеграционными тестами. Все, что вам нужно сделать, это ослабить правила испытаний, не затрагивая внешние ресурсы.

Во-первых, я бы реорганизовал main () вашего приложения, чтобы сделать как можно меньше; нет действительно хорошего способа проверить код в функции main (). Пусть он сконструирует и запустит объект (этот объект может быть объектом, содержащим main (), если хотите), передавая этому новому объекту свой список ZIP-файлов. Теперь этот объект можно протестировать с помощью JUnit, просто создав его экземпляр.

Теперь вам просто нужно спроектировать тест, чтобы настроить постоянную среду тестирования, а затем выполнить повторяемый тест. Создайте или очистите где-нибудь временный каталог, затем скопируйте в него несколько тестовых ZIP-файлов. Затем запустите ваш главный процессор.

Чтобы обнаружить, что при достижении порога происходит правильное поведение, вы просто проверяете наличие zip-файла (и / или его отсутствие, если порог не достигнут).

1 голос
/ 07 июня 2011

Прежде всего, вы можете описать приведенную выше спецификацию, но с точки зрения «тестовой последовательности».Например, один тест предоставил бы Main1 набор из N файлов PDF, где N меньше порога.Затем ваш тестовый код после возврата Main1 проверит содержимое папки X, а также отчеты, чтобы убедиться, что ваши ожидания оправданы.,И JUnit ориентирован на «модульные тесты» (но вы можете использовать его и для интеграционных тестов, несмотря на то, что некоторые ситуации не подходят: например, когда требуется глобальная настройка или когда тестовые примеры должны выполняться в определенномпорядок ...).

Некоторые дополнительные библиотеки могут значительно облегчить взаимодействие с остальным кодом: dbunit, httpunit и т. д.

1 голос
/ 07 июня 2011

Я думаю, что вы должны создать несколько утилит для своих тестов.Например, запуск приложения, проверка каталога, очистка каталога и т. Д.

Тогда вы сможете выполнить тестирование следующим образом:

@Test
public mytest1() {
    exec(Main1.class, "f1.zip", "f2.zip");
    Assert.assertTrue(getFileCount(OUTPUT_DIR) < THRESHOLD);
    // perform verification of your files etc...
}
...