Как организовать модульные тесты и не превратить рефакторинг в кошмар?

Мой текущий способ организации модульных тестов сводится к следующему:

  • Каждый проект имеет свой собственный выделенный проект с модульными тестами. Для проекта 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()
    {
        //...
    }
}

Этот подход сослужил мне хорошую службу, потому что он действительно упрощает поиск тестов для некоторого фрагмента кода. На противоположном сайте это делает рефакторинг кода действительно более сложным, чем должен быть :

  • . Когда я решаю разделить один проект на несколько более мелких, мне также необходимо разделить тестовый проект.
  • Когда я хочу изменить пространство имен класса, я должен не забыть также изменить пространство имен (и структуру папок )тестового класса.
  • Когда я меняю имя метода, я должен пройти все тесты и изменить имя там. Конечно, я могу использовать поиск и замену, но это не очень надежно. В конце концов, мне все еще нужно проверить изменения вручную.

Есть ли какой-нибудь умный способ организации модульных тестов, который по-прежнему позволял бы мне быстро находить тесты для определенного кода и в то же время поддаваться рефакторингу?

В качестве альтернативы, есть ли какое-то, ну, возможно, расширение Visual Studio, которое позволило бы мне каким-то образом сказать, что "Эй,эти тесты предназначены для того метода, поэтому, когда название метода изменится, будьте так добры, измените и тесты тоже"? Честно говоря, я серьезно подумываю написать что-нибудь сам такой:)

12
задан Nikola Anusev 20 July 2012 в 18:47
поделиться