Что не так с Stubs для модульного тестирования?
Я просто смотрел этот забавный видеоролик YouTube об модульном тестировании (это Гитлер с поддельными субтитрами, выманивал свою команду за то, что он не делал хороших модульных тестов - пропустите его, если вы недовольны юмором), где окурки подвергаются резкой критике. Но я не понимаю, что случилось с заглушками.
Я не начал использовать фальшивую фреймворк, и я не начал чувствовать, что боль не используется.
Я нахожусь в мире, когда-то ранен, выбрал рукописные заглушки и подделки вместо издевок (например, Rhinomock и т.д.)? (с использованием таксономии Фаулера)
Каковы соображения для выбора между макетным и рукописным заглушками?
Ответы
Ответ 1
В пеньках нет ничего плохого, есть место для пней, насмешек... и шпионов. Все они - "двойники теста", но с разными целями, как объяснено в Мотах, и Заглушки не шпионы:
[...] Прежде чем двигаться дальше, я хотел бы уточнить и определить некоторые используемые здесь термины, которые я впервые обнаружил в книге Джерарда Месароса " Шаблоны xUnit".
- Пустой объект - это объект-заполнитель, который передается в тестируемую систему, но никогда не используется.
- Test Stub предоставляет тестируемой системе косвенный ввод
- Тестовый шпион предоставляет способ проверить, что тестируемая система выполнила правильный косвенный вывод
- Mock Object предоставляет тестируемой системе как косвенный ввод, так и способ проверки косвенного вывода
[...] И вы можете позволить этой удобной диаграмме направлять ваши решения:
![alt text]()
PS: Mockito - Новая Mock Framework на Блоке тоже стоит того, чтобы ее прочитать.
Ответ 2
Я использую следующую терминологию (введенный Роем Ошеровым, автором Искусства Unit-Testing):
Подделка называется заглушкой, если вы скажете ей подделать что-то в случае вызова метода с такими и такими параметрами. Но если вы также убедитесь, что такой звонок действительно имел место или имел место ровно N раз, то такая подделка называется макетом. Вкратце. подделка является заглушкой, если вы не вызываете Verify() на ней, а затем это макет.
Очевидно, что вам нужно будет использовать заглушки в некоторых случаях и издеваться над другими. Таким образом, критика окурков кругом, вероятно, неверна, и использование исключений, возможно, тоже ошибочно.
Если вы еще не начали использовать насмешливую структуру (альтернативный термин: структура изоляции), вы должны следить за ними и часто пересматривать свои варианты. Я очень быстро перешел от ручных макетов к NMock2 в Moq. Здесь интересный poll программистов, который показывает, что они используют. Ручные макеты/заглушки находятся в меньшинстве, но это не так уж редко.
Ответ 3
Mocks намного проще вбрасывать. Они являются реальным примером вашего класса, предварительно укоренившимся с возможностью переопределить действие любого метода с минимальным шаблоном.
Есть много небольших соображений, таких как: Если вы не хотите иметь дело с каким-либо из методов, вы можете либо заставить его действовать как нет-op, либо не пройти тест - ваш выбор - но в любом случае практически никакого кода.
Сколько шаблонов вы получите, когда закончите класс? Как вы справляетесь с этим, если ваш класс является окончательным? Вы играете в трюки, чтобы сначала получить свой заглушку на пути к классу или использовать другой источник?
Я рекомендую только начинать с макетов - все проще вокруг.
Ответ 4
Нет ничего плохого в использовании заглушек вместо mocks.
Если вы хотите получить техническую информацию, mocks - это "умные" объекты с ожиданиями, которые можно проверить. Stub - это фиктивные объекты, которые возвращают заданные значения. См. Mocks не являются заглушками.
Но многие люди (включая меня) предпочитают проводить тестирование состояния с помощью заглушек, а не тестирование поведения с помощью mocks. Вы вводите заглушку в тестируемый класс, вы вызываете метод, затем проверяете состояние тестируемого класса. Он имеет тенденцию делать менее хрупкие тесты, чем утверждать, что внутренние элементы класса называются методом X макетного объекта с аргументом Y.
Я не думаю, что тебе нужен мир. Если вы еще не начали ощущать боль, вам, вероятно, еще не нужна изоляция/насмешка. Когда и если вы это сделаете, рукописные заглушки/подделки вокруг ничего не повредят.
Если у вас много интерфейсов или у ваших интерфейсов много методов, среда изоляции/издевки может сэкономить много времени на ручных кодировках.
Мне нравится Moq; Мне легче использовать, чем Rhino Mocks для создания заглушек.
Ответ 5
Моски и заглушки используются для достижения реального unit test. Вы просто издеваетесь над всеми зависимостями и unit test своим классом изолированно.
В настоящее время я использую MOQ для насмешек и stubbing.