GTest单元测试

合集下载

gtest使用手册

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单元测试原理

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用例
gtest是一个用于C++的单元测试框架,它提供了许多有用的工具和宏,用于编写和执行测试用例。

在gtest中,一个测试用例通常包含以下几个部分:
1. 测试环境设置(SetUp):在每个测试用例执行前,设置一个特定的测试环境或状态。

这部分通常包含一些必要的全局初始化和配置,以确保测试能够正常运行。

2. 测试函数:这是实际进行测试的地方。

在此部分中,您会编写一些代码来检查您的代码是否按照预期工作。

这可能包括检查函数调用的结果是否符合预期,或者验证某些条件是否满足。

3. 测试环境清理(TearDown):在每个测试用例执行后,清理测试环境或状态。

这通常包括释放资源、关闭文件、撤销设置等操作,以确保不会对后续的测试造成影响。

gtest执行测试用例的顺序是:为每一个测试用例生成一个测试实例并执行。

每个测试实例先执行SetUp函数,然后执行测试函数,最后执行TearDown函数。

这个顺序是按照测试用例的定义顺序来执行的。

gtest还提供了一些高级特性,比如TEST_F宏可以定义一个测试夹具,用
来共享测试用例之间的数据。

如果多个测试用例都使用同一个测试夹具,那么测试用例的执行顺序就变成了测试夹具的SetUp函数、测试用例的SetUp函数、测试函数、测试用例的TearDown函数、测试夹具的TearDown函数。

深入理解gtestCC++单元测试经验谈

深入理解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)。

GoogleC++单元测试框架---Gtest框架简介(译文)

GoogleC++单元测试框架---Gtest框架简介(译文)

GoogleC++单元测试框架---Gtest框架简介(译⽂)⼀、设置⼀个新的测试项⽬在⽤google test写测试项⽬之前,需要先编译gtest到library库并将测试与其链接。

我们为⼀些流⾏的构建系统提供了构建⽂件: msvc/ for Visual Studio, xcode/ for Mac Xcode, make/ for GNU make, codegear/ for Borland C++ Builder.如果你的构建系统不在这个名单上,在googletest根⽬录有autotools的脚本(不推荐使⽤)和CMakeLists.txtCMake(推荐)。

你可以看看make / Makefile来了解如何编译Google Test(基本上你想在头⽂件中使⽤GTEST_ROOT和GTEST_ROOT / include来编译src / 路径,其中GTEST_ROOT是Google测试根⽬录)。

⼀旦你能够编译google test库,您应该为您的测试程序创建⼀个项⽬或构建⽬标。

Make sure you have GTEST_ROOT/include in the header search path so that the compiler can find "gtest/gtest.h" when compiling your test.把google test库加到你的测试项⽬中(⽐如:在VS 中在gtest.vcproj上添加依赖)。

⼆、基本概念当使⽤⾕歌测试,您⾸先要写断⾔,断⾔是检查条件是否为真的语句。

⼀个断⾔的结果可以是成功,⾮致命性失败,或致命的失败。

如果⼀个致命失败出现,它会终⽌当前的函数;否则程序继续正常运⾏。

测试使⽤断⾔验证代码的⾏为。

如果⼀个测试崩溃或者有⼀个失败的断⾔,那么失败;否则成功。

⼀个测试⽤例包含⼀个或多个测试。

您应该将测试分组为反映测试代码结构的测试⽤例。

gtest单元测试的简单示例

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();}。

Google单元测试框架gtest之官方sample笔记1--简单用例

Google单元测试框架gtest之官方sample笔记1--简单用例

Google单元测试框架gtest之官⽅sample笔记1--简单⽤例1.0 通⽤部分和常见的测试⼯具⼀样,gtest提供了单体测试常见的⼯具和组件。

⽐如判断各种类型的值相等,⼤于,⼩于等,管理多个测试的测试组如testsuit下辖testcase,为了⽅便处理初始化数据减少重复代码,提供了setup和teardown函数。

