Терминология - Dummy, Fake, Stubs, Spies, Mocks

Просто о NET | создано: 12.10.2022 | опубликовано: 12.10.2022 | обновлено: 13.01.2024 | просмотров: 8241

Терминология имеет очень важное значение для любого разработчика, особенно важно это в концепции Domain Driven Design.

Терминология разработчика

Если вы пишете код, то знаете много специальных терминов, а если вы еще и Unit-тестирование не обходите стороной при написании кода, то тогда эта заметка для вас. В этой заметке я хочу однозначно определить значения некоторых терминов. Даже не столько определить, а поделиться мыслями одного человека - Мартина Фаулера. В своей статье "Mocks Aren't Stubs" он оперирует терминами, которые постоянно на слуху у программистов. Я хочу продублировать эти определения, потому что полностью согласен с ними. 

- А с есть что-нибудь из того, с чем вы не согласны с Марином Фаулером?

- Да. Он "закрывая нос" говорит термины System-Under-Test и/или Object-Under-Test не признавая важности понятий. Я же отчетливо понимаю для чего нужно такое определение.

Термины для Unit-тестирования

Итак, существует такое обобщенное понятие как дубликат для тестирования (Test Double), которое определяет объект для тестирования, дубликат для теста или просто "двойнки". Так вот, это понятие имеет 5 типов. Вот они:

  • Фиктивные (Dummy) объекты передаются, но никогда не используются. Обычно они используются только для заполнения списков параметров.
  • Поддельные (Fake) объекты на самом деле имеют рабочие реализации, но обычно используют какой-то ярлык, который делает их непригодными для производства (хорошим примером является база данных в памяти InMemory).
  • Заглушки (Stubs) предоставляют готовые ответы на вызовы, сделанные во время теста, обычно вообще не реагируя ни на что, кроме того, что запрограммировано для теста.
  • Шпионы (Spies — это заглушки, которые также записывают некоторую информацию, основанную на том, как они были названы. Одной из форм этого может быть служба электронной почты, которая записывает, сколько сообщений было отправлено. Другими словами, это специальные Logger's.
  • Макеты (Mocks) — это то, о чем написано в статье, указанной выше: объекты, предварительно запрограммированные с ожиданиями, которые формируют спецификацию вызовов, которые они должны получать.

Все перечисленные объекты являются Test Double.

Причем Stub, Spy и Mock являются конфигурируемыми (configurable) и/или жестко закодированными (hard-coded).

Различия между макетами и заглушками (Mock vs Stub)

Ниже приведены различия между заглушками и макетами:

  • Макеты (Mock) вызываются тестируемым классом. Заглушки (Stub) предоставляет данные тестируемому классу.
  • Объект Mocks используется для проверки поведения. Для проверки состояния используются объекты-заглушки (Stub).
  • Макеты (Mocks) могут не пройти тест. Заглушка (Stubs) не может завершить тест и возвращает значение stubbed.
  • Макеты (Mocks) могут предоставлять данные и логику, необходимые классу. C помощью заглушек (Stub) данные непосредственно вводятся в классы.

Заключение

Очень надеюсь, что не запутал вас еще больше. В любом случает, надо понимать, что если что-то придумано, то это не просто так. А какие термины вам показались запутанными или неочевидными?