Gtest单元测试
gtest框架原理
Google Test(通常称为GTest)是一个用于C++的开源测试框架,用于编写单元测试和功能测试。
它旨在帮助开发者编写高质量、可维护的测试代码。
下面是GTest 框架的一些基本原理和核心概念:1. 测试用例(Test Case):测试用例是单元测试的基本单位,它是一组相关的测试函数的集合,用于测试被测代码的不同方面。
2. 测试夹具(Test Fixture):测试夹具是为测试用例提供设置和清理操作的机制。
夹具可以包含在测试用例的前置条件和后置条件中,确保每个测试都在一致的环境中运行。
3. 测试函数(Test Function):测试函数是执行实际测试的函数,它们使用GTest 提供的断言来验证预期行为是否与实际行为一致。
4. 断言(Assertion):断言是测试函数中的语句,用于检查预期结果是否与实际结果匹配。
如果断言失败,测试将失败。
5. 测试结果报告:GTest 框架会收集测试运行时的结果,包括测试通过、失败、跳过等情况,并生成相应的测试结果报告,帮助开发者识别问题。
6. 参数化测试(Parameterized Test):GTest 支持参数化测试,允许开发者使用不同的输入数据运行相同的测试用例,减少代码重复。
7. 死亡测试(Death Test):死亡测试用于测试代码在错误情况下是否能够正确地终止,避免内存泄漏等问题。
8. 测试过滤:GTest 允许开发者通过命令行参数来选择特定的测试用例或测试函数运行,方便针对特定部分进行测试。
9. 参数生成器:GTest 提供了一些参数生成器,可以生成随机的测试输入数据,帮助覆盖更多的测试场景。
总的来说,GTest 框架基于C++,通过测试用例、测试夹具、测试函数、断言等机制,帮助开发者编写和执行单元测试,以验证代码的正确性。
它提供了丰富的功能,能够适应多种测试需求,提高代码的质量和可维护性。
gtest使用手册
gtest 使用手册gtest 是一个流行的 C++单元测试框架,它提供了丰富的功能和简洁的 API,使得编写和运行单元测试变得更加容易和高效。
本文将介绍 gtest 的基本概念和使用方法,帮助读者快速上手并熟练使用 gtest 进行单元测试。
下面是本店铺为大家精心编写的3篇《gtest 使用手册》,供大家借鉴与参考,希望对大家有所帮助。
《gtest 使用手册》篇1一、什么是 gtest?gtest 是一个由 Google 开发的 C++单元测试框架,旨在为开发者提供一种简单、高效的方式来编写和运行单元测试。
gtest 提供了丰富的功能和简洁的 API,可以与各种编译器和 IDE 集成,并支持多种测试类型和断言风格。
二、gtest 的基本概念1. 测试套件(Test Suite):测试套件是 gtest 的基本单位,它包含一个或多个测试用例(Test Case)。
每个测试套件都有一个入口函数,该函数负责初始化和清理测试环境。
2. 测试用例(Test Case):测试用例是测试套件中的基本测试单元,它包含一个或多个测试步骤,每个测试步骤都包含一个预期结果和一个实际结果。
3. 断言(Assertion):断言是 gtest 中用于验证测试结果的一种机制,它用于比较预期结果和实际结果是否相等。
gtest 提供了多种断言类型,包括 EXPECT_EQ、EXPECT_NE、EXPECT_TRUE、EXPECT_FALSE 等。
4. 测试助手(Test Helper):测试助手是一种特殊的测试用例,它用于为其他测试用例提供共性的测试步骤和断言。
三、gtest 的使用方法1. 安装 gtest:在使用 gtest 之前,需要先安装 gtest。
可以使用 CMake 或 Maven 等构建工具来安装 gtest。
2. 编写测试用例:编写测试用例时,需要继承testing::TestWithParam 类,并实现 TestBody 函数。
gtest单元测试原理
gtest(Google Test)是一个用于C++的开源单元测试框架,它由Google开发并维护。
gtest的原理是基于xUnit测试框架的原理,即将被测试的代码分解为多个独立的单元,对每个单元进行测试并验证其行为是否符合预期。
gtest的测试原理主要包括以下几个方面:
1. 测试用例(Test Case):gtest将测试代码组织成一个个测试用例,每个测试用例包含一个或多个测试点(Test Point)。
测试用例是对被测试代码的一个逻辑单元进行测试的最小单位。
2. 测试点(Test Point):测试点是对被测试代码的一个具体功能进行测试的最小单位。
每个测试点都是一个独立的函数,用于验证被测试代码的某个方面是否符合预期。
3. 断言(Assertion):在每个测试点中,使用断言来验证被测试代码的行为是否符合预期。
断言是一个条件表达式,如果条件为真,则测试通过;如果条件为假,则测试失败。
4. 测试夹具(Test Fixture):测试夹具是一组用于测试的对象或数据,它提供了测试环境和测试数据,用于支持测试点的执行。
测试夹具可以在每个测试点之前进行设置,以确保每个测试点都在相同的环境下执行。
5. 测试运行器(Test Runner):测试运行器是gtest的核心组件,它负责加载和执行测试用例。
测试运行器可以自动发现测试用例,并按照一定的顺序执行测试点。
在测试运行器中,可以配置测试参数、输出测试结果等。
通过使用gtest,开发人员可以方便地编写和执行单元测试,以验证被测试代码的正确性和稳定性。
gtest提供了丰富的断言和测试夹具,可以满足各种测试需求,并且具有良好的可扩展性和灵活性。
gtest用例
gtest用例
gtest是一个用于C++的单元测试框架,它提供了许多有用的工具和宏,用于编写和执行测试用例。
在gtest中,一个测试用例通常包含以下几个部分:
1. 测试环境设置(SetUp):在每个测试用例执行前,设置一个特定的测试环境或状态。
这部分通常包含一些必要的全局初始化和配置,以确保测试能够正常运行。
2. 测试函数:这是实际进行测试的地方。
在此部分中,您会编写一些代码来检查您的代码是否按照预期工作。
这可能包括检查函数调用的结果是否符合预期,或者验证某些条件是否满足。
3. 测试环境清理(TearDown):在每个测试用例执行后,清理测试环境或状态。
这通常包括释放资源、关闭文件、撤销设置等操作,以确保不会对后续的测试造成影响。
gtest执行测试用例的顺序是:为每一个测试用例生成一个测试实例并执行。
每个测试实例先执行SetUp函数,然后执行测试函数,最后执行TearDown函数。
这个顺序是按照测试用例的定义顺序来执行的。
gtest还提供了一些高级特性,比如TEST_F宏可以定义一个测试夹具,用
来共享测试用例之间的数据。
如果多个测试用例都使用同一个测试夹具,那么测试用例的执行顺序就变成了测试夹具的SetUp函数、测试用例的SetUp函数、测试函数、测试用例的TearDown函数、测试夹具的TearDown函数。
Google单元测试框架gtest之官方sample笔记2--类型参数测试
Google单元测试框架gtest之官⽅sample笔记2--类型参数测试gtest 提供了类型参数化测试⽅案,可以测试不同类型的数据接⼝,⽐如模板测试。
可以定义参数类型列表,按照列表定义的类型,每个测试case都执⾏⼀遍。
本例中,定义了2种计算素数的类,⼀个是实时计算,⼀个是提前计算好存放到⼀个⼤数组了。
既空间和时间实现⽅式的对⽐。
两种实现类都继承于抽象类PrimeTable。
// The prime table interface.class PrimeTable {public:virtual ~PrimeTable() {}// Returns true if and only if n is a prime number.virtual bool IsPrime(int n) const = 0;// Returns the smallest prime number greater than p; or returns -1// if the next prime is beyond the capacity of the table.virtual int GetNextPrime(int p) const = 0;};为了测试,定义了⼀个测试类,使⽤了两种特例化的CreatePrimeTable模板函数。
template <class T>PrimeTable* CreatePrimeTable();template <>PrimeTable* CreatePrimeTable<OnTheFlyPrimeTable>() {return new OnTheFlyPrimeTable;}template <>PrimeTable* CreatePrimeTable<PreCalculatedPrimeTable>() {return new PreCalculatedPrimeTable(10000);}// Then we define a test fixture class template.template <class T>class PrimeTableTest : public testing::Test {protected:// The ctor calls the factory function to create a prime table// implemented by T.PrimeTableTest() : table_(CreatePrimeTable<T>()) {}~PrimeTableTest() override { delete table_; }// Note that we test an implementation via the base interface// instead of the actual implementation class. This is important// for keeping the tests close to the real world scenario, where the// implementation is invoked via the base interface. It avoids// got-yas where the implementation class has a method that shadows// a method with the same name (but slightly different argument// types) in the base interface, for example.PrimeTable* const table_;};具体测试,有3个测试⽤例.TYPED_TEST(PrimeTableTest, ReturnsFalseForNonPrimes)TYPED_TEST(PrimeTableTest, ReturnsTrueForPrimes)TYPED_TEST(PrimeTableTest, CanGetNextPrime)sample 6也演⽰了两种模式,第⼀种模式是已知所有的类型,先定义为⼀个Types结构。
gtest单元测试的简单示例
Gtest是Google公司用于c++单元测试的开发工具,它是基于xUnit架构的测试框架,支持自动发现测试,丰富的断言集,用户定义的断言,致命与非致命的失败,类型参数化测试,各类运行测试的选项和XML的测试报告。
使用的时候使用NTEST,TEST_F等宏定义,编写测试用例。
测试用例中可以直接使用测试的类。
而且gtest有很好的扩展性,可以用来扩展自己的单元测试框架。
1.一个简单的c函数的测试用例:#include "gtest/gtest.h"int Foo(int a, int b){return a + b;}//编写测试用例//成功用例NTEST(FooTest_PassDemo){EXPECT_EQ(3, Foo(1, 2));EXPECT_EQ(2, Foo(1, 1));}//失败用例NTEST(FooTest_FailDemo){EXPECT_EQ(4, Foo(1, 2));EXPECT_EQ(2, Foo(1, 2));}//程序框架int main(int argc, _TCHAR* argv[]){testing::InitGoogleTest(&argc, argv);return RUN_ALL_TESTS();}2.一个c++类的测试:class CHashTableTest : public ::testing::Test {protected:CHashTableTest():ht(100){}virtual void SetUp() {key1 = "testkey1";key2 = "testkey2";}// virtual void TearDown() {}CHashTable ht;string key1;string key2;};//编写测试用例TEST_F(CHashTableTest, hashfunc){CHashElement he;//测试框架中提供的宏定义ASSERT_NE(\ht.getHashKey((char*)key1.c_str(), key1.size(), 0),\ht.getHashKey((char*)key2.c_str(), key2.size(), 0));ASSERT_NE(\ht.getHashKey((char*)key1.c_str(), key1.size(), 0),\ht.getHashKey((char*)key1.c_str(), key1.size(), 1));ASSERT_EQ(\ht.getHashKey((char*)key1.c_str(), key1.size(), 0),\ht.getHashKey((char*)key1.c_str(), key1.size(), 0)); }//执行单元测试#include "gtest/gtest.h"int main(int argc, char** argv) {testing::InitGoogleTest(&argc, argv);// 默认执行所有的测试用例.return RUN_ALL_TESTS();}。
gtest单元测试方法
gtest单元测试方法gtest单元测试方法1. 什么是gtest单元测试方法gtest单元测试方法是指使用Google Test(简称gtest)框架进行软件单元测试的一种方法。
gtest是一个开源的C++单元测试框架,它提供了丰富的断言和测试工具,可以帮助开发者编写可靠的、易于维护的单元测试。
2. 使用gtest编写单元测试方法的步骤下面是使用gtest编写单元测试方法的步骤:1.安装gtest框架:首先需要将gtest框架下载到本地,并进行安装和配置。
2.编写测试用例:根据需要,编写需要测试的代码和相应的测试用例,在测试用例中调用待测试代码,并使用gtest的断言进行验证。
3.构建和运行测试:通过编译器构建测试代码,并执行生成的可执行文件,查看测试结果。
4.分析结果:根据测试结果,进行相应的修改和优化。
3. 测试用例的编写测试用例是指对待测试代码的某个功能进行测试的一组测试方法。
在gtest中,测试用例是由宏定义的方式进行定义的,下面是一个测试用例的示例:TEST(TestCaseName, TestName) {// 在这里编写测试代码// 调用待测试代码并使用断言进行验证EXPECT_EQ(4, add(2, 2));}•TEST是一个宏定义,用于定义一个测试用例。
TestCaseName 是测试用例的名称,TestName是具体的测试方法的名称。
•在测试用例中,可以编写测试代码,并调用待测试的代码。
使用EXPECT_*系列的断言检查测试结果,如EXPECT_EQ用于判断两个值是否相等。
4. 编译和运行测试使用gtest编写的测试代码,需要通过编译器进行构建,并执行生成的可执行文件进行测试。
下面是使用命令行进行编译和运行的示例:1.编译测试代码:使用编译器将测试代码编译为可执行文件。
$ g++ -o test -lgtest -lgtest_main2.运行测试:执行生成的可执行文件进行测试。
GoogleC++单元测试框架(Gtest)系列教程之一——入门
Google C++单元测试框架
Google C++单元测试框架(简称Gtest),可在多个平台上使用(包括Linux, Mac OS X, Windows, Cygwin和Symbian),它提供了丰富的 断言、致命和非致命失败判断,能进行值参数化测试、类型参数化测试、“死亡测试”。Gtest是一个开源的项目,其源码可以从这里下载,目 前的代码发行版是1.6.0。
970 child_pid = clone(&ExecDeathTestChildMain, stack_top, SIGCHLD, &args);
改成:
970 child_pid = fork();
使用make编译过后并不需要执行make install命令安装Gtest相关的,对自己的测试代码进行编译时,从当前目录引用头文件和库文件即可。 执行用例 源码文件的samples目录下为我们提供了多个用例,从sample1到sample9,Gtest作者由浅入深为我们讲解了Gtest的用法,怎么执行这些用 例呢? 首先进入源码目录下的make目录,其中包含了一个Makefile文件,执行make命令,make命令执行过后可以看到该目录下增加了几个文件, 其中sample1_unittest就是sample1的可执行文件了。执行./sample1_unittest即可看到测试的运行结果:
为编译生成其他用例的可执行文件,我们可以参照make目录下的Makefile文件,或者执行以下步骤: 将gtest-main.a动态库文件拷贝到samples目录下,执行以下命令:
$ g++ -I ../include/ -c sample2_
GTEST单元测试框架的使用
GTEST单元测试框架的使⽤单元测试在产品开发中,是对我们代码运⾏结果核对的有⼒保障,可以有效减少产品开发测试出现的bug,也能随时记录接⼝调⽤⽰例,并随时对我们的测试⽬标进⾏检查。
GTEST测试框架是Goole发布的⽀持Windows/Linux/MacOS的单元测试框架。
1.TEST宏TEST(test_case_name, test_name) -> 创建⼀个简单的测试案例TEST_F(test_fixture, test_name) -> 使⽤测试夹具进⾏资源类固定化,可将资源⽤于多个测试案例中PS : test_fixture是⼀个test fixture class,是继承testing::Test的⼀个类,按照官⽅⽰例如下class FooTest : public testing::Test {protected:virtual void SetUp() { b_.AddElement(3); }Foo a_;Foo b_;};TEST_F(FooTest, InitializesCorrectly) {EXPECT_TRUE(a_.StatusIsOK());}TEST_F(FooTest, ReturnsElementCountCorrectly) {EXPECT_EQ(a_.size(), 0);EXPECT_EQ(b_.size(), 1);}下⾯简单写下测试案例1// 资源固定化2class ReadDicom :public::testing::Test3 {4protected:5virtual void SetUp()6 {7 ct_infilepath = gettestfile("ct.dcm");8 ct_outfilepath = gettestfile("ct1.dcm");910 st_infilepath = gettestfile("st.dcm");11 st_outfilepath = gettestfile("st1.dcm");1213 dose_infilepath = gettestfile("dose.dcm");14 dose_outfilepath = gettestfile("dose1.dcm");1516 dose_infilepath = gettestfile("RD_A 2_6678_20190806175756.dcm");17 dose_outfilepath = gettestfile("RD_A 2_6678_201908061757561.dcm");1819 plan_infilepath = gettestfile("plan.dcm");20 plan_outfilepath = gettestfile("plan1.dcm");21 }22 DICOMMode dicom;23string ct_infilepath;24string ct_outfilepath;25string st_infilepath;26string st_outfilepath;27string dose_infilepath;28string dose_outfilepath;29string plan_infilepath;30string plan_outfilepath;31private:32string gettestfile(string filename)33 {34char buffer[_MAX_PATH];35 _getcwd(buffer, _MAX_PATH);36string filepath = string(buffer) + "\\testfile\\" + filename;37return filepath;38 }39 };4041// CT⽂件读写42 TEST_F(ReadDicom, CT)43 {44 DICOMMode dicom1;45 ASSERT_TRUE(dicom.ReadDicomInfo(ct_infilepath)) << dicom.get_lasterror();46 ASSERT_TRUE(dicom1.putDicomType(DicomType::CTImage_Type)) << dicom1.get_lasterror();47 CT_Dicom t = dicom.getCTDicom();48 ASSERT_TRUE(dicom1.putCTDicom(t)) << dicom1.get_lasterror();49 ASSERT_TRUE(dicom1.WriteDicomInfo(ct_outfilepath)) << dicom1.get_lasterror();50 }5152// Struct⽂件读写53 TEST_F(ReadDicom, STRUCT)54 {55 DICOMMode dicom1;56 ASSERT_TRUE(dicom.ReadDicomInfo(st_infilepath)) << dicom.get_lasterror();57 ASSERT_TRUE(dicom1.putDicomType(DicomType::RTStruct_Type)) << dicom1.get_lasterror();58 RTStruct_Dicom t = dicom.getRTStructDicom();59 ASSERT_TRUE(dicom1.putRTStructDicom(t)) << dicom1.get_lasterror();60 ASSERT_TRUE(dicom1.WriteDicomInfo(st_outfilepath)) << dicom1.get_lasterror();61 }1//整套数据读写2 TEST(WHOLEFILE, wholefile)3 {4string dirpath = "D:\\myfile\\dicom_code\\dicom_file\\Dicom\\DICOMModeUnitTest\\testfile\\Plan";5string outdirpath = "D:\\myfile\\dicom_code\\dicom_file\\Dicom\\DICOMModeUnitTest\\testfile\\Plan1";67string tmpstr = dirpath + "\\*.*";8 HANDLE hFind;9 WIN32_FIND_DATA findData;10 hFind = FindFirstFile(tmpstr.data(), &findData);11if (hFind != INVALID_HANDLE_VALUE)12 {13do14 {15if (strcmp(findData.cFileName, ".") == 016 || strcmp(findData.cFileName, "..") == 017 || strcmp(findData.cFileName, "Plan") == 0)18continue;19string filepath = dirpath + "\\" + findData.cFileName;20string outfilepath = outdirpath + "\\" + findData.cFileName;21 DICOMMode dicom;22 dicom.ReadDicomInfo(filepath);23 dicom.WriteDicomInfo(outfilepath);2425 } while (FindNextFile(hFind, &findData));26 }27 }2.ASSERT_、EXPECT_系列的检查结果是否正确ASSERT_系列:bool值检查1、 ASSERT_TRUE(参数),期待结果是true2、ASSERT_FALSE(参数),期待结果是false数值型数据检查3、ASSERT_EQ(参数1,参数2),传⼊的是需要⽐较的两个数 equal4、ASSERT_NE(参数1,参数2),not equal,不等于才返回true5、ASSERT_LT(参数1,参数2),less than,⼩于才返回true6、ASSERT_GT(参数1,参数2),greater than,⼤于才返回true7、ASSERT_LE(参数1,参数2),less equal,⼩于等于才返回true8、ASSERT_GE(参数1,参数2),greater equal,⼤于等于才返回true字符串检查9、ASSERT_STREQ(expected_str, actual_str),两个C风格的字符串相等才正确返回10、ASSERT_STRNE(str1, str2),两个C风格的字符串不相等时才正确返回11、ASSERT_STRCASEEQ(expected_str, actual_str)12、ASSERT_STRCASENE(str1, str2)EXPECT_系列和ASSERT_系列⽤法差不多在上⾯某些案例中可以看到<<,这个操作符是可以帮助在出现错误的时候输出某些错误信息到测试界⾯上,⽅便我们定位!单元测试YYDS!后⾯想到其他的再继续进⾏补充~。
gtest 参数
gtest 参数1. 什么是 gtest?gtest(Google Test)是一个由 Google 开发的 C++ 测试框架,用于编写和运行单元测试。
它提供了丰富的断言函数和丰富的命令行参数,使得测试代码编写更加简单、灵活和可靠。
2. gtest 的安装与配置2.1 安装 gtest在使用 gtest 进行测试之前,需要先将其安装到开发环境中。
•在 Ubuntu 系统上,可以通过以下命令安装 gtest:sudo apt-get install libgtest-dev•在 Windows 系统上,可以从 [gtest 官方网站]( 下载最新版本的源代码,并将其编译成库文件。
2.2 配置项目完成安装后,需要将 gtest 配置到项目中,以便能够使用其中的功能。
•在 CMakeLists.txt 文件中添加以下内容:find_package(GTest REQUIRED)include_directories(${GTEST_INCLUDE_DIRS})add_executable(tests test.cpp)target_link_libraries(tests ${GTEST_LIBRARIES} pthread)此处假设测试代码文件为 test.cpp。
3. 使用 gtest 进行单元测试3.1 编写测试代码在开始编写测试代码之前,需要确定要进行测试的函数或类,并创建对应的测试文件。
下面是一个示例的测试函数:#include <gtest/gtest.h>// 要测试的函数int add(int a, int b) {return a + b;}// 测试用例TEST(AddTest, PositiveNumbers) {EXPECT_EQ(add(2, 3), 5);}TEST(AddTest, NegativeNumbers) {EXPECT_EQ(add(-2, -3), -5);}3.2 运行测试编写完测试代码后,可以使用 gtest 提供的命令行参数来运行测试。
gtest语法
Google Test(gtest)是一个用于C++的单元测试框架,它提供了丰富的断言宏和功能来帮助开发者编写测试用例。
以下是gtest的一些基础语法:1. TEST() 宏:用于定义一个测试用例。
它接受两个参数,第一个是测试用例的名称,第二个是测试用例所在的测试套件的名称。
2. ASSERT_ 系列宏:用于在测试用例中进行断言。
例如,`ASSERT_TRUE(condition)` 会在条件`condition` 为假时标记测试失败。
3. EXPECT_ 系列宏:与ASSERT_ 类似,但即使条件不满足,测试用例也不会立即失败,而是会继续执行后续的代码。
4. TEST_F() 宏:用于定义一个带有死亡测试(death test)的测试用例。
死亡测试是一种特殊类型的测试,它会检查程序是否因为特定的错误而异常终止。
5. SCOPE_ 系列宏:用于控制测试用例的作用域,例如`SCOPED_TRACE` 可以在测试用例失败时提供更多的上下文信息。
6. main() 函数:所有的测试用例都需要通过main() 函数来运行,通常这个函数不需要手动编写,因为gtest 会自动提供。
7. --gtest_output=xml:这是一个命令行选项,用于将测试结果输出为XML 格式,便于集成到持续集成系统中。
8. --gtest_color=yes:这是另一个命令行选项,用于在控制台输出彩色的测试结果,使得测试报告更加直观。
9. DEATH_TEST:用于声明死亡测试,这是一种特殊的测试,它会检查被测代码是否会因某些特定的原因而崩溃或异常终止。
10. TYPED_TEST:用于声明参数化测试,允许使用不同的参数值多次运行相同的测试用例。
11. ASSERT_PRED1, ASSERT_PRED2, ...:这些宏用于在断言中使用自定义的谓词函数,可以对复杂的条件进行更灵活的检查。
单元测试框架GTest
• 单元测试代码: • Factorial_
• 被测试的源代码 • 单元测试源代码 • Gtest框架代码/库
单元测试是什么(讨论)
• • • •
什么是单元,什么叫可测单元? 什么是模块,模块由什么组成? 什么是测试实例,测试实例由什么组成? 什么是测试用例,测试用例由什么组成?
class FooTest: public testing::Test { public: virtual void SetUp() {}; virtual void TearDown() {}; static void SetUpTestCase() {}; static void TearDownTestCase() {}; private: static type variables; } TEST_F(FooTest, Zero);
class FooTest: public testing::Test { public: virtual void SetUp() {}; virtual void TearDown() {}; static void SetUpTestCase() {}; static void TearDownTestCase() {}; private: static type variables; } TEST_F(FooTest, Zero); class GlobalEvent: public testing::Environment { public: virtual void SetUp() {} virtual void TearDown() {} }; ::testing::AddGlobalTestEnvironment();
布尔断言 布尔断言 布尔断言 AAA-JJJ 测试 布尔断言 AAA-JJJ 测试
gtest用法
gtest用法Google Test(简称gTest)是谷歌开发的一款C++单元测试框架。
使用gTest可以方便地进行单元测试,它提供了各种各样的断言(比如EXPECT_EQ, ASSERT_EQ,EXPECT_TRUE等),方便开发人员编写测试代码并检测代码的正确性。
下面是使用gtest进行一个简单测试的示例代码:```#include <gtest/gtest.h>#include <string>using namespace std;TEST(testString, stringLen) {// 测试字符串长度string str = "hello world";EXPECT_EQ(str.length(), 11);}int main(int argc, char** argv) {// 初始化gtesttesting::InitGoogleTest(&argc, argv);// 运行所有测试return RUN_ALL_TESTS();}```在上面的代码中,我们使用gTest测试了一个字符串的长度。
首先,我们定义了一个TEST宏,该宏用于指定测试用例的名称和要测试的功能。
然后,我们在测试用例中使用了一个EXPECT_EQ断言,该断言用于判断字符串的长度是否等于11。
在main函数中,我们调用testing::InitGoogleTest()函数初始化gTest,并最终调用RUN_ALL_TESTS()函数运行所有的测试用例。
为了使用gTest,我们需要在项目中包含gtest.h头文件,并将gtest库链接到我们的项目中。
参考官方文档可以轻松完成这些步骤。
总之,gTest是一款非常强大的C++单元测试框架,它可以帮助开发人员编写更加健壮的代码。
GoogleC++单元测试框架(Gtest)系列教程之二——断言、函数测试
GoogleC++单元测试框架(Gtest)系列教程之⼆——断⾔、函数测试引⾔在中,介绍了如何编译测试代码、⽣成可执⾏⽂件,下⾯我们来看Gtest提供了哪些语句和框架来⽅便我们编写单元测试代码。
断⾔1.断⾔类型断⾔即判断⼀个条件是否为真的语句,它是构成Gtest测试代码最基本的单元。
Gtest为我们提供了两种类型的断⾔:1. ASSERT_*系列,当检查点失败时,终⽌测试函数;2. EXPECT_*系列,当检查点失败时,不终⽌所在测试函数,继续往下执⾏。
我们使⽤断⾔语句的时候,⼀般选择EXPECT_*系列的,基于以下两个原因:1. 该系列断⾔失败的时候并不终⽌所在测试函数,该函数中后续的检查点还能得到执⾏;2. 测试函数中可能包含有内存申请和释放的调⽤,ASSERT_*系列断⾔可导致后续的内存释放调⽤得不到执⾏,带来内存泄漏问题。
2.实例当⼀个断⾔判断失败的时候,Gtest将打印出该断⾔所在的源⽂件和⾏号,并给出失败的信息。
我们来看⼀个布尔值检查的例⼦:// IsPrime(int)函数判断⼊参是否为质数EXPECT_FALSE(IsPrime(1));// ...假如IsPrime(int)函数实现有误,将1也当成质数的话,测试的运⾏结果会包含如下提⽰:my_:15: FailureValue of: IsPrime(1)Actual: trueExpected: falseGtest为我们提供了布尔值检查、数值型数据检查、字符串检查等多种检查类型,关于这些检查类型更详细的使⽤⽅法,可以参看,还有。
测试函数1.TEST()在Gtest中,我们使⽤宏TEST()来定义我们的测试函数,使⽤的⽅式如下:TEST(test_case_name, test_name) {... test body ...}其中test body可以包含任何合法的C++语句以及上⾯提到的断⾔语句。
TEST()的第⼀个参数即测试⽤例的名称,第⼆个参数为该测试⽤例中测试实例的名称。
深入理解gtestCC++单元测试经验谈
深入理解gtestCC++单元测试经验谈深入理解gtest C/C++单元测试经验谈2011-08-22 13:57 杨玚 51CTO本文基于笔者的实际开发经验,言简意赅地讲解了C/C++单元测试框架gtest的主要使用方法和注意事项,并设计了若干可编译的精简示例,给出了运行效果图。
既可以用作gtest的入门教程,也适合作为工作中的快速参考。
AD:Google C++ Testing Framework(简称gtest,/p/googletest/)是Google公司发布的一个开源C/C++单元测试框架,已被应用于多个开源项目及Google内部项目中,知名的例子包括Chrome Web浏览器、LLVM编译器架构、Protocol Buffers数据交换格式及工具等。
优秀的C/C++单元测试框架并不算少,相比之下gtest仍具有明显优势。
与CppUnit比,gtest需要使用的头文件和函数宏更集中,并支持测试用例的自动注册。
与CxxUnit比,gtest不要求Python等外部工具的存在。
与Boost.T est比,gtest更简洁容易上手,实用性也并不逊色。
Wikipedia给出了各种编程语言的单元测试框架列表(/wiki/List_of_unit_testing_frameworks)。
一、基本用法gtest当前的版本是1.5.0,如果使用Visual C++编译,要求编译器版本不低于7.1(Visual C++ 2003)。
如下图所示,它的msvc文件夹包含Visual C++工程和项目文件,samples文件夹包含10个使用范例。
一般情况下,我们的单元测试代码只需要包含头文件gtest.h。
gtest中常用的所有结构体、类、函数、常量等,都通过命名空间testing访问,不过gtest已经把最简单常用的单元测试功能包装成了一些带参数宏,因此在简单的测试中常常可以忽略命名空间的存在。
按照gtest的叫法,宏TEST为特定的测试用例(T est Case)定义了一个可执行的测试(Test)。
gtest insequence的使用方法
gtest insequence的使用方法题目:GTest InSequence的使用方法摘要:GTest是一个功能强大的C++测试框架,用于编写和执行单元测试。
在编写测试用例时,有时需要按照特定的顺序测试不同的代码块,以确保它们的正确性和一致性。
GTest提供了InSequence功能,可用于控制代码块的执行顺序。
本文将详细介绍GTest InSequence的使用方法。
1. 引言2. GTest简介3. InSequence的基本概念4. 声明InSequence5. 代码块的顺序6. 示例:使用InSequence7. 意外情况处理8. 结论1. 引言在软件开发过程中,单元测试起着至关重要的作用。
通过单元测试,开发人员可以验证特定的代码块是否按照预期工作。
GTest是一种流行的C++单元测试框架,广泛用于C++项目。
GTest提供了丰富的功能和工具,用于编写和执行单元测试。
2. GTest简介GTest是Google开发的C++单元测试框架,具有简单易用的语法和丰富的断言功能。
通过使用GTest,开发人员可以方便地编写测试案例,并对其进行执行和断言检查。
GTest提供了各种工具和API,用于验证代码的正确性和可靠性。
3. InSequence的基本概念GTest的InSequence功能用于控制多个代码块的执行顺序。
在某些场景下,需要测试多个代码块按照特定的顺序执行。
在没有InSequence的情况下,每个测试用例中的代码块将按照它们在代码中出现的顺序执行。
4. 声明InSequence在使用InSequence之前,需要先声明一个InSequence对象。
使用TEST_F宏定义测试用例时,可以在SetUp函数中声明InSequence对象。
例如:cppclass MyTest : public testing::Test {protected:void SetUp() override {sequence = new testing::InSequence;}void TearDown() override {delete sequence;}testing::InSequence* sequence;};TEST_F(MyTest, TestCase1) {Testing code block 1}TEST_F(MyTest, TestCase2) {Testing code block 2}5. 代码块的顺序通过声明InSequence对象,可以确保测试用例中的代码块按照特定的顺序执行。
基于gtest进行单元测试
基于gtest进⾏单元测试技术岗测试(QA):保证代码没有bug开发(RD):搬砖运维(OP):⾮技术岗产品经理注意公司和部门和岗位和⼯资测试时需要先搞清楚需求和功能点姓名_学校专业_岗位.pdf1、软件开发⽣命周期2、单元测试:# include<cstdio>//实现⼀个求绝对值的函数int Abs(int x){return x>0?x:-x;}//针对Abs函数进⾏测试:单元测试必须为⼀个独⽴的函数void TestAbs(){int result=Abs(10);if(result==10){printf("ok\n");}else{printf("NO\n");}int result=Abs(-10);if(result==10){if(result==10){printf("ok 1\n");}else{printf("NO 2\n");}int result=Abs(0);if(result==0){printf("ok 2\n");}else{printf("NO 2\n");}}int main(){TestAbs();return0;}3、 gtest:⾕歌业界⼴泛使⽤的单元测试框架:gtest只能⽤于C++ gtest框架提供了gtest⽅式的单元测试gtest中有⼀个默认的main函数,成功会编程原亮⾊4、步骤:安装gtest# include<gtest/gtest.h># include<iostream>//TestCase相当于⽬录,Test相当于⽬录中的⽂件//把⼀组有关联的Test组织到⼀个TestCase//TestCaseName和TestName都要结合实际的测试场景决定//写⼀个test宏,进⾏单元测试的基本单位Test(HelloTestCase,HelloTest){//TEST宏⾥⾯可以写任何合法的C++代码std::cout<<"hello"<<std::endl;}Makefile:hello:g++ $^ -o $@ -I ~/third_part/include-L ~/third_part/lib -lgtest -lgtest_main -lpthread.PHONY:cleanclean:rm hello5、学会使⽤第三⽅库如何将第三⽅库引⼊项⽬中:gtest中⾃定义main函数(添加初始化即可):# include<gtest/gtest.h># include<iostream>//TestCase相当于⽬录,Test相当于⽬录中的⽂件//把⼀组有关联的Test组织到⼀个TestCase//TestCaseName和TestName都要结合实际的测试场景决定//写⼀个test宏,进⾏单元测试的基本单位Test(HelloTestCase,HelloTest){//TEST宏⾥⾯可以写任何合法的C++代码std::cout<<"hello"<<std::endl;}int main(int argc,char* argv[]){return RUN_ALL_TESTS();//把返回值作为进程的终⽌码}此时makefile中去掉mainhello:g++ $^ -o $@ -I ~/third_part/include-L ~/third_part/lib -lgtest -lpthread.PHONY:cleanclean:rm hello例题⼆、对求绝对值进⾏简单的单元测试:.cc# include<cstdio>//实现⼀个求绝对值的函数int Abs(int x){return x>0?x:-x;}//以下代码为测试代码TEST(TestAbs,Positive){//⽤法类似于assert宏:断⾔失败会(1)使程序崩溃,(2)进程异常终⽌://(3)会调⽤abort函数,导致进程异常终⽌。
简单易懂的单元测试框架-gtest(二)
简单易懂的单元测试框架-gtest(二)简介事件机制用于在案例运行前后添加一些操作(相当于挂钩函数)。
目前,gtest提供了三种等级的事件,分别:•全局级,所有案例执行的前后•TestSuite级,某一个案例集的前后•TestCase级,每一个案例的前后不同等级的事件在影响不同的范围。
示例-全局级全局级事件在所有案例执行的前后运行,制作该事件需要继承testing::Environment类,实现里面的SetUp和TearDown方法。
为了模拟实际应用中的情况,下面的测试代码分为了三个文件,分别代表:全局级事件头文件(unit_test.h);全局级事件实现文件(unit_);具体的测试文件(test_)。
测试代码如下,/* 为单元测试设置全局事件 */// unit_test.h#ifndef UNIT_TEST_H_#define UNIT_TEST_H_#include <gtest/gtest.h>class FooEnvironment: public testing::Environment{public:void SetUp();void TearDown();};#endif/* 为单元测试设置全局事件 */// unit_#include <iostream>#include "unit_test.h"void FooEnvironment::SetUp(){std::cout<<"FooEnvironment::SetUp"<<std::endl;}void FooEnvironment::TearDown(){std::cout<<"FooEnvironment::TearDown"<<std::endl;}/* 单元测试 */// test_#include "unit_test.h"bool checkOdd(int a){return a%2==1;}// 测试集checkOddTest的测试1TEST(checkOddTest, test1){ASSERT_EQ(true, checkOdd(1));ASSERT_EQ(true, checkOdd(11));}int main(int argc, char **argv){testing::AddGlobalTestEnvironment(new FooEnvironment); testing::InitGoogleTest(&argc, argv);return RUN_ALL_TESTS();}上述代码是一个简单的全局级事件模板,大部分时候我们都可以采用类似的结构在实际工程中添加单元测试程序。
gtest框架原理
gtest框架原理GTest(Google Test)是一个流行的C++单元测试框架,由Google开发和维护。
它为C++开发人员提供了一种简单而强大的方式来编写、组织和运行单元测试。
GTest框架的原理主要包括测试用例、测试夹具、断言和测试运行器。
首先,GTest使用测试用例来组织和管理单元测试。
测试用例是一组相关的测试,它们可以共享相同的设置和环境。
测试用例通常是函数,以TEST宏开始并具有唯一的名称。
可以在一个测试用例中定义多个测试,每个测试都是一个TEST_F或TEST宏。
测试夹具是用于初始化和清理测试环境的工具。
它可以在每个测试之前和之后执行附加的操作。
测试夹具通常是一个类,具有特定的方法,在测试开始之前执行SetUp函数,在测试结束之后执行TearDown函数。
可以使用TEST_F宏来在测试用例中使用测试夹具。
断言是GTest框架中用于验证条件的关键部分。
在测试过程中,开发人员可以添加多个断言来检查测试的各个方面是否满足预期。
当断言失败时,GTest将记录失败的条件和位置,并将其作为测试失败报告输出。
程序员可以使用预定义的断言宏,例如ASSERT_EQ、ASSERT_TRUE等,来编写测试,并比较预期结果和实际结果是否一致。
测试运行器(Test Runner)是GTest框架的核心组件,它负责加载测试用例、执行测试并生成测试结果报告。
GTest提供了两种常用的测试运行器:gtest_main和gtest. 这两种运行器都会加载测试用例,并通过调用框架提供的API来运行测试并生成结果报告。
gtest_main 测试运行器是GTest框架的默认运行器,它会自动发现测试用例并执行它们。
它负责解析命令行参数、初始化GTest框架、运行测试用例,并输出测试结果报告。
使用gtest_main 运行器,开发人员可以编译并执行测试用例所在的源文件。
gtest 测试运行器是一个额外的可执行文件,开发人员需要手动编写一个main函数来使用它。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
伪代码: class Sale { Display display; public Sale(Diaplay display) { this.display=display; } void scan() { display.showLine(); } }
2.2.2 接缝模型
接缝(seam):在程序的一些特殊的点,可以不用修 改源码就可以达到改动代码的行为。
每个接缝点都有一个激活点,在这些点我们可以改变 代码的行为。 接缝类型: 对象接缝 链接接缝 预处理期接缝(不适用,这里不做介绍)
对象接缝
用子类去覆盖掉基类中的。
图例: 在一个POS系统中Sale类,其中方法Scan()显示商品信息。 伪代码: class Sale { void scan() { ........... 调用设备SDK方法showLine(); ........... } }
1.2 xUnit简介
创建 testMethod_1
测试用 例对象 建立 夹具
执行
每个测试依次执行的4个不同阶段: 1、建立测试夹具(Fixture) ;
测试运行器 套件 运行 创建
测试 套件 对象
执行 验证 拆卸
执行
SUT
2、与SUT(System Under Test)交互;
3、验证结果; 4、拆卸测试Fixture,返回初始状态。
VS2008下简单实现示例
EXPECT_EXIT(statement, predicate, regex) 1. statement是被测试的代码语句 2. predicate 在这里必须是一个委托,接收int型参数,并返回bool。 只有当返回值为true时,死亡测试案例才算通过。
VS2008下简单实现示例
•
•
原则:源代码在产品阶段和测试阶段应该是完全一样 的
2.2 单元测试场景实例分析
在实际编写单元测试中,在单元测试之前的一些对函数所用的初始化 操作通常并不能满足需要,常规的方法并不能解决一些复杂的问题。
例如函数中涉及到对设备sdk调用、socket通信、工程中依赖的一些第三方 库函数的引用等等。单元测试中并不需要对这些纳入到测试中,我们只需要模拟 这些调用产生的结果返回到需要测试的函数即可。
布尔值检查ຫໍສະໝຸດ 数值型检查字符串检查
浮点型检查
当断言检查出错时输出的信息并不能很好的帮助你还原当时出错的状况时, 可以使用“<<” 操作符输出指定内容帮助分析出错原因。
1.3.2 事件机制
Gtest事件机制分类:
全局:发生在所有案例执行前后 TestSuite:案例中所有案例执行前后 TestCase: 单个案例前后
Googletest框架和单元测试
杭州 2011.10.12
内容
Googletest 框架 单元测试(Unit Testing)
Googletest 框架
Googletest 背景 xUnit简介 Googletest 特性 Googletest 环境搭建 Googletest 使用
汇 编
• 汇编码译为机器码 (目标文件.obj)
可执行应用程序
.....
.....
链接图示
本地实现调用第三方库功能, 在加载阶段去掉第三方库文件,添 加本地的.obj目标文件。
流程图示
参考资料
1. /p/googletest/wiki/Documentation Gtest官方文档 2. CoderZh技术博客《玩转Google开源C++单元测试框架GoogleTest系列》 3. 《xUnit.Test.Patterns.Refactoring.Test.Code》 4. 《修改代码的艺术》 5. 《程序员的自我修养-链接、装载与库》
如果程序正常退出并且退出码与exit_code相同则返回 true
Windows 下正规表达式风格: Simple风格:GTEST_USES_SIMPLE_RE=1(预处理处添加)
1.4 Googletest 环境搭建
搭建步骤: (1) 设置gtest头文件路径 (2) 设置gtest.lib路径
感谢您的关注
1.5 Googletest 使用
(1)创建单元测试工程
RUN_ALL_TESTS()宏功能: 1.Saves the state of all Google Test flags. 2.Creates a test fixture object for the first test. 3.Initializes it via SetUp(). 4.Runs the test on the fixture object. 5.Cleans up the fixture via TearDown(). 6.Deletes the fixture. 7.Restores the state of all Google Test flags. 8.Repeats the above steps for the next test, until all tests have run.
环境要求:Linux, Windows (requires MSVC 8.0 or above), Cygwin, and Mac (the latter three are supported since v1.3.0).
EXPECT_DEATH(statement, regex);
1. statement是被测试的代码语句 2. regex是一个正则表达式,用来匹 配异常时在stderr中输出的内容
Sale +Scan(barcode: string)
Sale +Scan(barcode: string) +virtual ShowLine()
Sale +Scan(barcode: string) +virtual ShowLine()
伪代码: class Sale { void scan() { ........... showLine(); ........... } virtual showLine() { 调用设备SDK方法showLine(); } }
testMethod_n 创建
testMethod_n
测试 用例类
1.3 Googletest 特性
断 言
事件机制 参数化测试 运行参数 death测试
1.3.1 断
言
断言宏分类: (1) ASSERT_*系列:检查点失败时,推出当前函数 (2) EXPECT_*系列:检查点失败时,继续往下执行
(2)在待测试的类头文件中添加gtest头文件
(3)在待测试的类头文件中添加测试单元声明
此声明实质为待测试类添加友类,下图为gtest源码:
(4)实现测试案例实体和所需的事件机制
宏(TEST/TEST_F)源码分析:
(5)验证和查看单元测试结果
单元测试(Unit Testing)
Unit Testing 单元测试实例分析
Gtest工程产生exe文件图
运行输出案例表参数图示
参数列表
测试案例集合参数
测试案例输出参数
测试案例异常处理参数
1.3.5 death测试
在测试过程中,对于可能导致程序崩溃的输入,我们可 以检查程序是否按预期的方式崩溃,验证崩溃结果。
注意事项: 1. 不要在死亡测试里释放内存。 2. 在父进程里再次释放内存。 3. 不要在程序中使用内存堆检查。
1.1 Googletest 背景
Googletest是Googletest针对C++测试的开源项目,跨 平台(Linux, Mac OS X, Windows, Cygwin, Windows CE, and Symbian)。 基于xUnit框架,有丰富的断言,自定义断言,事件机 制,death 测试,参数化测试,XML测试报告等。 应用案例: Chromium projects (谷歌浏览器) LLVM (Low Level Virtual Machine) ProtocalBuffers (类似XML数据描述语言)
TestCase事件
TestCase事件发生在每个TestCase执行前后 1. SetUp()方法在每个TestCase执行前执行 2. TearDown()方法在每个TestCase执行后执行
1.3.3 参数化测试
当被测函数需要传入不同的值时,可以考虑Gtest提供 的参数化测试功能。
使用说明:
INSTANTIATE_TEST_CASE_P(param1,param2,param3) param1:任意取; param2:测试案例的名称; param3:参数生成器 (eg:testing::Values());
1.3.4 运行参数
在运行Gtest时,Gtest提供了一系列的参数可以使我们 对案例的执行进行有效的控制。
全局事件
要实现全局事件,必须写一个类,继承testing::Environment类,实 现里面的SetUp和TearDown方法。 1. SetUp()方法在所有案例执行前执行 2. TearDown()方法在所有案例执行后执行
TestSuite事件
需要实现一个类,继承testing::Test,然后实现两个静态方法 1. SetUpTestCase() 方法在第一个TestCase之前执行 2. TearDownTestCase() 方法在最后一个TestCase之后执行
针对以上问题常用处理方法:
伪对象 接缝模型
2.2.1 伪对象
伪对象:指测试中用来替代单元测试环境中无法调用的对象。
图例: 在一个POS系统中Sale类,其中方法Scan()显示商品信息。
伪代码: class Sale { void scan() { ........... 调用设备SDK方法showLine(); ........... } }