Введение и простое использование среды модульного тестирования gtest
Введение и простое использование среды модульного тестирования gtest

Введение в Gtest

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

Загрузите и установите

Похожие адреса:

http://googletest.googlecode.com/files/gtest-1.3.0.zip

GitHub - google/googletest: GoogleTest - Google Testing and Mocking Framework

Рекомендуется использовать инструмент vcpkg Загрузите и установите под Windows. Установка очень проста.

по умолчанию Загрузите и устанавливается 32-битная версия, если нужна 64-битная, укажите .\vcpkg.exe install gtest:x64-windows

Язык кода:javascript
копировать
.\vcpkg.exe install gtest

Связанные функции

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

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

Гтест,Заявленные макросы можно разделить на две категории:,один класс - серия ASSERT,Первая категория – серия EXPECT.

Серия утверждений ASSERT_ (фатальное утверждение):

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

EXPECT_ серия утверждений (нефатальное утверждение):

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

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

В утверждениях предусмотрены следующие методы проверки:

Проверка логического типа

двоичная проверка

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

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

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

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

2. Макротест

ТЕСТ-макрос

Один параметр ТЕСТ-макроса — это test_suite_name (имя набора тестов), а два параметра — test_name (имя специального случая теста).

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

Особые случаи тестов — это тесты (группы) в наборе тестов.

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

Разделение названий наборов тестов и названий тестовых случаев придает тестовому коду, который мы пишем, более четкую структуру.

Макрос TEST_F

Прежде чем использовать TEST_F, вам необходимо создать класс прошивки и наследовать класс esting::Test.

Используйте public или protected внутри класса для описания его членов, чтобы гарантировать, что фактически выполняемый тестовый подкласс может использовать его переменные-члены. Данные, которые нам нужно построить, могут быть реализованы в конструкторе или методе SetUp, унаследованном от класса ::testing::Test. Некоторые коды освобождения ресурсов могут быть реализованы в деструкторе или методе TearDown, унаследованном от класса ::testing::Test.

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

Макрос Реализация TEST_F близка к ТЕСТ-макрос, просто Макрос Пакет TEST_F более открыт и имеет больше расширений функций ТЕСТ-макрос.

Разница между TEST_F и TEST,TEST_F обеспечивает одну функцию инициализации (SetUp) и одну функцию очистки (TearDown). Переменные, используемые в TEST_F, можно инициализировать с помощью функции инициализации SetUp.,Уничтожен в TearDown. Все TEST_F независимы друг от друга.,Все они начинают работать в состоянии после инициализации. ОдинTEST_F не повлияет на данные, используемые другим одинTEST_F.,Используйте TEST_F, если для нескольких сценариев тестирования требуется одна и та же конфигурация данных.

Макрос TEST_P

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

Используйте макрос ТЕСТ,Вам необходимо написать следующие тестовые примеры,Каждый раз, когда вы вводите значение, вам нужно написать одну контрольную точку.,Это только в первом тесте,Если вы создаете отдельные тесты для каждой контрольной точки,Нагрузка еще больше. Используйте макрос TEST_P,Выполнить параметризацию на входе,Это намного проще.

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

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

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

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

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

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

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

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

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

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

2. Событие TestSuites

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

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

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

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

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

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

Язык кода:javascript
копировать
int main(int argc,char *argv[])
{
    testing::InitGoogleTest(&argc,argv);
    return RUN_ALL_TESTS();
}

Используется в проекте cmake

Язык кода:javascript
копировать
find_package(GTest CONFIG REQUIRED)
target_link_libraries(${PROJECT_NAME} PRIVATE GTest::gtest GTest::gtest_main GTest::gmock GTest::gmock_main)

Прилагается простой шаблон проекта cmake:

Язык кода:javascript
копировать
cmake_minimum_required(VERSION 3.12)

project(mygtest VERSION 0.0.1)

set(CMAKE_CXX_STANDARD 11)

####################  QT dependencies ####################
#set(CMAKE_CXX_STANDARD 11)
#set(CMAKE_AUTOMOC ON)
#set(CMAKE_AUTORCC ON)
#set(CMAKE_AUTOUIC ON)

#set(QT_VERSION 5)
#set(REQUIRED_LIBS Core)
#set(REQUIRED_LIBS_QUALIFIED Qt5::Core)

####################  set output directory ####################
set(BUILD_DIR ${CMAKE_CURRENT_SOURCE_DIR}/build)
set(LIB_DIR ${BUILD_DIR}/Release)
set(LIB_FIX)
if (CMAKE_BUILD_TYPE MATCHES "Debug")
    set(LIB_DIR ${BUILD_DIR}/Debug)
    set(LIB_FIX _d)
endif ()

get_filename_component(ABSOLUTE_PATH ${LIB_DIR} ABSOLUTE)
set(LIB_DIR ${ABSOLUTE_PATH})

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LIB_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${LIB_DIR}/lib)
set(CMAKE_PDB_OUTPUT_DIRECTORY ${LIB_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LIB_DIR}/lib)

