Важно ли конструктор unit test?

Должны ли я конструкторы unit test? Скажем, у меня есть такой конструктор:

        IMapinfoWrapper wrapper;
        public SystemInfo(IMapinfoWrapper mapinfoWrapper)
        {
            this.wrapper = mapinfoWrapper;
        }

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

Ответ 1

Модульное тестирование - это тестирование публичных состояний, поведения и взаимодействий ваших объектов.

Если вы просто установите частное поле в своем конструкторе, что нужно проверить?

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

Ответ 2

Да. Если у вас есть логика в вашем конструкторе, вы должны ее протестировать. Просто настройка свойств не является логической ИМО. Условные обозначения, поток управления и т.д. Логика ИС.

Edit: Вероятно, вам следует проверить, когда IMapinfoWrapper имеет значение NULL, если эта зависимость требуется. Если это так, то это логика, и у вас должен быть тест, который захватывает ваше ArgumentNullException или что-то еще... ваши тесты - это спецификации, определяющие поведение кода. Если он генерирует исключение ArgumentNullException, это должно быть указано в тесте.

Ответ 3

Q: Если вы устанавливаете переменную-член в конструкторе, почему вы ее устанавливаете.

A: Поскольку у вас есть сбой unit test, который может быть передан только путем установки его в конструкторе.

Если вы используете эту логику, где вы только пишете код, чтобы передать unit test (Test Driven Development), то у вас уже будет ответ на ваш вопрос.

Ответ 4

Нет. Его функциональность будет проверяться всеми другими unit test в классе.

Ответ 5

Вы абсолютно должны проверить конструктор. Если у вас есть конструктор по умолчанию, вы должны проверить, что он может быть вызван. Что делать, если впоследствии класс изменен - ​​возможно, он становится синглом или конструктор по умолчанию удаляется в пользу одного требуемого параметра? Тест должен потерпеть неудачу в этом случае, чтобы предупредить об этом изменении (чтобы класс или тест могли быть исправлены для удовлетворения нового требования).

Наличие конструктора по умолчанию - это требование, которое должно иметь проверку. Даже если все конструкторы заданы частными членами, которые будут проверяться в другом месте, необходимо проверить факт отсутствия конструктора без параметров.

Ответ 6

Во многих средах, регулируемых FDA, более критичный код должен быть проверен на 100%... включая построение классов. Таким образом, тестирование конструкторов иногда необходимо, независимо от того, аргументированы или нет, чтобы проверить их. Кроме того, компаниям, использующим инструменты статического анализа, необходимо убедиться, что ВСЕ элементы данных класса правильно инициализированы, чтобы не иметь ошибок, хотя код может работать плавно и без ошибок. Обычно инициализация члена данных выполняется в конструкторе... просто для размышления.

Ответ 7

Это зависит.

Я бы не стал писать специальный конструкторский тест для чего-то такого простого, как пример, который вы дали.

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

Ответ 8

Тестирование аксессуаров и мутаторов также необходимо, если разработчик не гарантирует, что никакая логика состояния не может быть изменена. Например, если вы используете шаблон проектирования для Singleton, часто используются аксессоры или свойства, а если класс не инициализирован, это делается из Accessor, поскольку конструктор является закрытым. В С++ можно создавать свои функции const или static, в которых данные из класса не могут быть изменены. (Примечание. Даже использование статики является немного рискованным, поскольку эти переменные часто являются глобальными.) Однако, без теста, если кто-то не сможет использовать превентивные меры, как вы можете гарантировать с 100% точностью то, что написанное не может стать провалом время? Обслуживание вряд ли безопасно.

Ответ 9

Я думаю, что ответ на этот вопрос: "Да".

Там много кода, который предполагает, как бы ужасно, инициализированное состояние объекта, вместо нулевой ссылки - часто, когда нет явных значений, назначенных в конструкторе.

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

Ответ 10

Я тестирую конструкторы, когда они содержат логику - например, валидация или условная настройка частного состояния. Ошибки проверки приводят к исключению, выведенному из конструктора. Успешное выполнение заканчивается созданием объекта, который проявляет конкретное поведение в зависимости от состояния, которое было установлено в конструкторе. В любом случае это требует тестирования. Но тесты конструктора скучны, потому что все они выглядят одинаково - вызовите конструктор, сделайте утверждение. Объявления тестового метода часто занимают больше места, чем вся логика тестирования... Итак, я написал простую библиотеку тестирования, которая помогает писать декларативные тесты для конструкторов: Как легко тестировать Логика проверки в конструкторах на С#

Вот пример, в котором я пытаюсь использовать семь тестовых примеров для конструктора одного класса:

[TestMethod]
public void Constructor_FullTest()
{

    IDrawingContext context = new Mock<IDrawingContext>().Object; 

    ConstructorTests<Frame>
        .For(typeof(int), typeof(int), typeof(IDrawingContext))
        .Fail(new object[] { -3, 5, context }, typeof(ArgumentException), "Negative  length")
        .Fail(new object[] { 0, 5, context }, typeof(ArgumentException), "Zero length")
        .Fail(new object[] { 5, -3, context }, typeof(ArgumentException), "Negative width")
        .Fail(new object[] { 5, 0, context }, typeof(ArgumentException), "Zero width")
        .Fail(new object[] { 5, 5, null }, typeof(ArgumentNullException), "Null drawing context")
        .Succeed(new object[] { 1, 1, context }, "Small positive length and width")
        .Succeed(new object[] { 3, 4, context }, "Larger positive length and width")
        .Assert();

}

Таким образом, я могу проверить все соответствующие случаи для своего конструктора, не печатая много.

Ответ 11

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

Ответ 12

Какое поведение экземпляра SystemInfo зависит от значения wrapper?

Если что-то может пойти не так (например, нулевое значение вызывает поломку), я предлагаю писать сценарии, описывающие каждую такую ​​ситуацию, и использовать их для определения определения соответствующих модульных тестов.

Если все сценарии в конечном итоге зависят от состояния или поведения частного экземпляра IMapinfoWrapper, тогда я предлагаю вместо этого писать тесты на этот класс.

Ответ 13

Нет, если вы не пишете компилятор, потому что вы будете только тестировать, что компилятор может генерировать код для выполнения назначений, что обычно бессмысленно.

Теперь, в более обычной ситуации, если вы хотите сделать что-то еще с оберткой, тогда, может быть, есть точка. Например, вы могли бы выкинуть ArgumentNullException, если бы попытались передать нуль, и теоретически, который мог бы иметь unit test. Даже тогда значение теста довольно минимальное.

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

Ответ 14

Если конструктор содержит некоторую логику, например инициализацию класса, я думаю, вы должны проверить сам конструктор. Или вы можете поговорить с разработчиком о том, что ввод инициализации в конструкторе сократит тестируемость тестируемого кода.

Ответ 15

Unit Testing - это проверка путей выполнения, что часто упоминается как Cyclomatic Complexity

Если у вас нет пути выбора, no if, no loop, нет GOTO (= P), это не очень полезно