Gtest summary_gtest модульный тест
Gtest summary_gtest модульный тест

Всем привет, мы снова встретились, я ваш друг Цюаньчжаньцзюнь.

Платформа модульного тестирования Google C++ (сокращенно Gtest) может использоваться на нескольких платформах (включая Linux, Mac OS X, Windows, Cygwin и Symbian). Она обеспечивает широкие возможности утверждения, оценку фатальных и нефатальных ошибок и может выполнять тестирование значений параметров. , введите параметризованное тестирование, «тестирование на смерть».

1 подтверждение

Как правило, чтобы проверить, нормально ли выполняется метод (функция), вы можете предоставить некоторые входные данные. После вызова этого метода (функции) получить выходные данные, а затем проверить, соответствуют ли выходные данные нашим ожидаемым результатам. непротиворечивы, то это означает, что логика этого метода верна, в противном случае существует проблема. При проверке результатов вывода,Gtest предоставляет мне серию утверждений для тестирования кода.,Эти макросы чем-то похожи на вызовы функций. Если утверждение не выполнено, Gtest распечатает исходный файл на момент утверждения и местоположение строки ошибки.,и дополнительная информация о сбоях。Пользователи могут получить доступ к дополнительной информации об этих результатах напрямую через“<<”В этих утверждениях Макроспозже。

В Gtest макросы утверждений можно разделить на две категории: серия ASSERT и серия EXPECT.

ASSERT_* ряд утверждений (Fatal утверждение), при сбое контрольной точки выйти из текущей функции (примечание: не выходить из текущего случая).

EXPECT_* ряд утверждений (Нефатальный утверждение), в случае сбоя контрольной точки продолжить выполнение следующей контрольной точки (каждое утверждение представляет собой контрольную точку).

Обычно EXPECT_ следует использовать первым, поскольку ASSERT_* не будет очищаться после сообщения об ошибке, что может привести к утечкам памяти.

1.1 Логическая проверка

Fatal assertion

Nonfatal assertion

Verifies

ASSERT_TRUE(condition);

EXPECT_TRUE(condition);

condition is true

ASSERT_FALSE(condition);

EXPECT_FALSE(condition);

condition is false

1.2 Проверка двоичного значения

Fatal assertion

Nonfatal assertion

Verifies

ASSERT_EQ(expected, actual);

EXPECT_EQ(expected, actual);

expected == actual

ASSERT_NE(val1, val2);

EXPECT_NE(val1, val2);

val1 != val2

ASSERT_LT(val1, val2);

EXPECT_LT(val1, val2);

val1 < val2

ASSERT_LE(val1, val2);

EXPECT_LE(val1, val2);

val1 <= val2

ASSERT_GT(val1, val2);

EXPECT_GT(val1, val2);

val1 > val2

ASSERT_GE(val1, val2);

EXPECT_GE(val1, val2);

val1 >= val2

Обычно бинарное сравнение,Все они сравниваются с содержимым памяти, где находится структура. Большинство собственных типов в C++ можно сравнивать с помощью двоичных сравнений. Но для пользовательских типов,Нам нужно определить поведение некоторых операторов,например=、<ждать。

1.3 Проверка строки

Fatal assertion

Nonfatal assertion

Verifies

ASSERT_STREQ(expected_str, actual_str);

EXPECT_STREQ(expected_str,actual_str);

the two C strings have the same content

ASSERT_STRNE(str1, str2);

EXPECT_STRNE(str1, str2);

the two C strings have different content

ASSERT_STRCASEEQ(expected_str, actual_str);

EXPECT_STRCASEEQ(expected_str, actual_str);

две строки C имеют одинаковое содержимое, игнорируя регистр

ASSERT_STRCASENE(str1, str2);

EXPECT_STRCASENE(str1, str2);

две строки C имеют разное содержимое, игнорируя регистр (игнорируя небольшой размер)

*STREQ* и *STRNE* поддерживают типы char* и wchar_t*, но *STRCASEEQ* и *STRCASENE* принимают только char*.

1.4 Проверка исключений

Fatal assertion

Nonfatal assertion

Verifies

ASSERT_THROW(statement, exception_type);

EXPECT_THROW(statement, exception_type);

statement throws an exception of the given type

ASSERT_ANY_THROW(statement);

EXPECT_ANY_THROW(statement);

statement throws an exception of any type

ASSERT_NO_THROW(statement);

EXPECT_NO_THROW(statement);

statement doesn’t throw any exception

1.5 Проверка плавающей запятой

Fatal assertion

Nonfatal assertion

