2009-03-23 3 views
92

Я переключился на JUnit4.4 с JUnit3.8. Я запускаю свои тесты с помощью ant, все мои тесты выполняются успешно, но тесты классов утилиты терпят неудачу с ошибкой «No runnable methods». Я использую шаблон, который включает все классы с именем * Test * в тестовой папке.JUnit: как избежать «никаких управляемых методов» в классах тестовых utils

Я понимаю, что бегун не может найти какой-либо метод, аннотированный атрибутом @Test. Но они не содержат такой аннотации, потому что эти классы не являются испытаниями. Удивительно, но при запуске этих тестов в eclipse он не жалуется на эти классы.

В JUnit3.8 это не было проблемой, поскольку эти классы полезности не расширяли TestCase, поэтому бегун не пытался их выполнить.

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

Есть ли элегантное решение этой проблемы?

+0

Работает ли ваш тест в Eclipse/NetBeans/вашей любимой среде IDE? – guerda

+0

Я использую затмение. На самом деле там нет проблем, почему-то затмение не пытается запускать эти классы. Я удивляюсь, как? – LiorH

+0

Я не знаю, понял ли мы ваш вопрос. Пожалуйста, перечитайте свой вопрос и, возможно, добавьте дополнительную информацию. – guerda

ответ

41

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

+1

Не думаю, что это поможет, потому что он переехал в JUnit 4.4, и это не должно иметь значения. – guerda

+2

Вы, кажется, пропустили мой ответ. У него есть фильтр имен, чтобы определить классы, которые будут рассматриваться как тесты. Если он меняет фильтр, он может легко исключить вспомогательные классы. –

+1

Ваше предложение действительно, однако я проверил свои классы тестов, а некоторые начали с теста, а некоторые - с помощью теста. нет четкого различия между классами полезности и реальными классами тестов. Считаете ли вы, что конвенция, предложенная вами, является хорошей практикой? (т. е. утилиты начинаются с теста, а тесты заканчиваются на Test). – LiorH

4

Как насчет добавления пустого метода тестирования для этих классов?

public void avoidAnnoyingErrorMessageWhenRunningTestsInAnt() { 
    assertTrue(true); // do nothing; 
} 
+0

интересно, спасибо – LiorH

+6

, но это ложно увеличивает количество проведенных нами тестов :) Не то, чтобы его большое дело – Sudarshan

128

Аннотировать свои классы использования с помощью @Ignore. Это заставит JUnit не пытаться запускать их в качестве тестов.

+9

Спасибо. Это должен быть принятый ответ! –

+6

Собственно, нет, не следует. @Ignore предназначен для временного отключения тестов. –

+1

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

70

У моего конкретного случая есть следующий сценарий. Наши тесты

public class VenueResourceContainerTest extends BaseTixContainerTest 

все простираться

BaseTixContainerTest 

и JUnit пытается запустить BaseTixContainerTest. Бедный BaseTixContainerTest просто пытался настроить контейнер, настроить клиента, заказать пиццу и расслабиться ... человек.

Как уже упоминалось ранее, вы можете аннотировать класс с

@Ignore 

Но это вызвало JUnit, чтобы сообщить, что тест как пропускаются (в отличие от полностью игнорируется).

Tests run: 4, Failures: 0, Errors: 0, Skipped: 1 

Такое раздражение.

Итак, я сделал реферат BaseTixContainerTest, и теперь JUnit действительно игнорирует его.

Tests run: 3, Failures: 0, Errors: 0, Skipped: 0 
+5

Гораздо лучше, чем '@ Ignore' – neworld

+0

это решило мою проблему также, спасибо! – Rumal

+0

Я попробовал подход @Ignore и подумал, что хорошо, тогда я прочитал этот ответ и ударил себя в лоб «Конечно!»! – dnuttle

31

Чтобы предотвратить JUnit от инстанцирования тестового базового класса просто сделать его

public abstract class MyTestBaseClass { ... whatever... } 

(@Ignore сообщает как игнорировал, которые я оставляю за временно игнорируемых испытания.)

+2

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

+0

Работает отлично для моих базовых классов тестов – ruX

+2

Это работает из-за имени (оно не заканчивается в Test), а не из-за абстрактного модификатора. Измените имя класса на MyBaseClassTest, и он попытается создать экземпляр, как упоминалось в @HollyCummins (и сбой) – Hutch

0

Я также столкнулся с аналогичной проблемой («no runnable methods ..») при запуске простейшей простой части кода (используя @Test, @Before и т. Д.) И не нашел решения нигде. Я использовал Junit4 и Eclipse SDK версии 4.1.2. Решил мою проблему, используя последнюю версию Eclipse SDK 4.2.2. Надеюсь, это поможет людям, которые борются с несколько похожим вопросом.

5

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

+1

Похоже, что атрибут 'skipNonTests' доступен только в ant 1.9+, что является позором, поскольку он выглядит невероятно полезным. Он также исключает абстрактные тестовые суперклассы. –

4

Будьте внимательны при использовании кода завершения IDE для добавления импорта для @Test.

Это должно быть import org.junit.Test, а не import org.testng.annotations.Test, например. Если вы сделаете последнее, вы получите ошибку «no runnable methods».

+0

Это должен быть комментарий, а не ответ. –

+1

Я не понимаю, почему. Это правильное решение. –

+1

Intellij Idea 2017 возился с моим умом, импортируя вместо этого 'org.junit.jupiter.api.Test'! но благодаря вам она решена сейчас – AmiNadimi

10
  1. Если это ваш базовый класс тестирования, например AbstractTest и все тесты проходит это, то определить этот класс как абстрактном
  2. Если Util класс, то лучше удалить * Тест из класса переименовать это MyTestUtil или Utils и т. д.
Смежные вопросы