@Suite JUnit 4, передача данных, @Rule и устаревшие @Before и @After - PullRequest
2 голосов
/ 04 февраля 2011

Я работаю с некоторым унаследованным тестовым кодом, который использует класс TestSetup для настройки и демонтажа сервера вокруг набора тестовых классов, содержащих тесты.Я преобразовал классы для использования аннотаций junit и попытался использовать аннотации @Suite и @ Suite.Classes для определения набора.Но я врезался в стену.

Старая версия тестов расширяет TestSetup для циклического прохождения всех созданных экземпляров тестовых классов и введения в них различных ссылок на объекты сервера.Примером является ссылка на веб-контекст среды Spring.

Моя проблема заключается в том, что, используя аннотации, я не вижу способа передачи данных о приборах в созданные классы тестов перед выполнением тестов.

Я изучил новые методы @Rule и MethodRule, но (честно говоря) они кажутся сложным, но ограниченным решением проблемы, которая не совсем ясна.Во всяком случае, я не мог понять, как они могли решить мою проблему.Дополнительную обеспокоенность вызывает то, что, как представляется, авторы JUnit намерены в конечном итоге удалить концепцию @ Before / @ After из JUnit.

Так же кто-нибудь знает, как передавать данные из класса, аннотированного @Suite, каждомупроверить, работает ли класс Suite?

Ответы [ 2 ]

2 голосов
/ 04 февраля 2011

Моя проблема в том, что при использовании аннотации я не вижу, как пройти данные крепежа к конкретному тесту классы перед выполнением тестов.

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

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

Другой подход заключается в том, чтобы решить проблему с общими ресурсами наизнанку: в вашем случае тестовые классы объявят с помощью @Rule, что им необходим сервер для присутствия. При первом выполнении правила оно запускает сервер, сохраняет соответствующую информацию в статических полях и выполняет все необходимое для подготовки теста. Например, он может внедрить некоторые поля теста или просто позволить тесту использовать API правила для получения необходимой информации. В следующий раз, когда правило будет выполнено, оно пропускает шаг «запуск сервера». Да, статичное состояние - зло, но иногда это единственный способ обойти ограничения JUnit. (Я не буду касаться темы использования других платформ тестирования здесь.)

Большим преимуществом подхода наизнанку является то, что он позволяет запускать тестовые классы напрямую (без прохождения набора) и независимо друг от друга. Недостатком является то, что это может быть более трудным для реализации, и что это затрудняет удаление ресурсов, не связанных с памятью (в вашем случае: выключение сервера). Чтобы выполнить последнее, вам придется использовать ловушку отключения JVM, потому что JUnit не обеспечивает адекватного обратного вызова. Хотя это, вероятно, сработает (поскольку инструменты сборки и IDE обычно используют отдельную JVM для каждого запуска теста), тем не менее это ужасно.

Третий подход заключается в том, чтобы позволить вашей Ant / Maven / Gradle / любой сборке настроить / разрушить общие ресурсы до / после запуска тестов. Опять же, это менее гибко и удобно, чем подход наизнанку, и поднимает вопрос о том, как передавать информацию из сборки в JVM, где выполняются тесты (при необходимости). Плагин Maven Cargo является типичным примером такого подхода.

И последнее, но не менее важное: вы можете попытаться проявить прагматичность и запустить / остановить сервер один раз для каждого тестового класса. Это очень просто реализовать, но может быть или не быть адекватным в вашей ситуации (например, это может быть слишком много времени).

Я заглянул в новое @Rule и Метод Правил, но (честно говоря) они просто кажутся сложными, но ограниченное решение проблемы, это не очень понятно

Правила - это способ написания модульных и повторно используемых расширений JUnit. Гораздо лучше, чем использование базовых классов, где вы скоро столкнетесь с проблемой единственного наследования. Это еще более актуально для библиотек, поставляющих расширения JUnit.

Еще одной проблемой является то, что это Казалось бы, что авторы JUnit намерены в конечном итоге удалить @ До / @ После концепции от JUnit.

Где ты это услышал? Не путаете ли вы это с xUnit.net , который настоятельно не рекомендует использовать метод установки / демонтажа? В любом случае, выполнение каких-либо действий до или после теста является одним из наиболее важных вариантов использования правил, поэтому я не думаю, что вас это должно волновать.

0 голосов
/ 04 февраля 2011

JUnit 4.9 готовит лучшее решение для этого в виде компоновщика, но я думаю, что до этого самый чистый (хотя и немного сложный для реализации) способ решения этой проблемы состоит в том, чтобы создать собственную реализацию Runner (расширить одну изсуществующие).@ Питер совершенно прав, что у создания Suite есть слабые места по сравнению с JUnit 3.8, хотя у него есть и сильные стороны.

...