У меня есть привычка всегда пытаться отличить код уровня приложения от кода уровня фреймворка, поэтому я столкнулся с проблемой, которую вы описываете довольно часто: обычно вы хотите, чтобы весь код уровня фреймворка тестировался до того, как какой-либо код уровня приложения начнет тестироваться. , Кроме того, даже в коде уровня фреймворка, как правило, существуют фундаментальные модули фреймворка, которые используются всеми остальными модулями фреймворка, и если что-то не работает в основах, в действительности нет смысла тестировать что-либо еще.
К сожалению, у поставщиков тестирующих фреймворков, как правило, есть довольно жесткие представления о том, как их творения предназначены для использования, и они довольно защищены от этих идей, в то время как люди, использующие их фреймворки, склонны принимать предполагаемое использование без вопросов. Это проблематично, потому что это душит эксперименты и инновации. Я не знаю обо всех остальных, но я бы предпочел иметь свободу пытаться сделать что-то странным образом и лично убедиться, лучше ли результаты или хуже, чем установленный способ, а не иметь свободу делай мои дела в первую очередь.
Так что, на мой взгляд, наличие тестовых зависимостей было бы здорово, и вместо этого, следующая возможность - указать порядок, в котором будут выполняться тесты.
Единственный способ, который я нашел для решения проблемы упорядочения тестов, - это осторожное именование, чтобы использовать тенденцию каркасов тестирования выполнять тесты в алфавитном порядке.
Я не знаю, как это работает в Visual Studio, потому что я еще ничего не делал, включая обширное тестирование с C #, но в мире Java это работает следующим образом: в папке с исходным кодом проекта у нас обычно есть две подпапки, один с именем «main», содержащий производственный код, и один с именем «test», содержащий код тестирования. В разделе «main» мы имеем иерархию папок, которая точно соответствует иерархии пакетов нашего исходного кода. Пакеты Java примерно соответствуют пространствам имен C #. В C # не требуется сопоставлять иерархию папок с иерархией пространства имен, но это целесообразно сделать.
Теперь, что люди обычно делают в мире Java, так это то, что в папке «test» они отражают иерархию папок в «основной» папке, так что каждый тест находится в том же пакете, что и класс, который он тестирует. Это объясняется тем, что довольно часто классу тестирования требуется доступ к закрытым для пакета членам тестируемого класса, поэтому класс тестирования должен находиться в том же пакете, что и тестируемый класс. В мире C # не существует такой вещи, как локальная видимость пространства имен, поэтому нет причин отражать иерархию папок, но я думаю, что программисты C # более или менее придерживаются той же дисциплины при структурировании своих папок.
В любом случае, я нахожу, что вся эта идея позволить тестирующим классам иметь доступ к локальным членам пакета тестируемых классов, потому что я склонен тестировать интерфейсы, а не реализации. Таким образом, иерархия папок моих тестов не должна отражать иерархию папок моего производственного кода.
Поэтому я называю папки (то есть пакеты) моих тестов следующим образом:
t001_SomeSubsystem
t002_SomeOtherSubsystem
t003_AndYetAnotherSubsystem
...
Это гарантирует, что все тесты для «SomeSubsystem» будут выполнены перед всеми тестами для «SomeOtherSubsystem», которые, в свою очередь, будут выполнены перед всеми тестами для «AndYetAnotherSubsystem», и так далее, и так далее.
Внутри папки отдельные тестовые файлы имеют следующие имена:
T001_ThisTest.java
T002_ThatTest.java
T003_TheOtherTest.java
Конечно, очень помогает, что современные IDE имеют мощные возможности рефакторинга, которые позволяют вам переименовывать целые пакеты (и все подпакеты, и весь код, который на них ссылается) всего за пару кликов и нажатий клавиш.