@Ignore от JUnit

Интересно, стоит ли использовать JUnit @Ignore. И как люди этим пользуются?

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

Я немного обеспокоен тем, что мы можем пропустить проигнорированный тестовый пример позже или что люди начнут использовать его, чтобы «заставить» тесты пройти CI.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
16
0
18 743
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

Ответ принят как подходящий

Полагаю, это неплохо.

документы говорит:

Test runners will report the number of ignored tests, along with the number of tests that ran and the number of tests that failed.

Следовательно, это означает, что даже если вы забудете удалить это впоследствии, вы должны были быть уведомлены об этом.

Пример, приведенный в документы, полностью соответствует вашему случаю.

@Ignore("not ready yet")

Что ж, если вы не закончили с классом, хорошо, что тест не прошел. Отметка его как @Ignore будет означать, что вы отправите код с незавершенным классом. И правильно, возможно, вы еще не используете этот класс в каком-либо коде, который запускается, но когда-нибудь какой-нибудь другой разработчик может увидеть этот класс и использовать его. Тогда он терпит неудачу, даже если он должен работать.

Я бы точно не стал использовать @Ignore в этом случае.

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

Adeel Ansari 05.01.2009 09:44

@ Адиэль Ансари: Я согласен с @kender. Я не эксперт по JUnit, но думаю, что в этом случае лучше было бы обработать @Incomplete или @NotReadyForTesting, а не @Ignore. И эта аннотация принадлежит Классу, а не Тесту.

Miserable Variable 05.01.2009 09:56

@Hemal Pandya, если реализация не завершена, аннотировать должен быть класс, а не тест.

kender 05.01.2009 10:05

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

dlinsin 05.01.2009 10:13

@Kender: А затем исполнитель тестов может сообщить количество протестированных, но неполных классов, статистика, которая может быть действительно полезна для определения доставляемости.

Miserable Variable 05.01.2009 10:30

Хемал, предложенные вами аннотации больше похожи на методологию пост-тестирования. Где еще не написан тестовый код, потому что фактический код является неполным. В случае предварительного тестирования это означает, что напишите свой тестовый код перед фактическим кодом, может потребоваться аннотировать тест с помощью @ignore. Но опять же, пп.

Adeel Ansari 05.01.2009 11:18

ПП может звучать странно. Собственно, это личное предпочтение. Осталось не так много персонажей :)

Adeel Ansari 05.01.2009 11:24

@Adeel Ansari: Я читал, но сам не пробовал методологию предварительного тестирования, которую вы упомянули. Это может иметь смысл, потому что критерии доставляемости заключаются в том, что тесты не игнорируются. Благодарю за разъяснение.

Miserable Variable 05.01.2009 11:50

Загляните в мой блог о предварительном тестировании (tdd) dlinsin.blogspot.com/2008/06/nothing-wrong-with-tdd-right.ht‌ мл

dlinsin 05.01.2009 12:07

Я думаю, что использование @ignore в порядке, пока есть -

  1. Хорошая причина, по которой метод не может быть протестирован в той или иной форме, и она задокументирована как таковая в коде. Это должен быть особый случай, и он требует обсуждения или проверки кода, чтобы увидеть, есть ли способ его протестировать.
  2. Тест еще не построен - в идеале это должно происходить только для устаревшего кода. Это также должно быть предметом проверки кода и должны быть поставлены задачи по добавлению тестов.

Таковы правила, по крайней мере, на мой взгляд ;-)

ИМХО, игнорируйте, что не следует использовать легкомысленно ... из-за эффекта разбитых окон.

Я редко использую этот атрибут / аннотацию в xUnit. Я использовал их только несколько раз в качестве ДЕЛАТЬ при написании TestCase # 1, я вижу еще один тестовый пример, который я пропустил, но который также должен быть включен. Чтобы не забыть, я пишу небольшой тестовый пример с описательным именем и помечаю его как «Игнорировать». Приступите к заполнению TestCase # 1. Но это все внутри регистрации. Я никогда не проверяю тесты с пометкой "Игнорировать"

Однако обычно я просто использовать лист бумаги - тестовый лист записываю новый тестовый пример - что намного проще. Это также подходит для сценария, в котором я частично закончил ... выполнил 5 из 10 тестов. Вместо того, чтобы отмечать 5 игнорируемых тестов, я бы сохранил список тестов и проверил 5 пройденных тестов. Предполагается, что вы завершите все остальное в следующие несколько проверок, прежде чем переходить к чему-то новому.