Verifies

ASSERT_FLOAT_EQ(expected, actual);

EXPECT_FLOAT_EQ(expected, actual);

the two float values are almost equal

ASSERT_DOUBLE_EQ(expected, actual);

EXPECT_DOUBLE_EQ(expected, actual);

the two double values are almost equal

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

1.6 Проверка схожего значения

Fatal assertion

Nonfatal assertion

Verifies

ASSERT_NEAR(val1, val2, abs_error);

EXPECT_NEAR(val1, val2, abs_error);

the difference between val1 and val2 doesn’t exceed the given absolute error

2 Макротест

2.1 ТЕСТОВЫЙ Макрос

ТЕСТ-макрос — очень важный Макрос,это представляет собой тестособый случай,Его прототип:

Первый параметр макроса TEST — test_suite_name (имя набора тестов), а второй параметр — test_name (имя специального случая теста). Разница и связь между именем набора тестов и именем тестового набора (также называемым именем теста):

Набор тестов (тестовый набор) — это набор тестовых входных данных, условий выполнения и ожидаемых результатов, составленный для конкретной цели, чтобы протестировать определенный путь программы или проверить, выполняется ли определенное требование. Тестовый пример — это (групповой) тест. .

Если взять приведенный выше код в качестве примера, три макроса TEST составляют набор тестов. Имя набора тестов — FactorialTest (обнаружение факториального метода, функция test Factorial). Этот вариант использования охватывает три особых случая тестирования — отрицательный, нулевой и положительный. чтобы обнаружить три особых случая, когда входным параметром является отрицательное число, ноль и положительное число.

В именах наборов тестов и тестовых наборах нельзя использовать символы подчеркивания (_). Потому что исходный код GTest должен использовать символы подчеркивания, чтобы объединить их в независимое имя класса.

Это также требует, чтобы у нас не было одинаковой комбинации «имени набора тестов и имени специального случая» — иначе имена классов будут перекрываться.

Разделение имени набора тестов и имени тестового набора придает написанному нами тестовому коду более четкую структуру — как зависимую, так и независимую. Зависимость связана через одно и то же имя набора тестов, тогда как независимость отражается через разные имена тестовых наборов.

2.2 Макрос TEST_F

Протестируйте класс PositiveNum.

Прежде чем использовать TEST_F, вам необходимо создать класс прошивки, который наследуется от класса ::testing::Test. Используйте public или protected внутри класса для описания его членов, чтобы гарантировать, что фактически выполняемый тестовый подкласс может использовать его переменные-члены. В конструкторе или методе SetUp, унаследованном от класса ::testing::Test, могут быть реализованы данные, которые нам нужно сконструировать. В деструкторе или методе TearDown, унаследованном от класса ::testing::Test, может быть реализован некоторый код освобождения ресурсов. Выбор «Конструктор/Деструктор» и «SetUp/TearDown» не имеет единого стандарта, определяющего, когда и какую пару выбирать. Вообще говоря, не делайте ничего запрещенного в конструкторе/деструкторе, например, выбрасывайте исключения и т. д.

Реализации макроса TEST_F и макроса TEST очень близки, за исключением того, что инкапсуляция макроса TEST_F более открыта, поэтому функции макроса TEST расширены. Его прототип:

Первый параметр — это имя набора тестов (в соответствии с именем созданного класса встроенного ПО), а второй параметр — это имя теста, которое можно выбрать произвольно.

В первом тесте значение данных элемента pn1 было изменено на -2, и результат теста был в порядке. Затем результат второго теста также был в порядке (если изменение первого теста повлияет на второй тест, результат должен быть неудачным). Все частичные тесты верны и проверяют постоянство данных в классе прошивки. Каждый тестовый пример заключается в создании нового объекта PositiveNumTest и его уничтожении в конце тестового примера, чтобы гарантировать чистоту данных.

Разница между TEST_F и TEST заключается в том, что TEST_F предоставляет функцию инициализации (SetUp) и функцию очистки (TearDown). Переменные, используемые в TEST_F, могут быть инициализированы в функции инициализации SetUp и уничтожены в TearDown, и все TEST_F независимы друг от друга. . все начинают работать в состоянии после инициализации. Один TEST_F не повлияет на данные, используемые другим TEST_F. Если для нескольких сценариев тестирования требуется одна и та же конфигурация данных. ТЕСТ_Ф.

2.3 Макрос TEST_P

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

Проверьте функцию IsPrime (определите, является ли входное значение простым числом).