官⽅⽂档称:TEST has two parameters: the test case name and the test name. 第⼀个是case名称,第⼆个是test名称,这是google的名词称呼⽅法,其实就是⼀般意义上的testsuit和testcase,前者是组,后者是测试⽤例,为了⽅便测试管理,把⼏个相关的测试放到⼀起统称为⼀个测试组。

这是⼀个编程约定,但如果把不相⼲的测试放到⼀个test_case_name下,也不会报错,只是做测试总结和汇总的时候不⽅便⽽已。

# define TEST(test_case_name, test_name) GTEST_TEST(test_case_name, test_name)关于TEST宏,这是⼀个⼀层包⼀层的宏定义,虽然google编程规范说不建议⽤宏,但是gtest却⼤量的使⽤宏来创建类和函数,使⽤宏可以给⽤户更加简洁的接⼝,在效率上也有优势,但是读起来很晦涩。

⼀般的,在基础⼯具和底层API中,宏还是由⼴⼤的应⽤空间,因为这⼀部分基本上不怎么变化,那些写底层⼯具的⼤⽜们有能⼒驾驭这种反常规的写法。

使⽤宏来实现底层的重复性⼯作或者封装复杂的接⼝,在开源项⽬中是很常见的⽅式。

Sample #1 shows the basic steps of using googletest to test C++ functions.Sample #2 shows a more complex unit test for a class with multiple member functions.Sample #3 uses a test fixture.Sample #4 teaches you how to use googletest and googletest.h together to get the best of both libraries.Sample #5 puts shared testing logic in a base test fixture, and reuses it in derived fixtures.Sample #6 demonstrates type-parameterized tests.Sample #7 teaches the basics of value-parameterized tests.Sample #8 shows using Combine() in value-parameterized tests.Sample #9 shows use of the listener API to modify Google Test's console output and the use of its reflection API to inspect test results.Sample #10 shows use of the listener API to implement a primitive memory leak checker.1.1 sample1官⽅sample1有2个函数,阶乘函数int Factorial()和判断素数函数bool IsPrime(int n)。

gtest单元测试方法

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.运行测试:执行生成的可执行文件进行测试。

基于gtest进行单元测试

基于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框架原理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函数来使用它。

简单易懂的单元测试框架-gtest(二)

简单易懂的单元测试框架-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();}上述代码是一个简单的全局级事件模板,大部分时候我们都可以采用类似的结构在实际工程中添加单元测试程序。

GoogleC++单元测试框架(Gtest)系列教程之一——入门

GoogleC++单元测试框架(Gtest)系列教程之一——入门
Reference: by CoderZh
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单元测试

全局事件
要实现全局事件,必须写一个类,继承testing::Environment类,实 现里面的SetUp和TearDown方法。 1. SetUp()方法在所有案例执行前执行 2. TearDown()方法在所有案例执行后执行
TestSuite事件
需要实现一个类,继承testing::Test,然后实现两个静态方法 1. SetUpTestCase() 方法在第一个TestCase之前执行 2. TearDownTestCase() 方法在最后一个TestCase之后执行
如果程序正常退出并且退出码与exit_code相同则返回 true
Windows 下正规表达式风格: Simple风格:GTEST_USES_SIMPLE_RE=1(预处理处添加)
1.4 Googletest 环境搭建
搭建步骤: (1) 设置gtest头文件路径 (2) 设置gtest.lib路径
针对以上问题常用处理方法:
伪对象 接缝模型
2.2.1 伪对象
伪对象:指测试中用来替代单元测试环境中无法调用的对象。
图例: 在一个POS系统中Sale类,其中方法Scan()显示商品信息。
伪代码: class Sale { void scan() { ........... 调用设备SDK方法showLine(); ........... } }
(2)在待测试的类头文件中添加gtest头文件
(3)在待测试的类头文件中添加测试单元声明
此声明实质为待测试类添加友类,下图为gtest源码:
(4)实现测试案例实体和所需的事件机制
宏(TEST/TEST_F)源码分析:
(5)验证和查看单元测试结果
单元测试(Unit Testing)