set(LIB_DIR_FIX ${LIB_DIR}/bin)
option(USE_VS_BUILD "use visual studio build." OFF)
if (USE_VS_BUILD)
    set(LIB_DIR_FIX ${LIB_DIR}/bin/Debug)
endif ()

####################  set include path ####################
set(SRC_PATH
        ${CMAKE_CURRENT_SOURCE_DIR}/
        )

include_directories(
        ${SRC_PATH}
        ${BUILD_DIR}/../include
)

add_definitions(
        
)

####################  scan source files ####################
foreach (path ${SRC_PATH})
    aux_source_directory(${path} SRC_FILES)
endforeach ()


####################  version config ####################
#configure_file(${BUILD_DIR}/../include/version.h.in ${CMAKE_CURRENT_BINARY_DIR}/plugin_version.h)
#include_directories(${CMAKE_CURRENT_BINARY_DIR})

#if (MSVC)
#    set(MY_VERSIONINFO_RC "${CMAKE_CURRENT_BINARY_DIR}/VersionInfo.rc")
#    configure_file("${CMAKE_CURRENT_SOURCE_DIR}/resource.rc.in"
#            "${MY_VERSIONINFO_RC}")
#endif ()

#add_library(${PROJECT_NAME} SHARED ${SRC_FILES} ${MY_VERSIONINFO_RC})
add_executable(${PROJECT_NAME} ${SRC_FILES})
####################  set target properties ####################
set_target_properties(${PROJECT_NAME} PROPERTIES DEBUG_POSTFIX _d)

####################  set target dependencies ####################
find_package(GTest CONFIG REQUIRED)
#find_package(Qt${QT_VERSION} COMPONENTS ${REQUIRED_LIBS} REQUIRED)

set(THIRD_LIBS
        #${REQUIRED_LIBS_QUALIFIED}
        #${LOGGING_LIB}
        )
target_link_libraries(${PROJECT_NAME} PRIVATE ${THIRD_LIBS})
target_link_libraries(${PROJECT_NAME} PRIVATE GTest::gtest GTest::gtest_main GTest::gmock GTest::gmock_main)

В проекте clion также необходимо настроить:

Язык кода:javascript
копировать
-DCMAKE_PREFIX_PATH=D:\Qt5.12.11\Qt5.12.11\5.12.11\msvc2015_64\lib\cmake -DCMAKE_TOOLCHAIN_FILE=F:\vcpkg\scripts\buildsystems\vcpkg.cmake -Wno-dev

Если вы попробуете это из командной строки, рекомендуется использовать сценарий powershell. Вот пример:

Язык кода:javascript
копировать
$VcpkgPath = "F:/vcpkg/scripts/buildsystems/vcpkg.cmake"
#if (($result = Read-Host "Enter the full path of vcpkg.cmake[default: F:/vcpkg/scripts/buildsystems/vcpkg.cmake]") -eq '') {} else {$VcpkgPath=$result}
Write-Host "`n VcpkgPath: $VcpkgPath" -ForegroundColor Yellow

Push-Location 'C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools'    
cmd /c "vsvars32.bat&set" |
ForEach-Object {
  if ($_ -match "=") {
    $v = $_.split("="); set-item -force -path "ENV:\$($v[0])"  -value "$($v[1])"
  }
}
Pop-Location
write-host "`nVisual Studio 2015 Command Prompt variables set." -ForegroundColor Yellow

Write-Host "`n build for this module project." -ForegroundColor Green
cmake . -B build -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_TOOLCHAIN_FILE="$VcpkgPath" -Wno-dev -G "NMake Makefiles" 
Set-Location build
nmake 
#nmake install
Set-Location ..

Простой пример

Язык кода:javascript
копировать
#include<iostream>
using namespace std; 
#include<gtest/gtest.h>

class MyClass{
public:
    int add(int a,int b){
        return a+b;
    }
    int del(int a,int b){
        return a-b;
    }

};
//class MyClassTest: public testing::Test{}
class MyClassTest: public testing::TestWithParam<int>{
public:
    static void SetUpTestCase()
    {
        cout<<"SetUpTestCase"<<endl;
    }
    static void TearDownTestCase()
    {
        cout<<"TearDownTestCase"<<endl;
    }
    virtual void SetUp()   //TEST выполнит SetUp перед запуском
    {
        cout<<"SetUp"<<endl;
    }
    virtual void TearDown() //TearDown будет выполнен после завершения TEST
    {
        cout<<"TearDown"<<endl;
    }
    MyClass myClass;

};

INSTANTIATE_TEST_SUITE_P(PARAM,MyClassTest,testing::Values(3,5,7,9));

int Abs(int x)
{
     return x > 0 ? x : -x;
}

