Как правильно гранулярности для тестирование?


Я не очень опытный в тест-разработки через тестирование (TDD), но я пытаюсь попасть в паз. Здесь я делаю консольное приложение, которое создает записи в базе данных. Я проинициализирован путем создания консольного приложения, а затем пусть действия MSTest сделать модульного тестирования для основных(string [] аргументы).

Я знаю, что я делаю хоть что-то правильно, потому что тесты не проходят, пока я не сделал развития-они "гнали" меня "развивать".

Но мне кажется, что я до сих пор не понял, как я на самом деле не проверить мой код - я проверил базу данных код действовал на. Как бы опытный подход TDDer это?

[TestClass]
public class ProgramTest
{
    private MyEntities _model;

    [TestInitialize()]
    public void MyTestInitialize()
    {
        _model = new MyEntities();
    }

    [TestCleanup()]
    public void MyTestCleanup()
    {
        _model.Dispose();
    }

    [TestMethod()]
    public void MainTest_01_Create_PayTerms()
    {
        string[] args = new[]  { "/Operation", "Insert", "/RecordType", "PayTerms" };
        DirectAgentsService.Program.Main(args);

        _model.PayTerms.SelectValue<string>("it.Name").ShouldContain("Biweekly", "Retainer", "Net 7", "Net 15", "Net 30");
    }
}
static public class Extensions
{
    static public void ShouldContain(this string[] source, params string[] targets)
    {
        foreach (var target in targets)
        {
            Assert.IsTrue(targets.Any(c => c == target), "{0} is missing from collection", target);
        }
    }

    static public void ShouldContain<T>(this T source, params string[] targets) where T : ObjectQuery<string>
    {
        source.ToArray().ShouldContain(targets);
    }
}


907
7
задан 29 сентября 2011 в 06:09 Источник Поделиться
Комментарии
2 ответа

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


  • Инъекции зависимостей: избежать constucting объекты внутри других объектов; вместо этого, передать уже построенные в конструкторе, или свойства, если это необходимо. Ищите нового сайта и избежать его (исключения применяются, например, для классов, которые являются чистыми данными). Конечно, в какой-то момент объекты должны быть построены. Это должно быть сделано на высоком уровне классы (говорят где-то возле консоли приложения в Main()) в такой точке, что достаточно просто не нужны (блок) тестирование (так как вы не сможете полностью проверить его).
    Инъекции зависимостей позволяют вводить макет или поддельные версии других классов вы зависимы от.

  • Глумливые/раскорчевка/притворяется/парный тест: ваш юнит-тесты должны проверять только одно, не все то, что один это зависит (у них есть свои тесты). Это позволяет локализовать (как в узнать местонахождение) любые ошибки, которые появляются. Вы можете написать свои собственные корешки, но там отличные библиотеки, и через них вводит немного больше согласованности о том, как ваши тесты работают/выглядят. NSubstitute является хорошим выбором, потому что он использует методы расширения, будет очень легко читать.

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

Однако, модульные тесты развития-не единственный тип: БДД (поведение в развитии) фокусируется на функциональных тестов.

9
ответ дан 2 октября 2011 в 12:10 Источник Поделиться

Вы не должны использовать MyEntities в модульных тестах. Эффективно вы делаете тестирование интеграции здесь, так как каждый тест будет использовать базы данных и зависит от хранимых данных.

Вместо того, чтобы издеваться из MyEntities или сделать MyEntities наследовании от интерфейса IMyEntities , что контракт на вашей настойчивости слоя.

Теперь вы можете создать отдельную MyTestEntities реализует IMyEntities так что вы можете проверить ваши ожидания независимых данных магазина. Затем после выполнения класса/метода тестирования проверки на макет.

4
ответ дан 29 сентября 2011 в 06:09 Источник Поделиться