GTEST单元测试框架的使用

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

• 单元测试代码: • 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用法

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)系列教程之二——断言、函数测试

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()的第⼀个参数即测试⽤例的名称,第⼆个参数为该测试⽤例中测试实例的名称。

gtest的统计规则

gtest的统计规则

gtest的统计规则
gtest是一个流行的C++测试框架,用于编写单元测试和集成测试。

在gtest中,测试结果有三种状态:成功、失败和禁用。

当测试失败时,gtest会输出错误信息和堆栈跟踪。

在gtest中,有一些统计规则可以帮助开发人员了解测试的整体情况。

1. 总测试数
总测试数表示执行的测试用例总数,包括成功、失败和禁用状态的测试用例。

这个统计数据可以帮助开发人员了解测试用例的数量。

2. 成功数
成功数表示成功的测试用例数量。

这个统计数据可以帮助开发人员了解测试用例的成功率。

3. 失败数
失败数表示失败的测试用例数量。

这个统计数据可以帮助开发人员了解测试用例的失败率。

4. 禁用数
禁用数表示禁用的测试用例数量。

这个统计数据可以帮助开发人员了解测试用例的禁用率。

5. 忽略数
忽略数表示由于某些原因而被忽略的测试用例数量。

这个统计数据可以帮助开发人员了解测试用例的忽略率。

6. 运行时间
运行时间表示所有测试用例的执行时间总和。

这个统计数据可以
帮助开发人员了解测试用例的执行效率。

通过了解这些统计规则,开发人员可以更好地了解测试的整体情况,以便于进行优化和改进。

gtest框架原理

gtest框架原理

gtest框架原理GTest(Google Test)是一个C++的单元测试框架,它被广泛用于测试C++代码的正确性和性能。

GTest框架的原理主要涉及到测试用例的编写、断言的使用、运行时环境的设置和结果输出等几个方面。

以下是关于GTest框架原理的相关参考内容。

1. 测试用例的编写:GTest框架基于测试用例(Test Case)的概念,每个测试用例通常用一个函数来表示。

为了编写测试用例,需要使用特定的宏来定义测试函数。

例如:```TEST(TestSuiteName, TestCaseName) {// 每个测试用例的代码逻辑}```其中,`TestSuiteName`是测试套件的名称,可以将相关测试用例分组。

`TestCaseName`是测试用例的名称。

在编写测试用例的时候,可以使用GTest框架提供的断言(ASSERT)来进行测试结果的判断,例如:```TEST(FactorialTest, HandlesZeroInput) {EXPECT_EQ(1, Factorial(0));}```这个测试用例用来测试阶乘函数对输入为0的情况下是否返回1。

2. 断言的使用:在GTest框架中,断言(Assertion)用于判断测试结果是否符合预期。

GTest提供了多种断言宏,常用的有`EXPECT_EQ(expected, actual)`、`EXPECT_TRUE(condition)`、`EXPECT_THROW(statement, exception_type)`等。

具体的断言宏可以根据需要选择使用。

在运行测试用例时,如果断言失败,框架会输出详细的错误信息。

例如:```TEST(AdditionTest, AddsTwoNumbers) {int result = Add(2, 3);EXPECT_EQ(5, result);}```这个测试用例用来测试相加函数的功能。

