JUnit: як уникнути "ніяких методів запуску" у класах тестових утиліт


118

Я перейшов на JUnit4.4 з JUnit3.8. Я запускаю свої тести за допомогою мурашника, всі мої тести працюють успішно, але тестові класи утилітів не вдається з помилкою "Без методів запуску". Я використовую шаблон, щоб включити всі класи з іменем * Test * у тестову течку.

Я розумію, що бігун не може знайти жодного методу, позначеного атрибутом @Test. Але вони не містять такої примітки, оскільки ці класи не є тестами. Дивно, коли ці тести виконуються в затемненні, вони не скаржаться на ці заняття.

У JUnit3.8 це зовсім не було проблемою, оскільки ці класи утиліт не поширювали TestCase, тому бігун не намагався їх виконати.

Я знаю, що я можу виключити ці специфічні класи в цілі Джуніт у сценарії мурашок. Але я не хочу змінювати файл збірки після кожного нового класу утиліти, який я додаю. Я також можу перейменувати класи (але давати хороші імена на заняттях завжди було моїм слабким талантом :-))

Чи є якесь елегантне рішення цієї проблеми?


Чи працюють ваші тести в Eclipse / NetBeans / вашому улюбленому IDE?
guerda

Я використовую затемнення. Насправді проблем там немає, якимось затемненням не намагаються запускати ці класи. Цікаво, як?
LiorH

Я не знаю, чи ми зрозуміли ваше запитання. Перечитайте своє запитання і, можливо, додайте ще трохи інформації.
guerda

1
@guerda: Питання мені здається досить зрозумілим. Його завдання Ant - знайти класи, які не містять тестів, оскільки фільтр підбирає клас корисності. Звідси моя відповідь, яку я все ще вважаю, цілком актуальна.
Джон Скіт

LiorH: Дякую за роз’яснення, тому моя відповідь є марною :)
guerda

Відповіді:


50

Якщо припустити, що ви керуєте шаблоном, який використовується для пошуку тестових класів, я б запропонував змінити його, *Testа не відповідати *Test*. Цей спосіб TestHelperне збігатиметься, але FooTestбуде.


1
Я не думаю, що це допоможе, оскільки він перейшов на JUnit 4.4, і це не повинно мати значення.
guerda

2
Ви, здається, пропустили пункт моєї відповіді. У нього є фільтр імен для визначення класів, які слід вважати тестами. Якщо він змінить фільтр, він може легко виключити допоміжні класи.
Джон Скіт

1
Ваша пропозиція дійсна, проте я перевірив свої тестові класи, а деякі починаються з Тесту, а деякі закінчуються з Тесту. немає чіткого розрізнення класів корисних програм та реальних тестових класів Як ви вважаєте, конвенція, яку ви запропонували, є хорошою практикою? (тобто утиліти починаються з Test, а тести закінчуються Test)
LiorH

4
Це майже умова, що ви суфіксуєте класи перевірок за допомогою * Test. Можливо, вам доведеться перефактурувати, перейменувавши тестові класи відповідним чином, а також перейменувавши помічників, щоб вони не використовували конвенцію суфікса.
Спойк

2
Я погоджуюся з Spoike - якщо ви не можете сказати з назви класу, це тест чи помічник, вам слід перейменувати клас. Конвенція більше "клас є тестом, якщо і тільки якщо він закінчується Тестом". Класи утиліти можуть або не можуть починатися з Тесту - це не має значення.
Джон Скіт

142

Коментуйте свої утилі за допомогою @Ignore. Це призведе до того, що JUnit не намагатиметься запустити їх як тести.


6
Власне, ні, це не повинно. @Ignore призначений для тимчасового відключення тестів.
Аліса Янг

1
Вибачте, але це погана ідея. Ви хочете почати коментувати свій виробничий код із тестових приміток лише тому, що вони можуть відповідати тестовій схемі? Правильна відповідь - виправити назви класів, якщо вони викликають відповідність шаблонів для тестів. І переконайтеся, що в шаблоні знаходять лише класи, які закінчуються з тестом Це загальноприйнята модель
Кевін М

