Go модульное тестирование (2): заглушка и макет
Go модульное тестирование (2): заглушка и макет
1. Введение:

Для бизнес-кода, который мы обычно разрабатываем, одна функция часто не является независимой. Она должна зависеть от других модулей, сторонних библиотек, баз данных, результатов взаимодействия сообщений и т. д.

Модульное тестирование такого кода станет намного сложнее, и для тестируемой в данный момент функции эти другие зависимые функции являются не чем иным, как возвратом разных данных. Таким образом, при модульном тестировании нам нужно только позволить этим другим зависимым функциям возвращать ожидаемые нами данные, и тогда мы сможем продолжить тестирование функции, которую нам нужно протестировать в данный момент.

В описанной выше ситуации внешней зависимости мы часто используем два метода для ее решения: один — Mock (симуляция), а другой — Stub (заглушка). Мы можем смоделировать ненормальное поведение этих внешних зависимостей (например: база данных недоступна, http-сообщение возвращает ошибку), а затем контролировать, какие ветки принимает тестируемая функция.

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

Во-первых, нам нужно знать, какие они? Во-вторых, нам нужно знать, в чем между ними разница?

Mock: означает симуляцию, которая означает создание структуры в тестовом пакете для удовлетворения интерфейса {} внешней зависимости. Заглушка: означает заглушку, которая относится к созданию фиктивного метода в тестовом пакете для замены метода в сгенерированном коде.

2. Примеры

Эти примеры относительно просты и предназначены только для демонстрации использования макетов и заглушек.

1. Ложный пример:

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

Замена, используемая в макете, заключается в замене всего интерфейса (примечание: интерфейс может быть входным параметром или переменной в структуре, но замену необходимо завершить перед тестированием).

Примеры следующие:

Функция GetType изначально выполняла множество различных операций на основе разных входных параметров, включая сложение, вычитание и присвоение нуля.

После макетирования укажите тип GetType, чтобы выполнить только одну операцию «сложение».

Output:

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

2. пример заглушки:

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

Примеры следующих: (Примечание. Этот пример относительно прост и предназначен только для демонстрации использования заглушки.)

Функция GetType изначально выполняла множество различных операций на основе разных входных параметров, включая сложение, вычитание и присвоение нуля.

После заглушки укажите, что тип GetType выполняет только одну операцию: сложение.

Output:

Перед накоплением: функция-функция будет выполнять разные операции и выводить разные результаты в зависимости от значения входного параметра, а именно: брать 0; выполнять сложение: 2+5 = 7; выполнять вычитание: 5-1 = 4. После разбивки: функция-заглушка StubFunc возвращает только одну операцию «сложение», поэтому тестовый пример работает в соответствии с сложением независимо от типа входных параметров: 1+3 = 4; 2+5 = 7; = 6;

3. Сравнение макета и заглушки

1) И макет, и заглушка используют замену для реализации зависимостей в тестируемой функции, но макет использует замену интерфейса, а заглушка использует подстановку функции. 2) Реализация макета не является навязчивой для функционального кода, тогда как заглушка относительно навязчива. При реализации функциональных функций необходимо настроить некоторые функции обратного вызова для тестирования, которые здесь являются так называемыми заглушками. 3) Что касается метода управления заменой, если макет хочет поддерживать разные выходные данные, ему необходимо заранее реализовать разные коды ветвления и даже определить разные структуры макета для реализации. Такой макетный код станет макетным кодом, поддерживающим всю логику. При максимальном наборе ветвей сложность макетного кода станет выше; заглушка может хорошо управлять различными ветвями функции-заглушки, поскольку заглушка заменяет функцию, поэтому до тех пор, пока этот вид вывода необходимо использовать снова. , определите функцию, которая будет Да, эта функция может быть даже анонимной.

На основе приведенного выше анализа,Мы можем придумать способ,Пусть заглушка и макет будут объединены,Примеры следующие:

Тестируемый код соответствует макетному примеру. В макетном коде добавлены две новые переменные: функция обратного вызова и возможность использования функции обратного вызова. В тестовом примере выходные результаты функции-заглушки контролируются путем реализации различных функций-заглушек.

Output:

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

Резюме: Судя по трем приведенным выше примерам, макет и заглушка имеют свои преимущества и недостатки, а комбинация макета и заглушки является очень хорошим практическим методом. Однако окончательный метод, используемый для разработки тестовых примеров, зависит от конкретной ситуации. сцена. (Примечание: Google предоставляет специальный модуль для модульного тестирования, который будет представлен в последующих главах.)

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose