Подтвердить что ты не робот

Могу ли я сделать JUnit более подробным?

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Добавление некоторой информации, которая была бы полезной для меня, когда я хотел, чтобы 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

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

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

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

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

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

Ответ 7

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

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

Ответ 8

junit javadoc, к сожалению, говорит, что записаны только неудавшиеся утверждения (http://junit.sourceforge.net/javadoc_40/index.html)

поэтому кажется невозможным

Ответ 9

Вы можете рассмотреть?

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