Так, це погано, і я не усвідомлював це, поки не подав ще одну анотацію, яку я не можу видалити. Зробіть свій базовий клас абстрактним, тоді JUnit проігнорує його. Дивіться відповідь @ gmoore нижче.
Райан Шиллінгтон

83

У моєму конкретному випадку є такий сценарій. Наші тести

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

7
Набагато краще, ніж@Ignore
новий світ

Я спробував підхід @Ignore і подумав, добре , що добре, то я прочитав цю відповідь і вдарив себе в лоб, «Про , звичайно
Ганчірка

38

Щоб JUnit не міг створити екземпляр вашого базового класу тесту, просто зробіть це

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

(@Ignore повідомляє про це як проігноровано, що я залишаю за тимчасово проігноровані тести.)


3
Бігуни JUnit часто також намагаються інстанціювати абстрактні класи, а потім не вдається з помилкою інстанції.
Холлі Каммінс

Мені ідеально підходить для базових тестових занять
ruX

3
Це працює через назву (вона не закінчується в Test), а не через абстрактний модифікатор. Змініть ім'я класу на MyBaseClassTest, і він спробує інстанціювати, як згадував @HollyCummins (і не вдалося)
Hutch

У моєму випадку це повинно бути protected abstract class.
Містик Лін

18
  1. Якщо це ваш базовий тестовий клас, наприклад AbstractTest, і всі ваші тести розширюються, тоді визначте цей клас як абстрактний
  2. Якщо це клас Util, тоді краще видаліть * Тест із перейменування класу - це MyTestUtil або Utils тощо.

10

Будьте обережні, коли використовуєте кодування IDE, щоб додати імпорт @Test .

Наприклад, це має бути, import org.junit.Testа не бути import org.testng.annotations.Test. Якщо ви зробите останнє, ви отримаєте помилку "методів без запуску".


Це повинен бути коментар, а не відповідь.
Swaranga Sarma

3
Я не бачу чому. Це дійсне рішення.
Шрідхар Сарнобат

4
Intellij Idea 2017 зіпсував мій розум, імпортуючи org.junit.jupiter.api.Testзамість цього! але завдяки вам це вирішено зараз
AmiNadimi

Дуже дякую, що я розгубився, коли отримав проблему "немає запущених методів".
Пітер С.

7

Мураха тепер поставляється з skipNonTests атрибутом, який був створений для того, щоб робити саме те, що вам здається, що ви шукаєте. Не потрібно змінювати базові класи на абстрактні або додавати до них анотації.


2
Схоже, skipNonTestsатрибут доступний лише у мурашниках 1.9+, що шкода, оскільки виглядає неймовірно корисним. Також буде виключено абстрактні тестові суперкласи.
Холлі Каммінз

4

Що з додаванням порожнього методу тестування до цих класів?

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

8
але це помилково збільшує кількість тестів, які ми маємо :) Не те, що це велика справа
Sudarshan

1

У вашому тестовому класі, якщо написав import org.junit.jupiter.api.Test; видаліть його та напишіть імпорт org.junit.Test; У цьому випадку це працювало і на мене.


1
дивним чином, це спрацювало. Я виконаний вручну в командному рядку Windows. однак, ще одна проблема в тому , що @BeforeAllі @AfterAllне виконуються.
BingLi224

мабуть, JUnit4 працював (з @BeforeClassі @AfterClass, але JUnit5 не. Посилання: junit.org/junit5/docs/current/user-guide/#migrating-from-junit4
BingLi224

0

Я також зіткнувся з подібною проблемою ("немає запущених методів ..") щодо запуску найпростішого простого фрагмента коду (Використання @Test, @Before тощо) і не знайшов рішення ніде. Я використовував Junit4 та Eclipse SDK версії 4.1.2. Вирішили мою проблему, використовуючи останню версію SDK Eclipse 4.2.2. Я сподіваюся, що це допомагає людям, які борються з дещо подібним питанням.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.