Как мне предотвратить мою единицу тесты, требуя знаний о внутренних органах реализации при использовании объектов MOCK?

StackOverflow https://stackoverflow.com/questions/3448121

Вопрос

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

Например: я хочу проверить класс, который реализует очень простой интерфейс для чтения и записи настроек приложения (в основном пары имени / значения). Интерфейс, который представлен потребителю, полностью агностик, где и как на самом деле хранится значения (например, реестр, INI-файл, XML, база данных и т. Д.). Естественно, уровень доступа реализуется еще одним классом, который вводится в тестированный класс на строительство. Я создал объект Mock для этого уровня доступа, и теперь я могу полностью проверить класс реализации интерфейса, не прочитав и не записывающую что-либо до любого реестра / INI-файла / что угодно.

Однако, чтобы обеспечить ведение издевательства в точности, как и реальная вещь, доступ к тестированному классу, моители моих модулей должны настроить объект MOCK, очень явный определение ожидаемых вызовов методов и значения возврата, ожидаемых тестированным классом. Это означает, что если я должен когда-либо придется вносить изменения в интерфейс уровня доступа или к тому, что тестированный класс использует этот слой, мне также придется изменить тесты устройства для класса, который внутренне использует этот интерфейс, даже если интерфейс Из класса я на самом деле тестирование не изменилось вообще. Это то, что мне просто нужно будет жить с использованием издеваний или есть лучший способ разработать зависимости классов, которые бы избежать этого?

Это было полезно?

Решение

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

Много раз издевательства (особенно чувствительные рамки, такие как Jmock), заставляют вас принять информацию о том, чтобы получить детали, которые не относятся непосредственно к поведению, вы пытаетесь проверить, а иногда это может быть даже полезно, подвергая подозреваемому коду, который делает слишком много и имеет слишком много звонков / зависимостей.

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

Это означает, что если мне нужно когда-либо придется вносить изменения в интерфейс уровня доступа или к тому, что тестированный класс использует этот слой, мне также придется изменить тесты устройства для класса, который внутренне использует этот интерфейс, даже если интерфейс Из класса я на самом деле тестирование не изменилось вообще.

Разве не точка написания абстрагированного слоя доступа, чтобы избежать этого? В общем, после Открытый / закрытый принцип, интерфейс такого рода не должен Измените и не должны нарушать контракт с классом, который потребляет его, и по расширению. Теперь, если вы измените порядок вызовов метода, или должны делать новые вызовы в абстрактный слой, то да, особенно с некоторыми каркасами, ваши макеты ожидания будут сломаться. Это просто часть стоимости использования издеваний, и она совершенно приемлема. Но сам интерфейс должен в целом оставаться стабильным.

Другие советы

Чтобы провести макет точно так же, как и реальная вещь, доступ к тестированному классу, моители моих единиц должны настроить объект MOCK, очень явно определяющий ожидаемые вызовы методов и значения возврата, ожидаемых тестированным классом.

Правильный.

Изменения на интерфейс уровня доступа или к тому, как тестированный класс использует этот слой, мне также придется изменить тесты на единицу

Правильный.

Несмотря на то, что интерфейс класса, который я на самом деле тестирую, вообще не изменился.

«На самом деле тестирование»? Вы имеете в виду открытый класс интерфейса? Хорошо.

Способ «тестированного» (интерфейс) класса использует уровень доступа означает, что вы изменили внутренний интерфейс к слою доступа. Изменения интерфейса (даже внутренние) требуют изменения тестов и могут привести к поломке, если вы сделали что-то не так.

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

Тестирование не должно быть «надежным». Это должно быть ломким. Если вы сделаете изменение, которое изменяет внутреннее поведение, то вещи могу перерыв. Если ваши тесты были слишком устойчивыми, они бы ничего не проверили - они просто работают. И это неправильно.

Испытания должны работать только на точную правильную причину.

Просто чтобы поставить некоторые имена на ваш пример,

  • RegistryBasedDictionAry реализует словарь роли (интерфейс).
  • RegistryBasedDictionAry имеет зависимость от реестра ролей, реализованный реестромвинапинхраппером.

В настоящее время вы заинтересованы в тестировании RegistryBaseddictionAry. Установка тестов введет впрыску зажижения для роли реестра аксессуаров и проверит ожидаемое взаимодействие с зависимостями.

  • Хитрость здесь, чтобы избежать ненужного тестового обслуживания, - этоУкажите именно то, что должно произойти .. и не больше." (От книга Goos (Обязательно читайте для макета в ароматизированном TDD), поэтому, если порядок вызовов метода зависимостей не имеет значения, не указывайте его в тесте. Это оставляет вас свободно изменить порядок звонков в реализации.)
  • Разработать роли, такие, что они не содержат никаких утечек от фактических реализаций - Держите роли внедрения - агности.

Единственная причина изменить реестрбазнические тесты, было бы изменением поведения реестрабазматического стихия, а не в каких-либо ее зависимостях. Так что если его взаимодействие с его зависимостями или изменением ролей / контрактов, тесты должны быть обновлены. Отказ Это цена тестов на основе взаимодействия, которые вам необходимо оплатить, для гибкости для тестирования в изоляции. Однако на практике это не так часто бывает.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top