Могу ли я сделать JUnit более многословным? - PullRequest
21 голосов
/ 08 октября 2008

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

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

Есть предложения?

Ответы [ 9 ]

13 голосов
/ 08 октября 2008

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

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

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

9 голосов
/ 23 мая 2012

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

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

4 голосов
/ 08 октября 2008

Вы можете использовать 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 ). В вашем собственном классе вы можете реализовать простой счетчик и распечатать его в конце.

3 голосов
/ 08 октября 2008

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

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

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

2 голосов
/ 08 октября 2008

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

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

0 голосов
/ 31 октября 2008

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

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

0 голосов
/ 08 октября 2008

Можете ли вы рассмотреть?

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

0 голосов
/ 08 октября 2008

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

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

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

0 голосов
/ 08 октября 2008

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

так что, кажется, это было бы невозможно

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