У мене є звичка завжди намагатися відрізняти код рівня програми від коду рівня рамки, тому я стикався з проблемою, яку ви описуєте досить часто: зазвичай ви хочете, щоб весь код рівня рамки був протестований до того, як будь-який код рівня програми почне починати тестування . Крім того, навіть у коді рамкового рівня, як правило, існують основні рамкові модулі, які використовуються всіма іншими рамковими модулями, і якщо щось не вдається в основах, насправді немає сенсу тестувати щось інше.
На жаль, постачальники тестуючих рамок, як правило, мають дещо жорсткі уявлення про те, як мають бути використані їх твори, і є досить захисними від цих ідей, тоді як люди, які використовують їх рамки, як правило, приймають задумане використання, не ставлячи запитання. Це проблематично, оскільки це заважає експериментуванню та інноваціям. Я не знаю про всіх інших, але я вважаю за краще мати свободу спробувати зробити щось дивним способом і переконатися в тому, чи є результати кращими чи гіршими за встановлений, а не мати свободу робити речі по-своєму.
Отже, на мою думку, тестові залежності були б приголомшливою річчю, а замість цього можливість визначення порядку, в якому виконуватимуться тести, була б найкращою справою.
Єдиний спосіб, який я знайшов вирішити питання замовлення тестів, - це ретельне називання, щоб використовувати тенденцію тестування рамок для виконання тестів в алфавітному порядку.
Я не знаю, як це працює у Visual Studio, тому що мені ще потрібно зробити що-небудь, пов’язане з широким тестуванням на C #, але в частині світу Java це працює так: Під папкою вихідного проекту у нас зазвичай є дві папки, один називається "основним", що містить виробничий код, і один називається "тест", що містить код тестування. У розділі "main" у нас є ієрархія папок, яка точно відповідає ієрархії пакетів нашого вихідного коду. Пакети Java приблизно відповідають просторам імен C #. C # не вимагає, щоб ви відповідали ієрархії папок ієрархії простору імен, але бажано це зробити.
Тепер те, що люди зазвичай роблять у світі Java, - це те, що під папкою "тест" вони відображають ієрархію папок, що знаходяться під "основною" папкою, так що кожен тест знаходиться у точно такому ж пакеті, що і клас, який він тестує. Обґрунтуванням цього є те, що нерідко класу тестування потрібно звертатися до приватних членів пакета тестуваного класу, тому клас тестування повинен знаходитися в тому ж пакеті, що і тестовий клас. У C # стороні світу немає такого поняття, як видимість простору імен - локальна, тому немає ніяких підстав відображати ієрархії папок, але я думаю, що програмісти C # більш-менш дотримуються тієї ж дисципліни при структуруванні своїх папок.
У будь-якому випадку, я вважаю, що ця теза дозволяє дозволити тестуючим класам мати доступ до локальних членів класів під тестом, неправильно керуючись, тому що я схильний тестувати інтерфейси, а не реалізації. Отже, ієрархія папок моїх тестів не повинна відображати ієрархію папок мого виробничого коду.
Отже, що я роблю, це те, що я називаю папки (тобто пакети) моїх тестів так:
t001_SomeSubsystem
t002_SomeOtherSubsystem
t003_AndYetAnotherSubsystem
...
Це гарантує, що всі тести для "SomeSubsystem" будуть виконані перед усіма тестами для "SomeOtherSubsystem", які, в свою чергу, будуть виконані перед усіма тестами для "AndYetAbodySubsystem" тощо, і так далі.
У папці окремі тестові файли називаються так:
T001_ThisTest.java
T002_ThatTest.java
T003_TheOtherTest.java
Звичайно, це дуже допомагає сучасним IDE мати потужні можливості рефакторингу, які дозволяють перейменовувати цілі пакети (і всі підпакети, і весь код, на який посилається) лише за кілька клацань і натискань клавіш.