使用`EXPECT_EQ`断言来判断函数的返回值是否等于预期结果。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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.
Googletest是Googletest针对C++测试的开源项目,跨 平台(Linux, Mac OS X, Windows, Cygwin, Windows CE, and Symbian)。
基于xUnit框架,有丰富的断言,自定义断言,事件机 制,death 测试,参数化测试,XML测试报告等。
EXPECT_DEATH(statement, regex); 1. statement是被测试的代码语句 2. regex是一个正则表达式,用来匹
配异常时在stderr中输出的内容
VS2008下简单实现示例
EXPECT_EXIT(statement, predicate, regex) 1. statement是被测试的代码语句 2. predicate 在这里必须是一个委托,接收int型参数,并返回bool。
1.3.2 事件机制
Gtest事件机制分类:
全局:发生在所有案例执行前后 TestSuite:案例中所有案例执行前后 TestCase: 单个案例前后
全局事件
要实现全局事件,必须写一个类,继承testing::Environment类,实 现里面的SetUp和TearDown方法。 1. SetUp()方法在所有案例执行前执行 2. TearDown()方法在所有案例执行后执行
1.3.4 运行参数?
在运行Gtest时,Gtest提供了一系列的参数可以使我们 对案例的执行进行有效的控制。
Gtest工程产生exe文件图
运行输出案例表参数图示
参数列表
测试案例集合参数
测试案例输出参数
测试案例异常处理参数
1.3.5 death测试
在测试过程中,对于可能导致程序崩溃的输入,我们可 以检查程序是否按预期的方式崩溃,验证崩溃结果。
TestSuite事件
需要实现一个类,继承testing::Test,然后实现两个静态方法 1. SetUpTestCase() 方法在第一个TestCase之前执行 2. TearDownTestCase() 方法在最后一个TestCase之后执行
TestCase事件
TestCase事件发生在每个TestCase执行前后 1. SetUp()方法在每个TestCase执行前执行 2. TearDown()方法在每个TestCase执行后执行
Googletest框架和单元测试
杭➢ Googletest 框架 ➢ 单元测试(Unit Testing)
Googletest 框架
Googletest 背景 Googletest 特性 Googletest 环境搭建 Googletest 使用
1.1 Googletest 背景
1.3.3 参数化测试
当被测函数需要传入不同的值时,可以考虑Gtest提供 的参数化测试功能。
使用说明:
INSTANTIATE_TEST_CASE_P(param1,param2,param3) param1:任意取; param2:测试案例的名称; param3:参数生成器 (eg:testing::Values());
1.3 Googletest 特性
断 言 事件机制 参数化测试 运行参数 death测试
1.3.1 断 言
断言宏分类: (1) ASSERT_*系列:检查点失败时,推出当前函数 (2) EXPECT_*系列:检查点失败时,继续往下执行
布尔值检查
数值型检查
字符串检查 浮点型检查
当断言检查出错时输出的信息并不能很好的帮助你还原当时出错的状况时, 可以使用“<<” 操作符输出指定内容帮助分析出错原因。
注意事项: 1. 不要在死亡测试里释放内存。 2. 在父进程里再次释放内存。 3. 不要在程序中使用内存堆检查。
环境要求:Linux, Windows (requires MSVC 8.0 or above), Cygwin, and Mac (the latter three are supported since v1.3.0).
2.1 Unit Testing
• 单元测试:简单的讲独立的测试每一个函数
• 良好单元测试的品质: ( 1 ) 运行速度快(<0.1s); ( 2 ) 定位问题所在
• 以下测试不是单元测试: ( 1 ) 与数据库有交互 ; ( 2 ) 进行了网络通信; ( 3 ) 调用了文件系统; ( 4 ) 需要对环境做特定的准备和配置;
只有当返回值为true时,死亡测试案例才算通过。
VS2008下简单实现示例
如果程序正常退出并且退出码与exit_code相同则返回 true
Windows 下正规表达式风格: Simple风格:GTEST_USES_SIMPLE_RE=1(预处理处添加)
1.4 Googletest 环境搭建
搭建步骤: (1) 设置gtest头文件路径 (2) 设置gtest.lib路径
(2)在待测试的类头文件中添加gtest头文件
(3)在待测试的类头文件中添加测试单元声明
此声明实质为待测试类添加友类,下图为gtest源码:
(4)实现测试案例实体和所需的事件机制
宏(TEST/TEST_F)源码分析:
(5)验证和查看单元测试结果
单元测试(Unit Testing)
Unit Testing 单元测试实例分析
相关文档
最新文档