Мой текущий способ организации модульных тестов сводится к следующему:
- Каждый проект имеет свой собственный выделенный проект с модульными тестами. Для проекта
BusinessLayer
существует тестовый проектBusinessLayer.UnitTests
. - Для каждого класса, который я хочу протестировать, в тестовом проекте есть отдельный тестовый класс, размещенный в точно такой же структуре папок и в точно таком же пространстве имен, что и тестируемый класс. Для класса
CustomerRepository
из пространства именBusinessLayer.Repositories
существует тестовый классCustomerRepositoryTests
в пространстве именBusinessLayerUnitTests.Repositories
.
Методы внутри каждого тестового класса следуют простым соглашениям об именах MethodName_Condition_ExpectedOutcome
. Таким образом, класс CustomerRepositoryTests
, содержащий тесты для класса CustomerRepository
с определенным методом Get
, выглядит следующим образом:
[TestFixture]
public class CustomerRepositoryTests
{
[Test]
public void Get_WhenX_ThenRecordIsReturned()
{
// ...
}
[Test]
public void Get_WhenY_ThenExceptionIsThrown()
{
// ...
}
}
Этот подход мне очень понравился, потому что он делает локальные тесты для некоторого фрагмента кода очень простыми. На противоположном сайте он делает рефакторинг кода действительно более сложным, тогда он должен быть:
- Когда я решаю разделить один проект на несколько меньших, мне также нужно разделить мой тестовый проект.
- Когда я хочу изменить пространство имен класса, я должен помнить об изменении пространства имен (и структуры папок) тестового класса.
- Когда я меняю имя метода, мне нужно пройти все тесты и изменить имя там. Конечно, я могу использовать Search and Replace, но это не очень надежно. В конце концов, мне все равно нужно проверить изменения вручную.
Есть ли какой-нибудь умный способ организации модульных тестов, которые все же позволили бы быстро найти тесты для конкретного кода и в то же время дать больше возможностей для рефакторинга?
В качестве альтернативы есть некоторые, возможно, расширение Visual Studio, которые позволили бы мне как-то сказать, что "эй, эти тесты для этого метода, поэтому, когда имя метода изменяется, будьте так добры и измените тесты также"? Честно говоря, я серьезно подумываю написать что-то подобное себе.