Чтобы использовать макрос TEST, вам необходимо написать следующий тестовый пример: Каждый раз, когда вы вводите значение, вам нужно написать тестовую точку. Это только в одном тесте. Если вы создаете отдельный тест для каждой контрольной точки, рабочая нагрузка. будет больше.

Использование макроса TEST_P для параметризации ввода намного проще.

Создайте параметризованный класс IsPrimeParamTest. Унаследован от класса шаблона TestWithParam.,TestWithParamИ наследоватьTestиWithParamInterface<T>。

WithParamInterface<T>Этот класс шаблона определяетParamType,Используется для вывода типа параметра,Предоставьте функцию GetParam().,Используется для получения параметров логики реализации в TEST_PМакрос.

Используйте макрос INSANTIATE_TEST_CASE_P, чтобы указать gtest диапазон параметров, который вы хотите протестировать:

Первый параметр PARAM является префиксом тестового примера и может быть выбран произвольно.

Второй параметр — это имя тестового примера, которое должно совпадать с именем ранее определенного параметризованного класса, например: IsPrimeParamTest.

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

Range(begin,end[,step])

Диапазон находится между началом и концом, а размер шага равен шагу, исключая конец.

Values(v1, v2, …, vN)

Значения от v1, v2 до vN

ValuesIn(container) /ValuesIn(begin, end)

Получите значение из массива типа C, контейнера STL или итератора.

Bool()

Возьмите два значения: false и true

Combine(g1, g2, …, gN)

Он упорядочивает и объединяет g1, g2,...gN. g1, g2,...gN сам по себе является генератором параметров. Каждый раз значение извлекается из g1, g2,...gN и объединяется в кортеж. в качестве параметра.

В TEST_P есть два параметра: первый — это имя набора тестов (в соответствии с именем созданного тестового класса), а второй — имя специального случая теста.

3. Механизм событий предварительной обработки

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

1. Глобальный, до и после выполнения всех тестов.

2. Уровень TestSuite: перед первым тестом в наборе тестов и после выполнения последнего теста.

3. Уровень TestCase до и после каждого теста.

3.1 Глобальные события

Для реализации глобальных событий необходимо написать класс, который наследует класс Testing::Environment и реализует внутри него методы SetUp и TearDown.

1. Метод SetUp() выполняется до выполнения всех случаев.

2. Метод TearDown() выполняется после выполнения всех кейсов.

Вам также необходимо подключить событие, вызвав функциюtest::AddGlobalTestEnvironment в основной функции. Другими словами, мы можем написать множество таких классов, а затем подключить их события. Функция AddGlobalTestEnvironment должна быть помещена перед RUN_ALL_TEST.

3.2 Событие TestSuites

Нужно написать класс,Наследование тестирования::Test,Затем реализуйте двастатическийметод

1. Метод SetUpTestCase() выполняется перед первым TestCase.

2. Метод TearDownTestCase() выполняется после последнего TestCase.

3.3 Событие TestCase

Событие TestCase зависает до и после выполнения каждого кейса. Способ реализации практически такой же, как и у Test’Suites, но нужно реализовать метод SetUp и метод TearDown:

1. Метод SetUp() выполняется перед каждым TestCase.

2. Метод TearDown() выполняется после каждого TestCase.

4. Запись о выполнении тестового примера

Макрос RUN_ALL_TESTS(), судя по названию, предназначен для запуска всех тестовых случаев. Это настоящая точка входа для нас для запуска тестовых случаев. Его прототип:

RUN_ALL_TESTS() — это макрос, реализованный как функция. Здесь вызывается функция Run синглтона UnitTest. Глядя на вызывающий процесс, вы можете видеть, что вызывающий процесс.

1.UnitTest::Run()

2. UnitTestImpl::RunAllTests()

3. TestCase::Run()

4. TestInfo::Run()

5. Test::Run()

5. Справочная документация

【1】google mock представлять

【2】google test представлять

Заявление об авторских правах: Содержание этой статьи добровольно предоставлено пользователями Интернета, а мнения, выраженные в этой статье, представляют собой только точку зрения автора. Данный сайт лишь предоставляет услуги по хранению информации, не имеет никаких прав собственности и не несет соответствующей юридической ответственности. Если вы обнаружите на этом сайте какое-либо подозрительное нарушение авторских прав/незаконный контент, отправьте электронное письмо, чтобы сообщить. После проверки этот сайт будет немедленно удален.

Издатель: Лидер стека программистов полного стека, укажите источник для перепечатки: https://javaforall.cn/187864.html Исходная ссылка: https://javaforall.cn

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