TEST(IsAbsTest,MyTest)
{
    ASSERT_TRUE(Abs(1) == 1) << "Abs(1)=1";  //ASSERT_TRUEОжидаемый результатtrue,operator<<выхододиннекоторая индивидуальная информация
    ASSERT_TRUE(Abs(-1) == 1) << "Abs(-1)=1";
    ASSERT_FALSE(Abs(-2) == -2);  //Ожидаем, что результат будет ложным
    ASSERT_EQ(Abs(1),Abs(-1));
    ASSERT_NE(Abs(-1),0);
    ASSERT_LT(Abs(-1),2);
    ASSERT_GT(Abs(-1),0);
    ASSERT_LE(Abs(-1),2);
    ASSERT_GE(Abs(-1),0);
}

//В это время используется Макрос TEST_P
TEST_P(MyClassTest,AddTest)
{
    auto out= myClass.add(1,2);
    //ASSERT_NE(out,3);
    int n = GetParam();
    ASSERT_EQ(out,3);
    ASSERT_EQ(out,n);
}
//В это время используется Макрос TEST_F
TEST_F(MyClassTest,Add)
{
    auto out= myClass.add(1,2);
    ASSERT_EQ(out,3);
}
TEST_F(MyClassTest,del)
{
    ASSERT_EQ(myClass.del(4,3),1);
}

int main(int argc,char *argv[])
{
    testing::InitGoogleTest(&argc,argv);
    return RUN_ALL_TESTS();
}

Результаты запуска:

Цитировать

Научим вас шаг за шагом писать модульные тесты с помощью gtest (1/2) — Zhihu

GTest summary_Блог HUSTER593-CSDN blog_gtest

Введение и использование блога gtest_linhai1028-CSDN blog_gtest

Играемся с фреймворком модульного тестирования C++ от Google. Серия Google Test (gtest) №4 - Параметризация - Кодер Ж - Блог Парк

https://www.csdn.net/tags/NtjaAg2sNTM4MjMtYmxvZwO0O0OO0O0O.html

Фреймворк модульного тестирования Google C++ GoogleTest (всего) - Chaochao boy - Blog Park

Пишите красивые тест-кейсы GTest - CoderZh - Blog Park

boy illustration
На основе языка Go мы шаг за шагом научим вас внедрять структуру системы управления серверной частью.
boy illustration
Эффективное управление журналами с помощью Spring Boot и Log4j2: подробное объяснение конфигурации
boy illustration
Что делать, если telnet не является внутренней или внешней командой [легко понять]
boy illustration
php-объект для анализа json_php json
boy illustration
Введение в принцип запуска Springboot, процесс запуска и механизм запуска.
boy illustration
Высокоуровневые операции Mongo, если данные не существуют, вставка и обновление, если они существуют (pymongo)
boy illustration
Проектирование и внедрение системы управления электронной коммерцией на базе Vue и SpringBoot.
boy illustration
Статья длиной в 9000 слов знакомит вас с процессом запуска SpringBoot — самым подробным процессом запуска SpringBoot в истории — с изображениями и текстом.
boy illustration
Как настроить размер экрана в PR. Учебное пособие по настройке размера видео в PR [подробное объяснение]
boy illustration
Элегантный и мощный: упростите операции ElasticSearch с помощью easy-es
boy illustration
Проект аутентификации по микросервисному токену: концепция и практика
boy illustration
【Java】Решено: org.springframework.http.converter.HttpMessageNotWritableException.
boy illustration
Изучите Kimi Smart Assistant: как использовать сверхдлинный текст, чтобы открыть новую сферу эффективной обработки информации
boy illustration
Начало работы с Docker: использование томов данных и монтирования файлов для хранения и совместного использования данных
boy illustration
Использование Python для реализации автоматической публикации статей в публичном аккаунте WeChat
boy illustration
Разберитесь в механизме и принципах взаимодействия потребителя и брокера Kafka в одной статье.
boy illustration
Spring Boot — использование Resilience4j-Circuitbreaker для реализации режима автоматического выключателя_предотвращения каскадных сбоев
boy illustration
13. Springboot интегрирует Protobuf
boy illustration
Примечание. Инструмент управления батареями Dell Dell Power Manager
boy illustration
Общая интерпретация класса LocalDate [java]
boy illustration
[Базовые знания ASP.NET Core] -- Веб-API -- Создание и настройка веб-API (1)
boy illustration
Настоящий бой! Подключите Passkey к своему веб-сайту для безопасного входа в систему без пароля.
boy illustration
Руководство по настройке Nginx: как найти, интерпретировать и оптимизировать настройки Nginx в Linux
boy illustration
Typecho отображает использование памяти сервера
boy illustration
Как вставить элемент перед указанным ключом в ассоциативный массив в PHP
boy illustration
swagger2 экспортирует API как текстовый документ (реализация Java) [легко понять]
boy illustration
Выбор фреймворка nodejs Express koa egg MidwayJS сравнение NestJS
boy illustration
Руководство по загрузке, установке и использованию SVN «Рекомендуемая коллекция»
boy illustration
Интерфейс PHPforwarding_php отправляет запрос на получение
boy illustration
Создавайте и защищайте связь в реальном времени с помощью SignalR и Azure Active Directory.