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
.\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. Запись тестового примера
int main(int argc,char *argv[])
{
testing::InitGoogleTest(&argc,argv);
return RUN_ALL_TESTS();
}
find_package(GTest CONFIG REQUIRED)
target_link_libraries(${PROJECT_NAME} PRIVATE GTest::gtest GTest::gtest_main GTest::gmock GTest::gmock_main)
Прилагается простой шаблон проекта cmake:
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 также необходимо настроить:
-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. Вот пример:
$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 ..
#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
https://www.csdn.net/tags/NtjaAg2sNTM4MjMtYmxvZwO0O0OO0O0O.html
Фреймворк модульного тестирования Google C++ GoogleTest (всего) - Chaochao boy - Blog Park