Как организовать или классифицировать модульное тестирование методов поиска DAO - PullRequest
1 голос
/ 17 ноября 2011

Во-первых, простите мне использование термина «единица измерения», когда, возможно, я имею в виду интеграционный тест.Однако в этом случае я рассматриваю тестирование метода DAO как единое целое и не пытаюсь издеваться над подчеркивающей базой данных.

Я пытался протестировать определенный метод DAO, который ищет конкретные объекты -

public Factor GetMatchingFactor(int aircraftStoresConfigurationId, int stationId, DateTime timeStamp)
{
    // code etc....
}

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

Поэтому я изо всех сил пытаюсь определить такие тесты, как

public void TestThatAircraftStoresConfigurationIdParameterIsApplied
public void TestThatStationIdParameterIsApplied
public void TestThatTimeStampParameterIsApplied

, поскольку их имена неверны, каждый не просто проверяет одну вещь.

Это также означает, что яизо всех сил пытается следовать правилу только одного утверждать за тест.

Поэтому я протестировал этот метод, используя следующий код с таким же охватом и, возможно, более значимым.

    [Test]
    public void TestReturnsCorrectResult()
    {
        Assert.That(_sut.GetMatchingFactor(10001, Station.Station9Id,  new DateTime(2011, 11, 16, 10, 00, 00)).Id, Is.EqualTo(1), "Test 1");
        Assert.That(_sut.GetMatchingFactor(10001, Station.Station9Id,  new DateTime(2011, 11, 16, 11, 00, 00)).Id, Is.EqualTo(1), "Test 2");
        Assert.That(_sut.GetMatchingFactor(10001, Station.Station9Id,  new DateTime(2011, 11, 16, 19, 00, 00)).Id, Is.EqualTo(1), "Test 3");
        Assert.That(_sut.GetMatchingFactor(10001, Station.Station9Id,  new DateTime(2011, 11, 16, 19, 00, 01)).Id, Is.EqualTo(2), "Test 4");
        Assert.That(_sut.GetMatchingFactor(10001, Station.Station9Id,  new DateTime(2011, 11, 16, 19, 00, 02)).Id, Is.EqualTo(2), "Test 5");
        Assert.That(_sut.GetMatchingFactor(10001, Station.Station9Id,  new DateTime(2011, 11, 16, 14, 00, 00)).Id, Is.EqualTo(1), "Test 6");
        Assert.That(_sut.GetMatchingFactor(10001, Station.Station10Id, new DateTime(2011, 11, 16, 14, 00, 00)).Id, Is.EqualTo(1), "Test 7");
        Assert.That(_sut.GetMatchingFactor(10002, Station.Station11Id, new DateTime(2011, 11, 16, 14, 00, 00)).Id, Is.EqualTo(3), "Test 8");
        Assert.That(_sut.GetMatchingFactor(10002, Station.Station12Id, new DateTime(2011, 11, 16, 14, 00, 00)).Id, Is.EqualTo(3), "Test 9");
    }

Меня не устраивают множественные утверждения, но это кажется единственным логичным способом структурировать эти тесты.Кто-нибудь может предложить лучший вариант?

1 Ответ

1 голос
/ 17 ноября 2011

Похоже, что он идеально подходит для TestCases в NUnit 2.5.Вы можете переписать свой код следующим образом:

[TestCase(10001, Station.Station9Id,   2011, 11, 16, 10, 00, 00,  1)]
[TestCase(10001, Station.Station9Id,   2011, 11, 16, 11, 00, 00,  1)]
[TestCase(10001, Station.Station9Id,   2011, 11, 16, 19, 00, 00,  1)]
[TestCase(10001, Station.Station9Id,   2011, 11, 16, 19, 00, 01,  2)]
[TestCase(10001, Station.Station9Id,   2011, 11, 16, 19, 00, 02,  2)]
[TestCase(10001, Station.Station9Id,   2011, 11, 16, 14, 00, 00,  1)]
[TestCase(10001, Station.Station10Id,  2011, 11, 16, 14, 00, 00,  1)]
[TestCase(10002, Station.Station11Id,  2011, 11, 16, 14, 00, 00,  3)]
[TestCase(10002, Station.Station12Id,  2011, 11, 16, 14, 00, 00,  3)]
public void TestReturnsCorrectResult(int configId, int stationId, int yy, int mm, int dd, int h, int m, int s, int expectedResult)
{
    Assert.That(_sut.GetMatchingFactor(configId, stationId, new DateTime(yy,mm,dd,h,m,s)).Id, Is.EqualTo(expectedResult));
}

Теперь есть только одно утверждение, но проверяется несколько вещей.Это действительно хорошо для интеграционных тестов, подобных описываемому вами.

Обратите внимание, что вы можете передавать константы только через атрибут TestCase, поэтому вы не сможете создать объект DateTime.Вместо этого вам необходимо передать год, месяц, день и т. Д. В качестве параметров метода, а затем создать экземпляр DateTime самостоятельно.

Вы также можете рассмотреть возможность использования сценария T4 для генерации атрибутов TestCase из некоторых другихданные - такие как файл CSV.В прошлом я использовал этот подход с небольшим успехом, и он позволяет конечным пользователям создавать тестовые примеры в Excel и затем передавать их вам.

...