Я могу вспомнить и другие «особые случаи»:
Когда вы в ожидании компонента от другой команды / человека / поставщика (чей интерфейс был опубликован-согласован), без которого тесты не могут работать. В этом случае вы можете написать тесты и пометить их как «Игнорировать» («Ожидание X доставки компонента Y»).

В этом случае он превратился бы в нечто иное, а не в модульный тест. Вы имеете в виду 1 единицу, разработанную двумя или более людьми, ИЛИ тестирование нескольких единиц в одном случае. Боюсь, это плохая идея.

Adeel Ansari 05.01.2009 13:25

Я имел в виду: «Представьте, что вы пишете тесты для ClassA, которому нужен ClassB в качестве соавтора. Однако ClassB параллельно разрабатывает кто-то другой. Вы можете использовать макеты, но все равно должны тестировать с настоящим соавтором. Игнорировать («Пока не будет выполнено ClassB»)

Gishu 05.01.2009 14:24

Я склонен согласиться. Спасибо за ваше объяснение.

Adeel Ansari 10.11.2009 10:23

Я думаю, что это отличный способ его использовать.

Ваш CI-сервер должен быть зеленым (или синим в случае Hudson) все время. Если это не ваша первоочередная задача - исправить это.

Теперь, если CI сломался из-за ошибки в тестовом коде (возможно, тестовый код непослушный и недетерминированный), вы должны просто проигнорировать тест «@Ignore (этот тестовый код - borken, поднял дефект # 123)» и поднять ошибка в вашем трекере дефектов.

Вы не будете отправлять неработающий код, потому что при каждой отправке вы проверяете все дефекты и решаете, являются ли какие-либо из них показными, верно? Неисправный тест, который не запущен, будет рассматриваться вместе с кодом / функцией, которую он тестировал. Вы отправляете товар тогда и только тогда, когда довольны тем, что код, который он тестировал, также не поврежден. Если он не тестировался, считайте его сломанным.

Я надеюсь, что средство форматирования отчетов junit xml, используемое при запуске тестов из ant, однажды будет включать в себя проигнорированный счетчик (и причины) вместе с проходом, неудачей и ошибкой. Может быть, тогда поставщики CI включат игнорируемые счетчики тестов (в противном случае мне, возможно, придется написать плагин Hudson ...)

+1 - @Ignore следует использовать для (временного) пропуска теста, в правильности которого вы не уверены, а не для устранения проблемы с самим тестируемым модулем.

Andrzej Doyle 13.05.2009 18:12

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

Max Nanasy 13.08.2012 04:53

Да, это была опечатка, теперь ее исправили. На то, чтобы это заметить, понадобилось всего 3 года, ура!

matt burns 13.08.2012 13:28

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

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

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

Я бы сказал, однако, что если вы используете @ignore, значит, вы не LEAN и не выполняете TDD.

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

Я совершенно сумасшедший или в этом есть смысл?

Для большинства проектов это не так. Обычно это не одна ветка. Хотя вы правы, что не должно быть провальных тестов (но должно быть только для основной / основной ветки). В других ветках, не являющихся выпуском, тесты обычно не проходят.

Ankit 18.07.2013 22:17

Я говорил с точки зрения TDD. Даже 2 года спустя я все еще не вижу необходимости в @Ignore, если вы выполняете TDD. Если вы не делаете TDD, почему бы просто не прокомментировать тесты пожимать плечами. Я этим не пользовался. Это просто мой опыт с этим до сих пор.

Thomas Schultz 22.07.2013 20:41

Я думаю, что можно использовать @Ignore, когда тест основан на внешних объектах, которые нельзя высмеять. Нам все еще нужен тест, чтобы убедиться, что что-то работает, но мы не хотим развертывать тест, который полагается на внешнюю зависимость.

Например, если вы пишете собственный SpreadsheetWriter / Reader для документов Google, имеет смысл использовать настоящий документ Google для его тестирования. Однако вы бы не хотели, чтобы ваша сборка завершилась ошибкой, если по какой-либо причине не работают документы Google. После подтверждения того, что ваш модульный тест проходит локально, я бы добавил @Ignore, прежде чем отправлять его в производство.

В общем, я думаю, что следует избегать @Ignore насколько это возможно, потому что в большинстве случаев внешние классы / системы можно издеваться.

@Ignore можно использовать в тестах, написанных для некоторых сторонних сервисов. Недавно я обнаружил, что мне нужно проверить, отправляет ли внешняя служба ожидаемые данные. Это было очень удобно делать в тесте (mocks). Поскольку я знал, что мои входные данные не будут работать вечно, и мне может потребоваться запустить аналогичный тест позже, я добавил @Ignore вместо удаления теста.

Другие вопросы по теме