2008-10-07 3 views
20

Я бы хотел, чтобы он кричал ууре всякий раз, когда утверждение утверждения преуспевает или, по крайней мере, отображает количество успешных утверждений утверждения, которые были встречены.Могу ли я сделать JUnit более подробным?

Я использую JUnit4.

Любые предложения? Javadoc

+0

Почему именно вы этого хотите? Я всегда стараюсь следовать правилу молчания (http://www.catb.org/~esr/writings/taoup/html/ch01s06.html#id2878450), вот почему я спрашиваю – 2008-10-07 21:08:40

+0

Это может быть полезным способом посмотрите, кто-то «настраивает» тестовые примеры, чтобы заставить их пройти, удалив неудобные утверждения ... – 2008-10-07 22:07:06

ответ

13

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

Затем вы запускаете глобальный поиск и замену на тестовых классах из «org.junit.Assert» => «com.myco.test.Assert», который должен исправить все регулярные и статические операции импорта.

Вы также можете затем легко мигрировать ваш подход к тише-это-лучше лагерь и изменить класс обертку просто сообщить общее # о прошедших утверждений в тесте или в классе, и т.д.

0

Я уверен, что вы можете создать собственный TestRunner, что делает это. Мы закончили с чем-то похожим в нашей самодельной платформе тестирования модулей (клон NUnit).

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

Это не большая проблема для меня, так как я склоняюсь к одному утверждению за тест, как правило.

2

Трудно сделать. Все методы assert являются статическими членами класса Assert, что подразумевает, что RunNotifier (который считает успешные и неудачные тесты) недоступен.

Если вы не воздержитесь от взлома ungly: возьмите исходники из JUnit, исправьте их, чтобы сохранить текущий уведомитель в статическом поле Assert при запуске тестов, чтобы статические методы могли сообщать об успешных утверждениях этому уведомителю.

-1

Считаете ли вы?

1) скачать источник JUnit
2), чтобы изменить класс org.junit.Assert сделать все изменения вы ищете

4

Вы можете использовать АОП (с весной или AspectJ) определяют на всех срезов в утверждают методы в классе junit.framework.Assert. Используя Spring, вы можете реализовать свой собственный класс, как после возвращения совета (http://static.springframework.org/spring/docs/2.5.x/reference/aop.html#aop-advice-after-returning), который будет вызываться только в том случае, если передан метод assert (в противном случае он генерирует исключение: junit.framework.AssertionFailedError ). В вашем собственном классе вы можете реализовать простой счетчик и распечатать его в конце.

3

Вы действительно заинтересован в утверждении, что преуспевает? как правило, только интересные утверждения являются те, которые терпят неудачу.

Будучи ревностным JUnit преданными себя, я стараюсь сделать вывод из как можно тише, потому что он улучшает отношение сигнал/шум, когда что-то не проходит. Лучший тестовый прогон - это тот, где все проходит, и не видно из stdout.

Вы всегда можете работать с вашим модульным тестом до тех пор, пока он не сработает и не запустится «grep Assert test.java | wc -l ". :-)

0

Я не» Думаю, цель JUnit - подсчитать согласованные утверждения или распечатать более подробную информацию. Если тесты являются атомарными, вы получите большую часть информации. Поэтому я бы пересмотрел свои тесты.

Вы также можете установить LogFile в JUnit. Это возможно, но это снизит производительность выполнения теста ...

7

Добавление некоторой информации, которая была бы полезной для меня, когда я хотел, чтобы JUnit был более подробным и наткнулся на этот вопрос. Возможно, это поможет другим тестировщикам в будущем.

Если вы работаете в JUnit с Ant, и хотят, чтобы увидеть, какие тесты выполняются в настоящее время, вы можете добавить следующее задание:

<junit showoutput="true" printsummary="on" enabletestlistenerevents="true" fork="@{fork}" forkmode="once" haltonfailure="no" timeout="1800000"> 

Обратите внимание, что showoutput, printsummary и enabletestlistenerevents то, что помогли, а не другие атрибуты задачи. Если вы установите это, вы получите выход как:

Running com.foo.bar.MyTest 
junit.framework.TestListener: tests to run: 2 
junit.framework.TestListener: startTest(myTestOne) 
junit.framework.TestListener: endTest(myTestOne) 
junit.framework.TestListener: startTest(myTestTwo) 
junit.framework.TestListener: endTest(myTestTwo) 
Tests run: 2, Failures: 0, Errors: 0, Time elapsed: 0.495 sec 

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