Конвенція про іменування тестових пакетів


11

Ми фактично називаємо наші тестові пакети так само, як їх аналоги для тестування. Отже, ми закінчуємо цю структуру:

src/main/java
    com.hello.world
        helloWorld.java
src/test/java
    com.hello.world
        helloWorldTest.java

Мені завжди здавалося, що це не дуже розумно, оскільки ви не можете розрізнити "тест" і "тестувати", якщо тільки надано назву пакета. З іншого боку, я дійсно не знайшов випадку, коли це якимось чином має значення. Чи є хорошою практикою мати однакові умови іменування для обох пакетів (для тестових випадків та початкових класів)? Якщо ні, то який би кращий підхід?


1
Не маю уявлення, чи це хороша практика, але популярна. Інший варіант (помістити "Тест" у назву пакета, назви методів тощо) присвоює трохи більше "імен Smurf". Як ви кажете, важко придумати випадок, коли неможливість "розрізнити" тест "та" тестувати ", якщо тільки надана назва пакета" буде проблемою.
Девід Арно

@DavidArno Дякуємо за ваш внесок :) Як уникнути розмежування імен? Я маю на увазі, ми б закінчилися з com.hello.world.test.helloWorld.java, чи не так?
OddDev

Проблема "smurf" більше, коли у вас є метод XXXTest()в com.hello.world.test.helloWorldTest.java. Загальна порада полягала б у тому, щоб "Test" відображався лише один раз на шляху, тому або (a) використовуйте тест у назві пакета (і називайте тестовий файл таким же, як і тестовий файл), або (b) зробіть ім'я пакета ім'ям те саме і додайте "тест" до імені файла / класу.
Девід Арно

@DavidArno Ах, дякую за роз’яснення! Я неправильно зрозумів ваш перший коментар. Я зараз це отримав.
OddDev

Ну я б стверджував, що, якщо це було незрозуміло, я перший свій коментар помилився :)
Девід Арно,

Відповіді:


11

Це хороша умова.

Іноді ви також хочете написати одиничні тести для приватних класів та методів. Ви не зможете зателефонувати їм із тестового класу, розміщеного в іншій упаковці.

Не повинно виникати плутанини щодо того, що тестові класи в одному і тому ж просторі імен не мають бути, оскільки вони не повинні знаходитись на шляху до класу при компілюванні або запуску виробничого коду.

Ось приклад невеликого модуля з загальнодоступним інтерфейсом, загальнодоступного фабричного класу та двох класів приватного впровадження пакетів:

src/main/java:
    com.hello.transmogrifier
        public interface Transmogrifier
        public class TransmogrifierFactory
        class MapTransmogrifier implements Transmogrifier
        class ListTransmogrifier implements Transmogrifier

scr/test/java:
    com.hello.transmogrifier
        public class TransmogrifierFactoryTest
        public class MapTransmogrifierTest
        public class ListTransmogrifierTest

Приховування реалізації інтерфейсу Transmogrifier може бути коректним вибором дизайну. Можливо, саме відповідальність заводу-класу вибирає реалізацію.

Оскільки реалізації є пакетом приватного типу, вам потрібно розмістити одиничні тестові класи в одному пакеті, якщо ви хочете перевірити їх безпосередньо. Якщо у вас є тестові класи в іншому пакеті, у вас є лише прямий доступ до загальнодоступного інтерфейсу та заводського класу з ваших тестів.


1
"Зазвичай ви також хочете написати одиничні тести для пакетно-приватних класів і методів". Ні! Це дійсно погана практика. Приватні типи пакунків - це деталі реалізації, і їх ніколи не слід перевіряти безпосередньо. Тільки тестуйте загальнодоступні API.
Девід Арно

1
@DavidArno Я не згоден. Однак я замінив слово "зазвичай" на слово "іноді", щоб уникнути конкретної дискусії.
ПРИЙДАЄТЬСЯ

1
Ви можете не погодитися з усім, що ви хочете, але тестування внутрішнього опрацювання фрагмента коду призводить як до жорсткої зв'язку між цими внутрішніми роботами і тестами, так і до крихких тестів, які легко зламаються навіть при простому рефакторингу. Це дуже погана практика.
Девід Арно

Якщо я хочу переконатися, що всі мої реалізації Transmogrifier працюють, незалежно від того, що робить фабрика, я збираюся писати одиничні тести, які перевіряють кожну реалізацію. Зауважте, що у реалізацій є спільний загальнодоступний API, навіть якщо класи приватно-пакетні. Цей тест не повинен перерватися, якщо я не зміню загальнодоступний API. Насправді я б, мабуть, написав загальний тест для Transmogrifier, а потім запустив його проти кожної реалізації. Хоча кожну реалізацію можна отримати за допомогою фабрики, краще не мати такої залежності при тестуванні Transmogrifiers.
ПРИЙДАЄТЬСЯ

Тоді один день, ви дивитеся MapTransmogrifierі ListTransmogrifierі вирішити , що вони можуть бути зроблені в один клас, так що ви створюєте ListMapTransmogrifier, змініть завод , щоб використовувати цей і видалити ці два класи. Код зараз не компілюється, тому вам доведеться змінювати кожен тест в обох MapTransmogrifierTestі ListTransmogrifierTestпроводити його компіляцію. Тест не вдається. Це було пов'язано зі зміною тестів чи створенням ListMapTransmogrifier? Виходить налагоджувач, щоб дізнатися ... або, коли тести використовують фабрику, ви робите цей рефактор і все ще компілюєте ...
Девід Арно
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.