Мы используем StructureMap в новом проекте по разработке программного обеспечения. Один из членов команды реализовал модульный тест, который в основном проверяет конфигурацию контейнера StructureMap . Это делается следующим образом;
- Подсчитывает количество экземпляров сборок, настроенных для классов в нашем пространстве имен приложения.
- Определяет ожидаемые экземпляры на уровне класса
- Утверждает, что ожидаемые экземпляры соответствуют общему количеству найденных экземпляров.
- Утверждает, что ожидаемые экземпляры соответствуют определенным в тесте
Примером этого является;
var repositories = container.GetAllInstances<IEnvironmentRepository>();
Assert.AreEqual(1, repositories .Count());
foundInstances = foundInstances + repositories .Count();
У нас также есть «модульные тесты» для следующего класса;
public MyClass(IEnvironmentRepository environmentRepository)
{
}
В этих тестах мы издеваемся над IEnvironmentRepository, поэтому не будем вставлять его из контейнера, как это происходит в работающей системе.
Коллега проигнорировал юнит-тест в конфигурации structmap с комментарием в строке «Юнит-тест только проверяет свою собственную конфигурацию». Это было очевидно целью теста и, на мой взгляд, совершенно справедливо. Я попросил парня, который проигнорировал тест, удалить конфигурацию структуры карты IEnvironmentRepository
(тест пока игнорируется) и запустить полный набор модульных тестов, все они прошли. Затем мы запустили приложение, и оно упало, потому что конфигурация контейнера стала недействительной. На мой взгляд, это доказало ценность теста, мой коллега все же не согласился. Он просто заявил, что мы не должны тестировать конфигурацию, но я считаю, что это вполне в рамках юнит-теста.
Итак, ряд вопросов;
- Является ли это действительным модульным тестом - мы тестируем конфигурацию нашего контейнера, а не то, что Structuremap работает (но я вижу наложение)
- Если нет, как вы можете проверить конфигурацию, не проверяя ее. Как вы можете остановить кого-то случайно удалить необходимую строку кода и проверить его?
- Должен ли
MyClass
модульный тест разрешить экземплярIEnvironmentRepository
из контейнера и передать его?
источник
Ответы:
Это совершенно правильный автоматический тест. Я называю их «тестами архитектуры», поскольку они проверяют надежность скелетных компонентов вашей кодовой базы.
Может ли контейнер IoC разрешать и составлять все деревья объектов в приложении? Может ли Auto Mapper сопоставлять все свои зарегистрированные объекты без сбоев? Разве центральный слой в Архитектуре Лука не ссылается на что-то внешнее?
Эти тесты могут сэкономить вам много времени, когда ошибка конфигурации проскальзывает, указывая на точного виновника. Хорошие фреймворки дадут вам очень точные сообщения об ошибках о том, что не так, и вы получите их, как только вы запустите тесты (в идеале, непрерывно) вместо того, чтобы углубляться в трассировку стека выполнения, если вам повезет.
Являются ли они модульными тестами ... вероятно, нет, но они все еще работают в памяти по большей части и работают довольно быстро. Опять же, я не знаю, это не похоже на общепринятое определение модульного теста.
источник
Проблема с таким тестом, который проверяет внутреннюю часть программы, а не ее требование. Разве что тест может провалиться, даже если программа работает как требуется.
В вашем случае, когда вы меняете настройку контейнера, возможно, у вас появляется новая зависимость, которую нужно внедрить, вы нарушаете свой тест.
Кроме того, если вы добавили дополнительное требование зависимости, но забыли добавить его в контейнер и изменить тест контейнера. все пройдет, но ваша программа потерпит крах.
Лучшим автоматическим тестом было бы запустить программу и посмотреть, не сработает ли она.
Вы должны отлавливать эти типы ошибок при интеграции или тестировании пользовательского интерфейса, даже если они не проходят модульные тесты.
Сказав это, растущая сложность настройки контейнера является болью в заднице. Возможно, некоторые «плохие» тесты того стоят.
источник
Модульные тесты, тестовый код. Все, что находится за пределами этого, является «другим» автоматическим тестированием - называйте это как хотите. Вы, кажется, тестируете конфигурацию здесь. Если конфигурация может измениться в зависимости от среды, она не входит в модульный тест. Попробуйте добавить атрибут test, чтобы указать, что этот тест отличается от других тестов.
источник
Обязанность контейнера ввода зависимостей - склеивать разные модули в одном рабочем приложении .
Если вы пишете автоматизированные тесты для своего приложения - у вас должно быть несколько «интеграционных (или приемлемых) тестов, которые выполняют тесты« от конца до конца », которые будут тестировать весь конвейер вашего приложения, чтобы все модули, участвующие в конкретном тестовом примере, были склеены вместе правильно .
Таким образом, эти интеграционные тесты не пройдут, если контейнер внедрения зависимости не был настроен должным образом Что делает модульные тесты для самого контейнера бесполезными, потому что интеграционный тест должен показать возможные ошибки в конфигурации контейнера.
Вам не нужно покрывать все возможные тестовые примеры в интеграционных тестах, только один тестовый пример для каждой функции, которая охватывает полный путь от пользовательского интерфейса до базы данных.
Если тесты интеграции не охватывают создание какой-то конкретной зависимости - вы просто добавляете такую.
С помощью интеграционных тестов вы можете свободно менять контейнеры без переписывания юнит-тестов для их конфигурации.
источник
ИМО, ответы таковы:
Является ли это действительным модульным тестом - мы тестируем конфигурацию нашего контейнера, а не то, что Structuremap работает (но я вижу наложение)
Если нет, как вы можете проверить конфигурацию, не проверяя ее. Как вы можете остановить кого-то случайно удалить необходимую строку кода и проверить его?
Должен ли модульный тест MyClass разрешить экземпляр IEnvironmentRepository из контейнера и передать его?
источник
UnitTest проверяет желаемое поведение подразделения в отделении .
Это означает, что любая конфигурация не входит в объем UnitTests .
Тем не менее у вас должны быть автоматические тесты для ваших конфигураций, но это не UnitTests ...
источник