玩转Google开源C++单元测试框架Google Test
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提供了丰富的断言和测试夹具,可以满足各种测试需求,并且具有良好的可扩展性和灵活性。
googletest测试框架使用教程
1 在 VS2008 中使用 GOOGLETEST ..........................................................................................................2
1.1 下载 .................................................................................................................................................. 2 1.2 编译 GTEST 库 .................................................................................................................................... 2
2 GOOGLETEST 教程 ...............................................................................................................................8
2.1 断言 .................................................................................................................................................. 8 2.1.1 示例 ............................................................................................................................................. 8 2.1.2 分类 ............................................................................................................................................. 9
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结构。
C单元测试框架之Cmockery?DevLabs
C单元测试框架之Cmockery?DevLabsCmockery 是google开源的用于C单元测试的一个轻量级的框架. 它只需要测试程序与标准C库链接,此外, Cmockery尽量避免使用编译器中比较新的一些特性, 以保持对一些旧编译器的兼容性.Cmockery一共有三个文件, Cmockery.c, Cmockery.h, config.h. 它们最终将和待测模块被编译成一个可独立运行的程序. 在Windows 下的话makefile可以无视, 只要将上面三个文件加入到工程再写好对应的测试代码然后编译即可.在嵌入式环境下我没有做测试, 但应该不会有问题.在example文件夹里Google给出了一些例子可供参考,目录结构可以参考这里1.断言.cmockery支持如下断言, 看名知意, 无需多言.assert_true(c);assert_false(c);assert_int_equal(a, b);assert_int_not_equal(a, b);assert_string_equal(a, b);assert_string_not_equal(a, b);assert_memory_equal(a, b, size);assert_memory_not_equal(a, b, size);assert_in_range(value, minimum, maximum);assert_not_in_range(value, minimum, maximum);assert_in_set(value, values, number_of_values);assert_not_in_set(value, values, number_of_values);2.mock()模拟函数.此函数用于这样的场景: 模块所依赖的外部接口无法使用或者某些接口暂时还未实现时可用它来模拟该接口, 它的返回值由函数will_return() 指定.以之前写的表达式计算器为例.在计算器源代码中有一个原型为 int get_input(char *buf) 的函数, 用来获取用户输入, 当要进行自动化的单元测试时肯定要采取某种方式模拟自动输入, 而这个输入要可以指定. 此时mock()就可以派上用场了.在get_input()这个函数中, 用于获取输入的接口是getch(), 为了能自动模拟用户输入, 需要将此接口替换掉. 在这里使用一个宏将getch() 替换为 test_getch(), 然后在单元测试模块中实现 test_getch(), 以实现自动输入的目地.test_getch()的实现:// 此函数将替换getch(), 用于模拟用户输入int test_getch(void){// 此返回值使用will_return()函数指定, 强制转换为所需要的类型return (int)mock();}其中mock()的返回值是由will_return()指定的, mock()的默认返回值为 void * 类型, 将其转换为合适的目标类型即可.get_input()的单元测试函数:// 测试函数void test_get_input(void **state){// 模拟用户输入的字符串char *user_input = "10 +9 - 8(\b * (4 - 3)2\b/2 \r";// 用户输入被处理之后得到的字符串char *input = "10+9-8*(4-3)/2";// 存储输入的缓存区char input_buf[EXPR_LEN];size_t i;for (i = 0; i < strlen(user_input); i++) { // 当调用test_getch()时将依次返回此处写入的字符// test_getch()在get_input()函数中被调用 will_return(test_getch, *(user_input + i)); } // 测试, get_input()返回的是输入的有效字符数assert_int_equal(get_input(input_buf), strlen(input)); // 测试, 得到的输入值是否符合期望assert_string_equal(input_buf, input); return; }其中 user_input 为模拟用户输入的字符流, input是经get_input()处理后应该得到的字符串.test_getch()在get_input()中被调用, 在其被调用之前, 先使用will_return()将模拟输入的值存入队列, 当调用test_getch()时将依次返回此处用will_return()写入队列的值.3. expect_*()ecpect_*()系列宏和check_expected()配合使用, 用于参数检查.假设被测模块中有函数 foo() 如下:int foo(int i){bar(i);return i;}其中bar()是被测模块外实现的函数.在进行单元测试时, 为了测试能正常进行, 需要在单元测试模块中实现一个test_bar()的替代函数:void test_bar(int i){// 在这里进行参数检查check_expected(i);// other codereturn i * i;}对foo()进行单元测试的代码:void test_foo(void **state){// 检查test_bar()中传入的参数i的值是否为10.// test_bar()中的check_expected()函数将执行检查expect_value(test_bar, i, 10);assert_int_equal(foo(10), 100);return;}4. 用于单元测试的标准输出和错误输出函数void print_message(const char* const format, ...);void print_error(const char* const format, ...);void vprint_message(const char* const format, va_list args);void vprint_error(const char* const format, va_list args);5. 测试的运行所有测试函数的原型均为 void test_func(void **state);unit_tests(func) 宏用来将测试函数添加入数组, 然后使用run_tests()来依次测试数组中的测试函数.unit_test_setup_teardown(test, setup, teardown) 功能同上, 不过多了初始化与卸载函数. 其中setup是在测试之前进行初始化的函数, teardown是测试完成之后进行清场的函数. 这两个函数均可为NULL.此外 cmockery 还可以测试动态内存分配, 找出内存泄漏等问题.相关阅读:“单元测试要做多细?”Prev:C语言写的俄罗斯方块字符编解码的故事–ASCII,ANSI,Unicode,Utf-8区别(转):Next ?。
gtest使用教程
运行截屏
参数化测试
• 参数化测试在有些时候可以简化测试代码的编写,减少其 冗余。不过这个技术较少使用。下面是其一个例子:
class IsPrimeParamTest : public::testing::TestWithParam<int>{}; TEST_P(IsPrimeParamTest, HandleTrueReturn) { int n = GetParam(); EXPECT_TRUE(IsPrime(n)); } // 定义参数 INSTANTIATE_TEST_CASE_P(TrueReturn, IsPrimeParamTest, testing::Values(3, 5, 11, 23, 17));
后两种事件较为常用,下面一个例子演示其效果。
事件机制实例
class FooTest : public testing::Test { public: static void SetUpTestCase(){ cout << "SetUpTestCase" << endl;} static void TearDownTestCase(){ cout << "TearDownTestCase" << endl;} virtual void SetUp(){ cout << "SetUp" << endl;} virtual void TearDown(){ cout << "TearDown" << endl;} }; TEST_F(FooTest, Test0){ cout << "Test0" << endl;} TEST_F(FooTest, Test1){ cout << "Test1" << endl;}
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.运行测试:执行生成的可执行文件进行测试。
googletest原理
googletest原理Googletest原理概述•Googletest是Google开发的一个用于C++代码的单元测试框架。
•它是一个开源的工具,旨在促进测试驱动开发(TDD)和测试先行开发(BDD)。
•Googletest通过提供丰富的断言宏和全面的测试框架,使得编写和运行单元测试变得容易。
基本原理1.Googletest基于xUnit架构,即将测试用例封装在测试类中,并利用测试运行器执行这些测试。
2.测试用例由一个或多个测试函数组成,每个测试函数对应一个测试点。
3.测试用例可以使用宏定义来声明,并使用断言宏来验证预期结果是否符合实际结果。
4.Googletest支持参数化测试,通过不同参数值的组合运行同一个测试函数,减少重复代码。
5.测试运行器负责管理测试的执行顺序、报告测试结果,并提供各种测试结果的统计信息。
断言宏•Googletest提供了丰富的断言宏,用于验证测试结果是否符合预期。
•常用的断言宏包括:–ASSERT_TRUE(condition):验证条件为真–ASSERT_FALSE(condition):验证条件为假–ASSERT_EQ(val1, val2):验证两个值相等–ASSERT_NE(val1, val2):验证两个值不相等–ASSERT_LT(val1, val2):验证val1小于val2–ASSERT_LE(val1, val2):验证val1小于等于val2–ASSERT_GT(val1, val2):验证val1大于val2–ASSERT_GE(val1, val2):验证val1大于等于val2–ASSERT_STREQ(str1, str2):验证两个C字符串相等–ASSERT_STRNE(str1, str2):验证两个C字符串不相等示例•下面是一个简单的示例,用于演示Googletest的用法:#include <gtest/>TEST(MathTest, Add){ASSERT_EQ(2 + 2, 4);}int main(int argc, char** argv){testing::InitGoogleTest(&argc, argv);return RUN_ALL_TESTS();}测试运行器•Googletest的测试运行器负责管理测试的执行顺序和报告测试结果。
c++ gtest例子
c++ gtest例子Google Test(简称GTest)是Google为C++编写的一个开源的单元测试框架。
它为C++开发者提供了一套简单易用的API,用来编写、组织和运行单元测试。
以下是一个使用GTest的基本示例,展示了如何设置和运行测试用例。
```cpp#include <gtest/gtest.h>// 被测试的函数int add(int a, int b) {return a + b;}// 测试用例1:测试加法运算TEST(AddTest, PositiveNumbers) {EXPECT_EQ(3, add(1, 2));EXPECT_EQ(5, add(2, 3));}// 测试用例2:测试加法运算的边界条件TEST(AddTest, ZeroAndNegativeNumbers) {EXPECT_EQ(1, add(0, 1));EXPECT_EQ(-1, add(1, -2));}int main(int argc, char* argv[]) {// 初始化GTest框架::testing::InitGoogleTest(&argc, argv);// 运行所有测试用例return RUN_ALL_TESTS();}```上述代码中,定义了一个名为add的函数,接收两个整数参数,返回它们的和。
然后,我们使用GTest的宏定义TEST来定义两个测试用例。
第一个测试用例AddTest.PositiveNumbers测试了两个正数相加的结果,使用GTest的EXPECT_EQ宏来验证预期结果。
第二个测试用例AddTest.ZeroAndNegativeNumbers测试了零和负数相加的结果。
通过这样定义多个测试用例,我们可以对被测函数的不同输入和边界条件进行全面的测试。
在main函数中,我们首先使用::testing::InitGoogleTest来初始化GTest框架,然后使用RUN_ALL_TESTS运行所有的测试用例。
GTest使用说明材料
玩转Google开源C++单元测试框架Google Test系列(gtest)(总)前段时间学习和了解了下Google的开源C++单元测试框架Google Test,简称gtest,非常的不错。
我们原来使用的是自己实现的一套单元测试框架,在使用过程中,发现越来越多使用不便之处,而这样不便之处,gtest恰恰很好的解决了。
其实gtest本身的实现并不复杂,我们完全可以模仿gtest,不断的完善我们的测试框架,但最后我们还是决定使用gtest取代掉原来的自己的测试框架,原因是:1.不断完善我们的测试框架之后就会发觉相当于把gtest重新做了一遍,虽然轮子造的很爽,但是不是必要的。
2.使用gtest可以免去维护测试框架的麻烦,让我们有更多精力投入到案例设计上。
3.gtest提高了非常完善的功能,并且简单易用,极大的提高了编写测试案例的效率。
如果想对gtest内部探个究竟,就把它的代码下载下来研究吧,这就是开源的好处,哈!官方已经有如此完备的文档了,为什么我还要写呢?一方面是自己记记笔记,好记性不如烂笔头,以后自己想查查一些用法也可以直接在这里查到,一方面是对于不想去看一大堆英文文档的朋友,在我这里可以快速的找到gtest相关的内容。
一、初识gtest1、前言本篇将介绍一些gtest的基本使用,包括下载,安装,编译,建立我们第一个测试Demo 工程,以及编写一个最简单的测试案例。
2、下载如果不记得网址,直接在google里搜gtest,第一个就是。
目前gtest的最新版本为1.3.0 3、编译下载解压后,里面有个msvc目录:使用VS的同学可以直接打开msvc里面的工程文件,如果你在使用的是VS2005或是VS2008,打开后会提示你升级,升完级后,我们直接编译里面的“gtest”工程,可以直接编过的。
这里要提醒一下的是,如果你升级为VS2008的工程,那么你的测试Demo最好也是VS2008工程,不然你会发现很郁闷,你的Demo怎么也编不过,我也曾折腾了好久,当时我升级为了VS2008工程,结果我使用VS2005工程建Demo,死活编不过。
gtest类方法
gtest类方法GTest(Google Test)是Google开源的C++单元测试框架,广泛应用于测试C++代码的正确性和稳定性。
它提供了丰富的断言接口和测试用例管理工具,使得开发人员可以方便地编写和运行单元测试。
GTest类方法是GTest框架中定义的一些类成员方法,用于进行测试用例的断言和异常处理。
下面将介绍GTest类方法的一些常用用法和示例。
1.ASSERT系列断言方法GTest框架提供了一系列的ASSERT断言方法,用于对测试结果进行断言。
其中包括ASSERT_EQ、ASSERT_NE、ASSERT_TRUE、ASSERT_FALSE等方法,可以用于判断两个值是否相等、是否不相等,以及判断一个值是否为真或假。
示例:```cppint add(int a, int b)return a + b;TEST(MathTest, AddTest)ASSERT_EQ(add(2, 3), 5);ASSERT_NE(add(2, 3), 6);ASSERT_TRUE(add(2, 3) > 4);ASSERT_FALSE(add(2, 3) < 4);```2.EXPECT系列断言方法除了ASSERT系列断言方法,GTest还提供了EXPECT系列断言方法。
二者的区别在于,ASSERT断言失败会导致当前测试用例终止,而EXPECT 断言失败只是记录失败信息,当前测试用例会继续执行。
示例:```cppint divide(int a, int b)if (b == 0)throw std::invalid_argument("divide by zero");}return a / b;TEST(MathTest, DivideTest)EXPECT_EQ(divide(6, 3), 2);EXPECT_THROW(divide(6, 0), std::invalid_argument);```3. SetUp和TearDown方法在GTest中,每个测试用例的执行都可以有各自的SetUp和TearDown方法,用于初始化和清理测试环境。
gtest mock 原理
gtest mock 原理
Google Test(简称gmock)是Google推出的一个C++单元测试框架。
Google Test的原理可以概括为以下几个步骤:
1. 定义Mock对象:用户在测试中需要模拟的对象被定义为一个Mock类,该类继承自待模拟的类(或接口),并重写其中的虚函数。
2. 设置行为:用户可以通过Google Mock提供的
EXPECT_CALL宏来为Mock对象设置特定的行为,例如设定调用次数、设定返回值、设定参数匹配等。
3. 运行测试:当测试运行到调用被Mock对象模拟的函数时,Google Mock将会自动捕获这个调用,并检查其是否满足之前设定的行为要求。
4. 断言结果:Google Mock会根据之前设定的行为要求来判断这个调用是否符合预期,并告知测试结果。
5. 清理资源:在测试结束后,Google Mock会自动释放Mock 对象所占用的资源。
通过上述步骤,Google Mock能够模拟系统中的对象,捕获对其的调用,并根据预定的行为要求进行断言,从而实现对被测程序的单元测试。
googletest mock 示例
一、背景介绍在软件开发领域,单元测试是非常重要的一环。
而针对 C++ 开发的单元测试,GoogleTest 是一个非常流行的选择。
GoogleTest 提供了丰富的断言和测试框架,可以帮助开发人员编写高质量的测试用例。
而在实际开发中,有时候我们需要使用 mock 对象来模拟一些特定的行为,以便更好地进行单元测试。
二、GoogleTest 中的 MockGoogleTest 提供了一个叫做 GoogleMock 的子框架,用于支持mock 对象的创建和使用。
GoogleMock 提供了丰富的 API,可以灵活地创建和控制 mock 对象的行为。
在实际的项目开发中,我们通常需要使用 GoogleMock 来模拟一些外部依赖,例如文件系统、网络通信、数据库等,以便更好地进行单元测试。
三、示例代码以下是一个简单的示例代码,演示了如何使用 GoogleTest 和GoogleMock 进行单元测试。
```cpp#include <gtest/gtest.h>#include <gmock/gmock.h>// 需要被测试的类class Calculator {public:virtual ~Calculator() {}virtual int add(int a, int b) {return a + b;}};// 测试 Fixtureclass CalculatorMock : public Calculator {public:MOCK_METHOD2(add, int(int, int));};TEST(CalculatorTest, Add) {CalculatorMock calc; // 创建 mock 对象EXPECT_CALL(calc, add(1, 2)).WillOnce(testing::Return(3)); // 设置预期行为EXPECT_EQ(3, calc.add(1, 2)); // 执行测试}```在这个示例中,我们定义了一个简单的 Calculator 类,并使用CalculatorMock 类来创建 mock 对象。
玩转Google开源C++单元测试框架Google Test
玩转Google开源C++单元测试框架Google Test作者:CoderZh(CoderZh的技术博客 - 博客园)出处:/目录二、断言 (9)三、事件机制 (18)四、参数化 (22)五、死亡测试 (29)六、运行参数 (35)七、深入解析gtest (41)八、打造自己的单元测试框架 (57)一、一、本篇工程二、如果从下http http http 三、下载、初识gt 前言篇将介绍一些程,以及编写下载果不记得网址下列地址可以p://googlet p://googlet p://googlet 编译载解压后,里test些gtest 的基写一个最简单址, 直接在go 以下载到该最test.google test.google test.google 里面有个ms 本使用,包括单的测试案例oogle 里搜g 最新版本:/f /f /f svc 目录:括下载,安装。
gtest,第一个files/gtest-files/gtest-files/gtest-装,编译,建个就是。
目前1.3.0.zip 1.3.0.tar.gz 1.3.0.tar.bz 建立我们第一前gtest 的最新 2一个测试De 新版本为1.3mo 3.0,使用VS2编过这里VS2时我误解版本编译gtes 四、下面我们结如1.设2.设用VS 的同学可2008,打开后过的。
里要提醒一下2008工程,我升级为了V 解了,并不是本,最好保证译之后,在m st.lib 文件。
第一个D面我们开始建们在VS2008如下:设置gtest 头文设置gtest.lib 可以直接打开后会提示你升下的是,如果不然你会发现VS2008工程是说只能在V 证gtest 和你msvc 里面的Demo 建立我们的第8中,新建一文件路径b路径开msvc 里面升级,升完级果你升级为VS 现很郁闷,你程,结果我使S2008中编的测试工程都Debug 或是第一个Demo 一个Win32 C 面的工程文件级后,我们直S2008的工程你的Demo 使用VS2005编译,在VS2都使用VS20是Release 目o 了,假如之前Console Ap 件, 如果你在直接编译里面程,那么你的怎么也编不工程建Dem 005中同样可005工程。
(转)玩转Google开源C++单元测试框架GoogleTest系列(gtest)之三-事件机制
(转)玩转Google开源C++单元测试框架GoogleTest系列(gtest)之三-事件机制⼀、前⾔gtest提供了多种事件机制,⾮常⽅便我们在案例之前或之后做⼀些操作。
总结⼀下gtest的事件⼀共有3种:1. 全局的,所有案例执⾏前后。
2. TestSuite级别的,在某⼀批案例中第⼀个案例前,最后⼀个案例执⾏后。
3. TestCae级别的,每个TestCase前后。
⼆、全局事件要实现全局事件,必须写⼀个类,继承testing::Environment类,实现⾥⾯的SetUp和TearDown⽅法。
1. SetUp()⽅法在所有案例执⾏前执⾏2. TearDown()⽅法在所有案例执⾏后执⾏class FooEnvironment : public testing::Environment{public:virtual void SetUp(){std::cout << "Foo FooEnvironment SetUP" << std::endl;}virtual void TearDown(){std::cout << "Foo FooEnvironment TearDown" << std::endl;}};当然,这样还不够,我们还需要告诉gtest添加这个全局事件,我们需要在main函数中通过testing::AddGlobalTestEnvironment⽅法将事件挂进来,也就是说,我们可以写很多个这样的类,然后将他们的事件都挂上去。
int _tmain(int argc, _TCHAR* argv[]){testing::AddGlobalTestEnvironment(new FooEnvironment);testing::InitGoogleTest(&argc, argv);return RUN_ALL_TESTS();}三、TestSuite事件我们需要写⼀个类,继承⽅法在最后⼀个TestCase之后执⾏class FooTest : public testing::Test {protected:static void SetUpTestCase() {shared_resource_ = new ;}static void TearDownTestCase() {delete shared_resource_;shared_resource_ = NULL;}// Some expensive resource shared by all tests.static T* shared_resource_;};在编写测试案例时,我们需要使⽤TEST_F这个宏,第⼀个参数必须是我们上⾯类的名字,代表⼀个TestSuite。
开源C单元测试框架GoogleTest介绍
开源C++单元测试框架Google Test介绍Google T estGoogle t est是针对c/c++的开源测试项目。
采用的协议是BSD licens e,有很多著名的开源项目采用了它,包括Chro mium(谷歌浏览器开发版)。
安装配置下载主页:http://code.googl/p/google test/官方资料文档:http://code.googl/p/google test/wiki/Google TestP rimerhttp://code.googl/p/google test/wiki/Google TestA dvanc edGui de当前的最新版本是1.5。
包含3种ta r.bz2,tar.gz和zip格式。
解压后的目录结构:其中的msvc就是VS的工程目录,可以直接打开进行编译(vs2008则需要进行工程升级转化),生成相应的lib静态库文件。
在vs中需要在工程中设置3个地方,和ACE的设置一样:1.设置gtest的头文件2.设置gtest的lib文件注:如果测试代码需要上库,附加依赖项建议不要带绝对路径。
3.设置运行时的多线程库支持如果是Release版本,Runtim e Librar y设为/MT。
当然,其实你也可以选择动态链接(/MD),前提是你之前编译的gt est也使用了同样是/MD选项。
如果是在Linux下,就比较方便,和普通的开源软件一样,采用1../config ure –prefix=/your install path (如果不带参数默认为/usr/local下面)2.make3.make install然后就可以在工程中进行使用(如果指定了安装目录,则需要-I和-L来指明,同时也在最后的link加上-lpthre ad –lgtest)下面是一个简易的写法:By the way: 我在192.168.100.119上采用的是默认安装,所以直接加上-lgtest和-lpthre ad就可以了简单例子如果需要使用gtest,则需要包含#includ e"gtest/gtest.h"下面是一个简单例子:编译运行的结果:下面来依次解释:myadd是待测试函数名,TEST是作为gT es t的一次测试(其实它是由g T est包装过的一个宏),第一个参数T est_m yadd是测试用例名,第二个参数IsRetu rnAdd是测试名(这两个参数都是自己任意定义的)。
google test 单元测试
Goal:
check the unit bug(interface/data/logic/coverage/boundary/ variable ) & fix Optimizations Restructuring for better design
After coding
offical website: /p/googletest/ Latest version: 1.4.0
Msvc directory
Include
Lib
Runtime Library
It’s easy to get over-zealous. Do not test:
Xml style
RecordProperty(key,value);
will output XML like this: ... <testcase name="MinAndMaxWidgets" status="run" time="6" classname="WidgetUsageTest" key=value/> ...
--gtest_output=xml [:DIRECTORY_PATH\|: FILE_PATH]
将测试结果输出到一个xml中。 1.--gtest_output=xml: 不指定输出路径时, 默认为案例当前路径。 2.--gtest_output=xml:d:\ 指定输出到某个目 录 3.--gtest_output=xml:d:\foo.xml 指定输出到 d:\foo.xml 如果不是指定了特定的文件路径,gtest每 次输出的报告不会覆盖,而会以数字后缀的 方式创建。xml的输出内容后面介绍吧。
CLion之C++框架篇-优化框架,单元测试(二)
CLion之C++框架篇-优化框架,单元测试(⼆)背景 结合上⼀篇,继续进⾏框架优化! googletest(GTest)是Google开源的C++测试框架,与CLion组合,对C++环境开发真算得上是双剑合璧。
我的⽬标是在CLion⼯程中集成GTest,进⾏框架优化。
安装GTest 源码位置:https:///google/googletest 下载地址为:https:///google/googletest/archive/master.zip 放置到对应的⼯程⽬录下⾯,如图: 优化我的CMakeLists.txt详细代码:cmake_minimum_required(VERSION 3.8)project(work)message("------------ Options -------------")message(" CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}")message(" CMAKE_BUILD_TYPE: Hello World!")# 编译google test,会在当前⽬录⽣成libtest.a静态库add_subdirectory(./googletest)#头⽂件include_directories(${PROJECT_SOURCE_DIR}/src/include ./googletest/include)#源⽂件aux_source_directory(${PROJECT_SOURCE_DIR}/src/main dir_srcs)#库⽂件 : libtest.a 添加到链接路径中link_directories(${PROJECT_SOURCE_DIR}/lib ${PROJECT_SOURCE_DIR}/googletest)#需要添加googletest运⾏需要的pthreadset(LIBRARIES pthread)#编译器相关设置set(CMAKE_CXX_STANDARD 11)set(CMAKE_CXX_COMPILER "clang++" ) # 显⽰指定使⽤的C++编译器set(CMAKE_CXX_FLAGS "-g") # 调试信息set(CMAKE_CXX_FLAGS "-Wall") # 开启所有警告set(WORK ${dir_srcs})add_custom_target(cmake-build-debug)add_executable(${PROJECT_NAME} ${WORK})target_link_libraries(${PROJECT_NAME} gtest)做个简单的测试case:字符串去掉空格处理优化框架思路:⽇常使⽤中,建议把这些代码放置到每个实现函数⽂件中,然后通过宏去控制!1、公共⽂件common.h代码如下://// Created by Zhou,Baochuan on 18/5/25.//#ifndef WORK_COMMON_H#define WORK_COMMON_H#include <iostream>#include <string>#define ENV_DEBUG#ifdef ENV_DEBUG#include <gtest/gtest.h>#endifusing namespace std;#endif //WORK_COMMON_H2、实现⽂件,如字符串⼯具类:string_util.cpp代码如下://// Created by Zhou,Baochuan on 18/5/25.//#include <iostream>#include "string_util.h"using namespace work;using namespace std;string StringUtil::ltrim(string str){string chars = "\t\n\v\f\r ";str.erase(0, str.find_first_not_of(chars));return str;}string StringUtil::rtrim(string str){string chars = "\t\n\v\f\r ";str.erase(str.find_last_not_of(chars) + 1);return str;}string StringUtil::trim(string str){return ltrim(rtrim(str));}#ifdef ENV_DEBUGTEST(string_util, trim){string src1 = " 空格校验 ";string src2 = StringUtil::trim(src1);EXPECT_STREQ("空格校验", src2.c_str()); EXPECT_STREQ("空格校验 ", src2.c_str()); }#endif3、⼊⼝⽂件代码如下:#include "common.h"#include "string_util.h"using namespace work;#ifndef ENV_DEBUGint main(int argc, char** argv) {string src = " OK";cout << StringUtil::trim(src) << endl;return 0;}#elseGTEST_API_ int main(int argc, char ** argv) { testing::InitGoogleTest(&argc, argv);return RUN_ALL_TESTS();}#endif4、上线的时候,把这个common.h⽂件中的定义删除掉,如图:5、运⾏部分样例,如图:资源分享 优化后-框架代码:https:///rtxbc/cplus/tree/master/work googletest 说明⽂档(源代码的docs⽬录⾥有说明) 翻译后⽂档:/coderzh/archive/2009/04/06/1426755.html 推荐。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
玩转Google开源C++单元测试框架Google Test作者:CoderZh(CoderZh的技术博客 - 博客园)出处:/目录二、断言 (9)三、事件机制 (18)四、参数化 (22)五、死亡测试 (29)六、运行参数 (35)七、深入解析gtest (41)八、打造自己的单元测试框架 (57)一、一、本篇工程二、如果从下http http http 三、下载、初识gt 前言篇将介绍一些程,以及编写下载果不记得网址下列地址可以p://googlet p://googlet p://googlet 编译载解压后,里test些gtest 的基写一个最简单址, 直接在go 以下载到该最test.google test.google test.google 里面有个ms 本使用,包括单的测试案例oogle 里搜g 最新版本:/f /f /f svc 目录:括下载,安装。
gtest,第一个files/gtest-files/gtest-files/gtest-装,编译,建个就是。
目前1.3.0.zip 1.3.0.tar.gz 1.3.0.tar.bz 建立我们第一前gtest 的最新 2一个测试De 新版本为1.3mo 3.0,使用VS2编过这里VS2时我误解版本编译gtes 四、下面我们结如1.设2.设用VS 的同学可2008,打开后过的。
里要提醒一下2008工程,我升级为了V 解了,并不是本,最好保证译之后,在m st.lib 文件。
第一个D面我们开始建们在VS2008如下:设置gtest 头文设置gtest.lib 可以直接打开后会提示你升下的是,如果不然你会发现VS2008工程是说只能在V 证gtest 和你msvc 里面的Demo 建立我们的第8中,新建一文件路径b路径开msvc 里面升级,升完级果你升级为VS 现很郁闷,你程,结果我使S2008中编的测试工程都Debug 或是第一个Demo 一个Win32 C 面的工程文件级后,我们直S2008的工程你的Demo 使用VS2005编译,在VS2都使用VS20是Release 目o 了,假如之前Console Ap 件, 如果你在直接编译里面程,那么你的怎么也编不工程建Dem 005中同样可005工程。
)目录里看到编前使用的VSpplication。
在使用的是面的“gtest”的测试Dem 过,我也曾折mo,死活编不可以。
如果要编译出来的g S2008编译的接着就是设置VS2005或是工程,可以mo 最好也是折腾了好久不过。
(这里要编译VS20gtestd.lib 或的gtest,那置工程属性是以直接,当里有人005或是那么,,总3.Ru 如果前提工程int {}没错#inuntime Libr 果是Release 提是你之前编程设置后了后 Foo(int if (a == {thro }int c = if (c == retu return F 错,上面的函clude <gt rary 设置e 版本,Runt 编译的gtest 后,我们来编a, int b)= 0 || b =ow "don't a % b; = 0) urn b; Foo(b, c);函数是用来求test/gtest ime Library 也使用了同样编写一个最简单 == 0) do that"; 求最大公约数t.h> y 设为/MT。
当样是/MD 选单测试案例试 的。
下面我们当然,其实你选项。
试试,我们先们就来编写一你也可以选择动先来写一个被一个简单的测择动态链接(/M 被测试函数:测试案例。
MD),:TEST(FooTest, HandleNoneZeroInput){EXPECT_EQ(2, Foo(4, 10));EXPECT_EQ(6, Foo(30, 18));}上面可以看到,编写一个测试案例是多么的简单。
我们使用了TEST这个宏,它有两个参数,官方的对这两个参数的解释为:[TestCaseName,TestName],而我对这两个参数的定义是:[TestSuiteName,TestCaseName],在下一篇我们再来看为什么这样定义。
对检查点的检查,我们上面使用到了EXPECT_EQ这个宏,这个宏用来比较两个数字是否相等。
Google还包装了一系列EXPECT_* 和ASSERT_*的宏,而EXPECT系列和ASSERT 系列的区别是:1. EXPECT_* 失败时,案例继续往下执行。
2. ASSERT_* 失败时,直接在当前函数中返回,当前函数中ASSERT_*后面的语句将不会执行。
在下一篇,我们再来具体讨论这些断言宏。
为了让我们的案例运行起来,我们还需要在main 函数中添加如下代码:int _tmain(int argc, _TCHAR* argv[]){testing::InitGoogleTest(&argc, argv);return RUN_ALL_TESTS();}“testing::InitGoogleTest(&argc, argv);” :gtest的测试案例允许接收一系列的命令行参数,因此,我们将命令行参数传递给gtest,进行一些初始化操作。
gtest的命令行参数非常丰富,在后面我们也会详细了解到。
“RUN_ALL_TESTS()” :运行所有测试案例OK,一切就绪了,我们直接运行案例试试(一片绿色,非常爽):五、本篇用。
1 2数就 3 4优点 1 2案例 3 4系列总结篇内容确实是gtest 还有很1. 使用VS 编2. 设置测试工就行了))3. 使用TEST4. 在Main 函点:1. 我们的测试2. 编写测试案例的设计和编3. 提供了强大4. 提高了丰富列链接:是非常的初级很多更高级的编译gtest.li 工程的属性T 宏开始一个函数中初始化试案例本身就案例变的非常编写上。
大丰富的断言富的命令行参级,目的是让从的使用方法b 文件(头文件,l 个测试案例,化环境,再使就是一个ex 常简单(使用言的宏,用于参数对案例运从来没有接触,我们将会在ib 文件,/M ,使用EXPE 使用RUN_A xe 工程,编译用一些简单的于对各种不同运行进行一系触过gtest 的在后面讨论。
MT 参数(和CT_*,ASSER ALL_TEST()宏译之后可以直的宏如TEST 同检查点的检系列的设置。
的同学了解g 总结本篇的编译gtest 时R_*系列设置宏运行测试案直接运行,非),让我们将检查。
gtest 最基本的内容的话:时使用一样的置检查点。
案例。
非常的方便。
将更多精力花本的使 的参 花在1.玩转Google开源C++单元测试框架Google Test系列(gtest)之一 - 初识gtest2.玩转Google开源C++单元测试框架Google Test系列(gtest)之二 - 断言3.玩转Google开源C++单元测试框架Google Test系列(gtest)之三 - 事件机制4.玩转Google开源C++单元测试框架Google Test系列(gtest)之四 - 参数化5.玩转Google开源C++单元测试框架Google Test系列(gtest)之五 - 死亡测试6.玩转Google开源C++单元测试框架Google Test系列(gtest)之六 - 运行参数7.玩转Google开源C++单元测试框架Google Test系列(gtest)之七 - 深入解析gtest8.玩转Google开源C++单元测试框架Google Test系列(gtest)之八 - 打造自己的单元测试框架二、一、这篇类,1. A 2. E 二、// EXP //假如g:\e o A Exp 如果http <te " t 16Val A Exp </t断言前言篇文章主要总一类是ASS ASSERT_* 系XPECT_* 系示例int 型比较ECT_EQ(3,如你的Add(1myproject f: Add(1,Actual: 4 ected:3果是将结果输p:// stcase na <failu ype =""><!ue of: Ad Actual: 4ected: 3]]estcase >总结gtest 中SERT 系列,系列的断言,系列的断言,,预期值:3 Add(1, 21, 2) 结果为t\c++\gtes 2) 输出到xml 里/ame ="Demo"ure messag [CDATA[g:dd(1, 2) ]></failur 的所有断言相一类是EXP 当检查点失败当检查点失,实际值:A )) 为4的话,会tdemo\gte 里的话,将输/coderzh/a status ="ge ="Value \myprojec re > 相关的宏。
PECT 系列。
败时,退出当失败时,继续Add(1, 2)会在结果中输estdemo\gt 输出:(关于rchive/2009"run" time of: Add(1ct\c++\gte gtest 中,断一个直观的解当前函数(注往下执行。
输出:testdemo.c 于将结果输出为9/04/10/14e ="0" clas 1, 2) Ac estdemo\gt 断言的宏可以解释就是:注意:并非退cpp(16): e 为xml,见432789.htm ssname ="Ad tual: 4 Ex testdemo\g 以理解为分为退出当前案例error: Val :ml ) ddTest"> xpected: 3gtestdemo.为两)。
lu 3.cpp:如果你对自动输出的出错信息不满意的话,你还可以通过操作符<<将一些自定义的信息输出,通常,这对于调试或是对一些检查点的补充说明来说,非常有用!下面举个例子:如果不使用<<操作符自定义输出的话:for (int i = 0; i < x.size(); ++i){EXPECT_EQ(x[i], y[i]);}看到的结果将是这样的,你根本不知道出错时 i 等于几:g:\myproject\c++\gtestdemo\gtestdemo\gtestdemo.cpp(25): error: Value of: y[i]Actual: 4Expected: x[i]Which is: 3如果使用<<操作符将一些重要信息输出的话:for (int i = 0; i < x.size(); ++i){EXPECT_EQ(x[i], y[i]) << "Vectors x and y differ at index " << i; }从输出结果中就可以定位到在 i = 2 时出现了错误。