2011-02-04 3 views
2

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

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

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

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

Значит ли кто-нибудь знает, как передавать данные из класса, аннотированного с помощью @Suite, каждому тесту, который выполняется в классе Suite?

+0

Что такое «передать данные об оборудовании для экземпляров тестовых классов» точно? –

ответ

2

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

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

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

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

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

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

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

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

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

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

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

+0

Я не уверен, где я читаю, где они уходят, но меня, возможно, смутили комментарии к классу BlockJUnit4ClassRunner. Я читал так много блогов и учебников, пытаясь понять это, легко запутаться. :-) – drekka

+0

Спасибо за публикацию, thats массивный. – drekka

0

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

Смежные вопросы