Всем привет, мы снова встретились, я ваш друг Цюаньчжаньцзюнь.
Платформа модульного тестирования Google C++ (сокращенно Gtest) может использоваться на нескольких платформах (включая Linux, Mac OS X, Windows, Cygwin и Symbian). Она обеспечивает широкие возможности утверждения, оценку фатальных и нефатальных ошибок и может выполнять тестирование значений параметров. , введите параметризованное тестирование, «тестирование на смерть».
Как правило, чтобы проверить, нормально ли выполняется метод (функция), вы можете предоставить некоторые входные данные. После вызова этого метода (функции) получить выходные данные, а затем проверить, соответствуют ли выходные данные нашим ожидаемым результатам. непротиворечивы, то это означает, что логика этого метода верна, в противном случае существует проблема. При проверке результатов вывода,Gtest предоставляет мне серию утверждений для тестирования кода.,Эти макросы чем-то похожи на вызовы функций. Если утверждение не выполнено, Gtest распечатает исходный файл на момент утверждения и местоположение строки ошибки.,и дополнительная информация о сбоях。Пользователи могут получить доступ к дополнительной информации об этих результатах напрямую через“<<”В этих утверждениях Макроспозже。
В Gtest макросы утверждений можно разделить на две категории: серия ASSERT и серия EXPECT.
ASSERT_* ряд утверждений (Fatal утверждение), при сбое контрольной точки выйти из текущей функции (примечание: не выходить из текущего случая).
EXPECT_* ряд утверждений (Нефатальный утверждение), в случае сбоя контрольной точки продолжить выполнение следующей контрольной точки (каждое утверждение представляет собой контрольную точку).
Обычно EXPECT_ следует использовать первым, поскольку ASSERT_* не будет очищаться после сообщения об ошибке, что может привести к утечкам памяти.
Fatal assertion | Nonfatal assertion | Verifies |
---|---|---|
ASSERT_TRUE(condition); | EXPECT_TRUE(condition); | condition is true |
ASSERT_FALSE(condition); | EXPECT_FALSE(condition); | condition is false |
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++ можно сравнивать с помощью двоичных сравнений. Но для пользовательских типов,Нам нужно определить поведение некоторых операторов,например=、<ждать。
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*.
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 |
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 также отдельно сравнивает числа с плавающей запятой.
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 |
ТЕСТ-макрос — очень важный Макрос,это представляет собой тестособый случай,Его прототип:
Первый параметр макроса TEST — test_suite_name (имя набора тестов), а второй параметр — test_name (имя специального случая теста). Разница и связь между именем набора тестов и именем тестового набора (также называемым именем теста):
Набор тестов (тестовый набор) — это набор тестовых входных данных, условий выполнения и ожидаемых результатов, составленный для конкретной цели, чтобы протестировать определенный путь программы или проверить, выполняется ли определенное требование. Тестовый пример — это (групповой) тест. .
Если взять приведенный выше код в качестве примера, три макроса TEST составляют набор тестов. Имя набора тестов — FactorialTest (обнаружение факториального метода, функция test Factorial). Этот вариант использования охватывает три особых случая тестирования — отрицательный, нулевой и положительный. чтобы обнаружить три особых случая, когда входным параметром является отрицательное число, ноль и положительное число.
В именах наборов тестов и тестовых наборах нельзя использовать символы подчеркивания (_). Потому что исходный код GTest должен использовать символы подчеркивания, чтобы объединить их в независимое имя класса.
Это также требует, чтобы у нас не было одинаковой комбинации «имени набора тестов и имени специального случая» — иначе имена классов будут перекрываться.
Разделение имени набора тестов и имени тестового набора придает написанному нами тестовому коду более четкую структуру — как зависимую, так и независимую. Зависимость связана через одно и то же имя набора тестов, тогда как независимость отражается через разные имена тестовых наборов.
Протестируйте класс 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. Если для нескольких сценариев тестирования требуется одна и та же конфигурация данных. ТЕСТ_Ф.
При разработке тестовых случаев часто приходится учитывать передачу разных значений в тестируемую функцию. Наш предыдущий подход обычно заключался в том, чтобы написать общий метод, а затем написать тестовый пример для его вызова. Даже если используется общий подход, в такой работе имеется много дублирования.
Проверьте функцию 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 есть два параметра: первый — это имя набора тестов (в соответствии с именем созданного тестового класса), а второй — имя специального случая теста.
gtest предоставляет различные механизмы предварительной обработки событий, что очень удобно для выполнения некоторых операций до или после тестирования.
1. Глобальный, до и после выполнения всех тестов.
2. Уровень TestSuite: перед первым тестом в наборе тестов и после выполнения последнего теста.
3. Уровень TestCase до и после каждого теста.
Для реализации глобальных событий необходимо написать класс, который наследует класс Testing::Environment и реализует внутри него методы SetUp и TearDown.
1. Метод SetUp() выполняется до выполнения всех случаев.
2. Метод TearDown() выполняется после выполнения всех кейсов.
Вам также необходимо подключить событие, вызвав функциюtest::AddGlobalTestEnvironment в основной функции. Другими словами, мы можем написать множество таких классов, а затем подключить их события. Функция AddGlobalTestEnvironment должна быть помещена перед RUN_ALL_TEST.
Нужно написать класс,Наследование тестирования::Test,Затем реализуйте двастатическийметод
1. Метод SetUpTestCase() выполняется перед первым TestCase.
2. Метод TearDownTestCase() выполняется после последнего TestCase.
Событие TestCase зависает до и после выполнения каждого кейса. Способ реализации практически такой же, как и у Test’Suites, но нужно реализовать метод SetUp и метод TearDown:
1. Метод SetUp() выполняется перед каждым TestCase.
2. Метод TearDown() выполняется после каждого TestCase.
Макрос RUN_ALL_TESTS(), судя по названию, предназначен для запуска всех тестовых случаев. Это настоящая точка входа для нас для запуска тестовых случаев. Его прототип:
RUN_ALL_TESTS() — это макрос, реализованный как функция. Здесь вызывается функция Run синглтона UnitTest. Глядя на вызывающий процесс, вы можете видеть, что вызывающий процесс.
1.UnitTest::Run()
2. UnitTestImpl::RunAllTests()
3. TestCase::Run()
4. TestInfo::Run()
5. Test::Run()
Заявление об авторских правах: Содержание этой статьи добровольно предоставлено пользователями Интернета, а мнения, выраженные в этой статье, представляют собой только точку зрения автора. Данный сайт лишь предоставляет услуги по хранению информации, не имеет никаких прав собственности и не несет соответствующей юридической ответственности. Если вы обнаружите на этом сайте какое-либо подозрительное нарушение авторских прав/незаконный контент, отправьте электронное письмо, чтобы сообщить. После проверки этот сайт будет немедленно удален.
Издатель: Лидер стека программистов полного стека, укажите источник для перепечатки: https://javaforall.cn/187864.html Исходная ссылка: https://javaforall.cn