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?GTest是一个C++的测试框架,它用于编写单元测试。
GTest是Google的一个开源项目,它提供了一组丰富的API来编写测试用例。
GTest具有简单易用的语法和强大的功能,被广泛应用于C++软件开发中的单元测试环节。
GTest的安装和设置首先,我们需要下载并构建GTest的测试框架。
在Linux和Mac系统上,可以通过源码编译来安装GTest。
首先,从GTest的官方GitHub 页面下载最新版本的源代码压缩包,并解压到本地目录。
然后,打开终端,并进入解压得到的文件夹。
在命令行中运行以下命令:cd googletest-mastermkdir buildcd buildcmake ..make这将会在当前目录下生成一个可执行文件夹。
现在,我们需要将GTest 的头文件和库文件链接到我们的项目中。
将生成的libgtest.a和libgtest_main.a文件复制到一个全局位置,使得它们可以被其他项目引用。
我们还需要将gtest文件夹中的include文件夹复制到/usr/local/include 路径下。
GTest的基本概念在使用GTest编写测试用例之前,我们需要了解一些基本概念。
首先是测试夹具(Test Fixture),它是用于对一组测试用例进行初始化和清理操作的对象。
测试夹具可以派生自testing::Test类。
其次是测试用例(Test Case),一个测试用例通常包括测试夹具的设置、测试函数的调用以及对测试函数的断言。
最后是断言(Assertion),用于判断测试结果与预期结果是否相等。
GTest的用法示例让我们以一个简单的示例来说明GTest的用法。
假设我们要编写一个函数,用于判断一个给定的整数是否为质数。
我们可以创建一个名为PrimeNumber的测试夹具,并在其中定义一个名为IsPrime的静态函数。
然后,我们可以在测试用例中对这个函数进行测试。
googletest测试框架使用教程
目录
1 在 VS2008 中使用 GOOGLETEST ..........................................................................................................2
2.3 参数化 ............................................................................................................................................ 14 2.3.1 值参数化 ................................................................................................................................... 14 2.3.2 类型参数化 ............................................................................................................................... 17
1.2.1 目录说明 ..................................................................................................................................... 2 1.2.2 编译 ............................................................................................................................................. 3 1.2.3 注意 ............................................................................................................................................. 3 1.3 第一个 DEMO .................................................................................................................................... 4 1.3.1 第一步:创建工程 ..................................................................................................................... 4 1.3.2 第二步:配置项目属性 ............................................................................................................. 5 1.3.3 第三步:编写单元测试案例 ..................................................................................................... 6
gtest使用
1.在vs中创建新项目
2.选择空项目
3
4.上面三步是在VS创建项目和文件5.以下是做VS和GTEST集成设置6.引用GTEST的头文件
7
8引用GTEST的库文件
8,自动测试的核心是断言,gtest提供的最基本断言:比较数值:
EXPECT_EQ(预期的值,实际值):比较相等的
EXPECT_LT(var1,var2):比较大小的 var1 < var2 EXPECT_TRUE(condition); 是判断条件为真。
EXPECT_STREQ()比较字符串内容
布尔断言:
Assert断言和expect断言的区别在于
Assert断言碰到错误会从当前函数返回,而expect断言会继续执行
数值数据比较断言:
字符串比较断言:
9,参数化:针对不同的用例输入,设置参数化
步骤:
a. class IsPrimeParamTest1 : public::testing::TestWithParam<int> //第一步:声明类,类名(是我们定义的),TestWithParam<int> int型与被测试函数一致
{
b. TEST_P(IsPrimeParamTest1, 参数化)// 第二步,拷贝test_p(第一参数和类名一致的,自定义)
{
int n = GetParam(); //参数化
EXPECT(n); //采用各种断言引用参数N
}
t
C. INSTANTIATE_TEST_CASE_P(returnture, test, testing::Values(var1,var2,var3….));//第三步,定义参数值,其实是用例输入。
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使用说明材料
玩转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使用手册
玩转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.03、编译下载解压后,里面有个msvc目录:使用VS的同学可以直接打开msvc里面的工程文件,如果你在使用的是VS2005或是VS2008,打开后会提示你升级,升完级后,我们直接编译里面的“gtest”工程,可以直接编过的。
这里要提醒一下的是,如果你升级为VS2008的工程,那么你的测试Demo最好也是VS2008工程,不然你会发现很郁闷,你的Demo怎么也编不过,我也曾折腾了好久,当时我升级为了VS2008工程,结果我使用VS2005工程建Demo,死活编不过。
gtest使用说明
gtest使用说明gtest-1.6为google的测试框架。
可用于本组的单元测试。
安装步骤如下:1、取http://10.78.13.228/svn/otnm2000svn/Develop/Src/ext/gtest目录下全部数据,本地默认目录为D:\OTNM\src\ext\gtest。
2、Gtest的目录结构:D:\OTNM\src\ext\gtest\include为头文件,使用gtest.h即可。
D:\OTNM\src\ext\gtest\lib\msvc为lib库,使用gtestd.lib即可,这个lib为debug版本。
3、如有兴趣研究gtest,可以编译D:\OTNM\src\ext\gtest\msvc\gtest.sln下面的工程。
其中gest工程用于生成gtest.lib库。
gtest_unittest工程是一个例子。
4、取gtest的测试Demo:http://10.78.13.228/svn/otnm2000svn/Develop/Src/test/gtestdem o。
本地默认目录为D:\OTNM\src\test\gtestdemo。
打开gtestdemo工程。
并编译。
可以查看测试结果。
工程中使用了D:\OTNM\src\ext\gtest\samples下的测试用例。
你可以自行添加后,测试。
5、网上相关资料:编写优美的GTest测试案例Google C++ Mocking Framework使用简介/%B3%A3%D1%C5%C3%F4/blog/item/ec5a04187796 fb62dab4bdd1.html。
6、自己建立gtest测试工程文件时,需要注意以下几个设置:Gtest的include目录设置:Gtest的lib目录设置:。
gtest 使用方法
gtest 使用方法
GTest 是一个功能强大的 C++ 测试框架,以下是其使用方法:
1. 安装 GTest:首先需要下载并安装 GTest,可以从 GTest 官网或其他镜像站点下载编译好的二进制文件或源代码,然后按照说明进行安装。
2. 创建测试工程:在开发环境中创建一个新的项目或工作空间,用于编写和运行测试代码。
3. 编写测试代码:在测试工程中创建一个新的 C++ 源文件,并编写测试代码。
测试代码应该包含测试用例,每个测试用例是一个独立的函数,用于测试特定的功能或行为。
可以使用 GTest 提供的数据驱动框架和参数化测试框架来编写更加灵活和可维护的测试代码。
4. 配置测试环境:在测试工程中设置环境变量,指定 GTest 二进制文件的路径和其他相关配置。
5. 编译测试代码:使用编译器将测试代码编译成可执行文件。
6. 运行测试:执行可执行文件,查看测试结果。
可以使用命令行参数来控制测试的运行方式和输出格式。
7. 分析测试结果:根据测试结果判断代码是否符合预期,如果有问题需要进行调试和修复。
以上是 GTest 的基本使用方法,具体操作可能会因开发环境和项目需求而有所不同。
建议参考 GTest 的官方文档和示例代码,了解更多关于 GTest 的使用方法和最佳实践。
gtest insequence的使用方法 -回复
gtest insequence的使用方法-回复gtest是谷歌的一个开源测试框架,它能够帮助开发者编写和运行C++的单元测试。
其中,gtest提供了一个特性叫做"insequence",这个特性允许开发者按照特定的顺序执行测试用例,而不是按照默认的随机顺序执行。
在本文中,我将一步一步地解释在gtest中如何使用"insequence"特性。
第一步:安装和配置gtest首先,我们需要将gtest框架安装在我们的项目中。
你可以从谷歌的官方github页面上下载gtest的源代码,并按照其中的说明进行安装。
安装完成后,你需要在你的项目中配置gtest,以确保它能够被正确地链接和执行。
第二步:编写测试用例函数接下来,我们需要编写一些测试用例函数。
每个测试用例函数都是一个独立的函数,用于测试代码的一部分。
在gtest中,每个测试用例函数都是由宏TEST()定义的。
例如:TEST(TestCaseName, TestName) {... test body ...}其中,"TestCaseName"是一个字符串,用于描述测试用例的名称,而"TestName"则是用于描述当前测试用例函数的名称。
第三步:使用"insequence"特性使用"insequence"特性来指定测试用例执行的顺序非常简单。
你只需要在需要指定顺序的测试用例函数前面添加一个注释,如下所示:TEST(TestCaseName, TestName) {这是第一个测试用例函数}TEST(TestCaseName, TestName2) {这是第二个测试用例函数}当你指定了测试用例函数的顺序后,gtest就会按照你的指定顺序来执行这些测试用例函数。
第四步:运行测试当你完成了所有测试用例函数的编写,并且使用"insequence"特性指定了它们的顺序后,你可以使用gtest提供的命令行工具来运行测试。
gtest deletearg的使用方式
gtest deletearg的使用方式在谷歌测试框架(Google Test)中,gtest_deletearg是一个用于删除参数的宏,它可以在运行测试用例时忽略指定的参数。
本文将详细介绍gtest_deletearg的使用方式。
gtest_deletearg宏的语法如下:```cppGTEST_DELETE_ARG(TestSuiteName, TestName, ArgName)```其中,TestSuiteName是测试套件的名称,TestName是测试用例的名称,ArgName是要删除的参数的名称。
gtest_deletearg宏用于在运行测试用例时删除指定的参数。
在使用这个宏之前,需要确保谷歌测试框架已经正确地安装在开发环境中。
要使用gtest_deletearg宏,需要按照以下步骤进行:1.创建测试套件和测试用例首先,需要创建一个测试套件和一个或多个测试用例。
测试套件用于组织相关的测试用例,测试用例用于定义具体的测试逻辑。
```cpp#include "gtest/gtest.h"//测试套件class MyTestSuite : public ::testing::Test {protected://在测试用例执行前的初始化操作void SetUp() override {//初始化代码}//在测试用例执行后的清理操作void TearDown() override {//清理代码}};//测试用例TEST_F(MyTestSuite, MyTestCase) {//测试代码}```2.使用gtest_deletearg宏删除参数在测试用例中,可以使用gtest_deletearg宏删除指定的参数。
根据测试用例的具体需求,可以选择是否删除参数。
```cppTEST_F(MyTestSuite, MyTestCase) {//删除参数GTEST_DELETE_ARG(MyTestSuite, MyTestCase, ArgName);//测试代码}```以上代码将删除MyTestCase测试用例中的ArgName参数。
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 时,可以通过命令行参数来控制测试的执行方式和输出。
以下是一些常用的gtest 命令行参数:--gtest_filter=POSTIVE_PATTERNS[-NEGATIVE_PATTERNS]:只运行与POSITIVE_PATTERNS 匹配但与NEGATIVE_PATTERNS 不匹配的测试。
例如,--gtest_filter=*:-DisabledTests 将运行除了DisabledTests 之外的所有测试。
--gtest_also_run_disabled_tests:运行所有测试,包括被标记为DISABLED 的测试。
--gtest_repeat=N:重复运行所有测试N 次。
--gtest_break_on_failure:在第一个失败的测试中暂停。
这在调试时非常有用。
--gtest_catch_exceptions=0:禁用gtest 对C++ 异常的捕获。
默认情况下,gtest 会捕获并报告未捕获的异常。
--gtest_output=xml[:DIRECTORY_PATH/|:FILE_PATH]:生成XML 格式的测试结果输出。
如果指定了DIRECTORY_PATH,gtest 将在该目录下为每个测试套件创建一个XML 文件。
如果指定了FILE_PATH,gtest 会将所有测试结果写入一个XML 文件。
--gtest_list_tests:列出所有测试的名称,而不实际运行它们。
--gtest_print_time:在测试结果中显示每个测试的运行时间。
--gtest_throw_on_failure:当测试失败时,抛出一个异常而不是返回失败状态码。
--gtest_shuffle:随机运行测试用例的顺序。
这有助于发现潜在的测试间依赖关系。
--gtest_shuffle_seed=NUMBER:设置随机种子,以便在多次运行之间重现随机化的测试用例顺序。
gtest类方法
gtest类方法gtest是Google Test的简称,它是一个C++的单元测试框架。
它由google公司开发,用于测试C++应用程序的正确性。
gtest提供了一个全面的测试框架,包括断言、测试套件和测试用例,可以很容易地写出可维护和易读的测试代码。
1.TEST宏:TEST宏用于定义一个测试用例,它接受两个参数,第一个参数是测试用例名称,第二个参数是测试用例中的测试点名称。
在测试用例中,可以使用gtest提供的各种断言函数来验证代码逻辑的正确性。
例如:TEST(MyTestCase, MyTestPoint)//测试点代码ASSERT_EQ(2+2,4);2.TEST_F宏:TEST_F宏与TEST宏类似,不同之处在于它可以使用测试夹具(Fixture)。
测试夹具是为了简化测试代码而引入的概念,它可以在测试用例执行前进行一些初始化操作,在测试用例执行后进行一些清理操作。
测试夹具可以帮助我们在不同的测试用例中复用一些代码逻辑。
例如:class MyTestFixture : public ::testing::Testprotected://测试用例执行前的初始化操作void SetUp( override//初始化操作}//测试用例执行后的清理操作void TearDown( override//清理操作}};TEST_F(MyTestFixture, MyTestPoint)//测试点代码ASSERT_EQ(2+2,4);3.TEST_P宏:TEST_P宏用于定义一个测试用例生成器,它可以根据参数化生成多个测试用例。
测试用例生成器接受两个参数,第一个参数是测试用例的参数化名称,第二个参数是测试用例中的参数名称。
测试用例生成器需要结合INSTANTIATE_TEST_CASE_P宏来使用。
例如:class MyTestFixture : public ::testing::TestWithParam<int> };TEST_P(MyTestFixture, MyTestPoint)int value = GetParam(;//测试点代码ASSERT_EQ(value + value, value * 2);INSTANTIATE_TEST_CASE_P(MyTestValues,MyTestFixture, ::testing::Values(1, 2, 3));4.TEST_SUITE宏:TEST_SUITE宏用于定义一个测试套件,它接受一个参数,用于定义测试套件的名称。
gTestsMulti软件文档说明书
Package‘gTestsMulti’August22,2023Type PackageTitle New Graph-Based Multi-Sample TestsVersion0.1.1Suggests ade4Description New multi-sample tests for testing whether multiple samples are from the same distribu-tion.They work well particularly for high-dimensional data.Song,H.and Chen,H.(2022)<arXiv:2205.13787>.Author Hoseung Song[aut,cre],Hao Chen[aut]Maintainer Hoseung Song<******************>License GPL(>=2)Imports Matrix,MASSEncoding UTF-8NeedsCompilation noRepository CRANDate/Publication2023-08-2220:40:07UTCR topics documented:gTestsMulti (2)gtestsmulti (3)Index512gTestsMulti gTestsMulti New graph-based multi-sample testsDescriptionThis package can be used to determine whether multiple samples are from the same distribution.Author(s)Hoseung Song and Hao ChenMaintainer:Hoseung Song(******************)ReferencesSong,H.and Chen,H.(2022).New graph-based multi-sample tests for high-dimensional and non-Euclidean data.arXiv:2205.13787See AlsogtestsmultiExamples##Mean difference in Gaussian distribution.d=50mu=0.2sam=50set.seed(500)X1=matrix(rnorm(d*sam),sam)X2=matrix(rnorm(d*sam,mu),sam)X3=matrix(rnorm(d*sam,2*mu),sam)data_list=list(X1,X2,X3)#We use mstree in ade4 package to construct the minimum spanning tree.require(ade4)x=rbind(X1,X2,X3)E=mstree(dist(x))a=gtestsmulti(E,data_list,perm=1000)#output results based on the permutation and the asymptotic results#the test statistic values can be found in a$teststat#p-values can be found in a$pvalgtestsmulti New graph-based multi-sample testsDescriptionThis function provides graph-based multi-sample tests.Usagegtestsmulti(E,data_list,perm=0)ArgumentsE The edge matrix for the similarity graph.Each row contains the node indices ofan edge.data_list The list of multivariate matrices corresponding to the K different classes.The length of the list is K.Each element of the list is a matrix containing observationsas the rows and features as the columns.perm The number of permutations performed to calculate the p-value of the test.The default value is0,which means the permutation is not performed and only ap-proximated p-value based on the asymptotic theory is provided.Doing permu-tation could be time consuming,so be cautious if you want to set this value tobe larger than10,000.ValueReturns a list teststat with each test statistic value and a list pval with p-values of the tests.See below for more details.S The value of the test statistic S.S_A The value of the test statistic S A.S_appr The approximated p-value of S based on asymptotic theory with a Bonferroni procedure.S_A_appr The approximated p-value of S A based on asymptotic theory.S_perm The permutation p-value of S when argument‘perm’is positive.S_A_perm The permutation p-value of S A when argument‘perm’is positive.See AlsogTestsMulti-packageExamples##Mean difference in Gaussian distribution.d=50mu=0.2sam=50set.seed(500)X1=matrix(rnorm(d*sam),sam)X2=matrix(rnorm(d*sam,mu),sam)X3=matrix(rnorm(d*sam,2*mu),sam)data_list=list(X1,X2,X3)#We use mstree in ade4 package to construct the minimum spanning tree.require(ade4)x=rbind(X1,X2,X3)E=mstree(dist(x))a=gtestsmulti(E,data_list,perm=1000)#output results based on the permutation and the asymptotic results#the test statistic values can be found in a$teststat#p-values can be found in a$pvalIndexgTestsMulti,2gtestsmulti,2,3gTestsMulti-package(gTestsMulti),25。
gtest使用
1.在vs中创建新项目
2.选择空项目
3
4.上面三步是在VS创建项目和文件5.以下是做VS和GTEST集成设置6.引用GTEST的头文件
7
8引用GTEST的库文件
8,自动测试的核心是断言,gtest提供的最基本断言:比较数值:
EXPECT_EQ(预期的值,实际值):比较相等的
EXPECT_LT(var1,var2):比较大小的 var1 < var2 EXPECT_TRUE(condition); 是判断条件为真。
EXPECT_STREQ()比较字符串内容
布尔断言:
Assert断言和expect断言的区别在于
Assert断言碰到错误会从当前函数返回,而expect断言会继续执行
数值数据比较断言:
字符串比较断言:
9,参数化:针对不同的用例输入,设置参数化
步骤:
a. class IsPrimeParamTest1 : public::testing::TestWithParam<int> //第一步:声明类,类名(是我们定义的),TestWithParam<int> int型与被测试函数一致
{
b. TEST_P(IsPrimeParamTest1, 参数化)// 第二步,拷贝test_p(第一参数和类名一致的,自定义)
{
int n = GetParam(); //参数化
EXPECT(n); //采用各种断言引用参数N
}
t
C. INSTANTIATE_TEST_CASE_P(returnture, test, testing::Values(var1,var2,var3….));//第三步,定义参数值,其实是用例输入。
Linux上使用gtest
Linux上使⽤gtest
本⽂⽬的
本⽂讲解了如何在linux上配置gtest编写⾃⼰的测试⽤例。
步骤如下
1 下载gtest,点击。
2 将gtest.zip上传到linux上的摸个⽬录
3 cd到这个⽬录
4 解压zip⽂件(命令 “unzip gtest.zip”),会得到gtest-1.X.X的⽬录,⼀下将该⽬录简称为GTEST_HOME。
5 输⼊如下命令,编译gtest:
# cd GTEST_HOME/make
# make
截图如下
会发现多了⼀些⽂件,我们主要关注gtest_main.a和sample1_unittest这两个⽂件,前者设gtest的静态库,后者是⽰例⽂件。
6 验证是否编译成功,输⼊如下命令
# ./sample1_unittest
7 由于gtest_main.a命令不符合libXXX.a的格式,所以可以做⼀个软连接(相当于为gtest_main.a起⼀个别名),键⼊如下命令# ln –s gtest_main.a libgtest.a
# ll
截图如下
8 编写⾃⼰的gtest⽤例,键⼊如下命令
# mkdir ../../gtest_demo
# cd ../../gtest_demo
# vi Makefile
(Makefile的内容在附件中)
# vi gtest_demo.cpp
(gtest_demo.cpp的内容在附件中)
9 输⼊命令
# make
# ./gtest_demo
出现如下结果,恭喜你,配置成功。
具体如何配置,看看makefile就清除了。
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 简介2.GTest 参数分类3.常用GTest 参数介绍4.GTest 参数的使用方法5.总结正文:1.GTest 简介GTest 是Google 推出的一款开源测试框架,主要用于编写C++单元测试。
GTest 提供了丰富的功能,如自动发现测试、自动执行测试、收集覆盖率信息等,大大简化了C++单元测试的编写和执行过程。
2.GTest 参数分类GTest 参数主要分为以下几类:(1)环境相关参数:这类参数主要用于设置测试环境的一些属性,如输出目录、测试日志等。
(2)测试套件参数:这类参数主要用于配置测试套件的运行方式,如运行所有测试、运行指定测试等。
(3)测试案例参数:这类参数主要用于设置测试案例的一些属性,如测试重复次数、测试执行顺序等。
3.常用GTest 参数介绍(1)--gtest_output_directory:设置测试结果输出目录。
例如:“--gtest_output_directory=test_result”。
(2)--gtest_log_dir:设置测试日志输出目录。
例如:“--gtest_log_dir=test_log”。
(3)--gtest_run_test_壳:设置是否运行包含在test_壳中的测试。
例如:“--gtest_run_test_壳=true”。
(4)--gtest_test_壳_模式:设置test_壳中测试的运行模式。
例如:“--gtest_test_壳_模式=test_name.test”。
(5)--gtest_repeat_test_壳:设置测试重复次数。
例如:“--gtest_repeat_test_壳=3”。
(6)--gtest_shuffle_test_壳:设置是否随机排列测试执行顺序。
例如:“--gtest_shuffle_test_壳=true”。
4.GTest 参数的使用方法在使用GTest 参数时,需要在命令行中指定。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
玩转Google开源C++单元测试框架GoogleTest系列(gtest)(总)前段时间学习和了解了下Google的开源C++单元测试框架Google Test,简称gtest,非常的不错。
我们原来使用的是自己实现的一套单元测试框架,在使用过程中,发现越来越多使用不便之处,而这样不便之处,gtest恰恰很好的解决了。
其实gtest本身的实现并不复杂,我们完全可以模仿gtest,不断的完善我们的测试框架,但最后我们还是决定使用gtest取代掉原来的自己的测试框架,原因是:1.不断完善我们的测试框架之后就会发觉相当于把gtest重新做了一遍,虽然轮子造的很爽,但是不是必要的。
2.使用gtest可以免去维护测试框架的麻烦,让我们有更多精力投入到案例设计上。
提高了非常完善的功能,并且简单易用,极大的提高了编写测试案例的效率。
如果想对gtest内部探个究竟,就把它的代码下载下来研究吧,这就是开源的好处,哈!官方已经有如此完备的文档了,为什么我还要写呢一方面是自己记记笔记,好记性不如烂笔头,以后自己想查查一些用法也可以直接在这里查到,一方面是对于不想去看一大堆英文文档的朋友,在我这里可以快速的找到gtest相关的内容。
一、初识gtest1、前言本篇将介绍一些gtest的基本使用,包括下载,安装,编译,建立我们第一个测试Demo工程,以及编写一个最简单的测试案例。
2、下载3、如果不记得网址,直接在google里搜gtest,第一个就是。
目前gtest的最新版本为编译下载解压后,里面有个msvc目录:使用VS的同学可以直接打开msvc里面的工程文件,如果你在使用的是VS2005或是VS2008,打开后会提示你升级,升完级后,我们直接编译里面的“gtest”工程,可以直接编过的。
这里要提醒一下的是,如果你升级为VS2008的工程,那么你的测试Demo最好也是VS2008工程,不然你会发现很郁闷,你的Demo怎么也编不过,我也曾折腾了好久,当时我升级为了VS2008工程,结果我使用VS2005工程建Demo,死活编不过。
(这里有人误解了,并不是说只能在VS2008中编译,在VS2005中同样可以。
如果要编译VS2005版本,最好保证gtest 和你的测试工程都使用VS2005工程。
)编译之后,在msvc里面的Debug或是Release目录里看到编译出来的或是文件。
4、第一个Demo下面我们开始建立我们的第一个Demo了,假如之前使用的VS2008编译的gtest,那么,我们在VS2008中,新建一个Win32 Console Application。
接着就是设置工程属性,总结如下:1.设置gtest头文件路径2.设置路径Library设置如果是Release版本,Runtime Library设为/MT。
当然,其实你也可以选择动态链接(/MD),前提是你之前编译的gtest也使用了同样是/MD选项。
工程设置后了后,我们来编写一个最简单测试案例试试,我们先来写一个被测试函数:int Foo(int a, int b){ if (a == 0 || b == 0){ throw "don't do that";} int c = a % b; if (c == 0) return b; return Foo(b, c);}没错,上面的函数是用来求最大公约数的。
下面我们就来编写一个简单的测试案例。
#include <gtest/>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,一切就绪了,我们直接运行案例试试(一片绿色,非常爽):5、总结本篇内容确实是非常的初级,目的是让从来没有接触过gtest的同学了解gtest最基本的使用。
gtest还有很多更高级的使用方法,我们将会在后面讨论。
总结本篇的内容的话:1. 使用VS编译文件2. 设置测试工程的属性(头文件,lib文件,/MT参数(和编译gtest时使用一样的参数就行了))3. 使用TEST宏开始一个测试案例,使用EXPECT_*,ASSER_*系列设置检查点。
4. 在Main函数中初始化环境,再使用RUN_ALL_TEST()宏运行测试案例。
优点:1. 我们的测试案例本身就是一个exe工程,编译之后可以直接运行,非常的方便。
2. 编写测试案例变的非常简单(使用一些简单的宏如TEST),让我们将更多精力花在案例的设计和编写上。
3. 提供了强大丰富的断言的宏,用于对各种不同检查点的检查。
4. 提高了丰富的命令行参数对案例运行进行一系列的设置。
二、断言1、前言这篇文章主要总结gtest中的所有断言相关的宏。
gtest中,断言的宏可以理解为分为两类,一类是ASSERT系列,一类是EXPECT系列。
一个直观的解释就是:1. ASSERT_* 系列的断言,当检查点失败时,退出当前函数(注意:并非退出当前案例)。
2. EXPECT_* 系列的断言,当检查点失败时,继续往下执行。
2、示例3、4、5、6、.......Google人说了,他们只提供<=5个参数的,如果需要测试更多的参数,直接告诉他们。
下面看看这个东西怎么用。
bool MutuallyPrime(int m, int n){ return Foo(m , n) > 1;}TEST(PredicateAssertionTest, Demo){ int m = 5, n = 6;EXPECT_PRED2(MutuallyPrime, m, n);}当失败时,返回错误信息:error: MutuallyPrime(m, n) evaluates to false, wherem evaluates to 5n evaluates to 6如果对这样的输出不满意的话,还可以自定义输出格式,通过如下:Fatal assertion Nonfatal assertion Verifies ASSERT_PRED_FORMAT1(pred_format1, val1);`EXPECT_PRED_FORMAT1(pred_format1, val1);pred_format1(val1) is successful ASSERT_PRED_FORMAT2(pred_format2, val1, val2);EXPECT_PRED_FORMAT2(pred_format2, val1, val2);pred_format2(val1, val2) issuccessful ......用法示例:testing::AssertionResult AssertFoo(const char* m_expr, const char* n_expr, const char* k_expr, int m, int n, int k) { if (Foo(m, n) == k) return testing::AssertionSuccess();testing::Message msg;msg << m_expr << " 和" << n_expr << " 的最大公约数应该是:" << Foo(m, n) << " 而不是:" << k_expr; return testing::AssertionFailure(msg);}TEST(AssertFooTest, HandleFail){EXPECT_PRED_FORMAT3(AssertFoo, 3, 6, 2);}失败时,输出信息:error: 3 和6 的最大公约数应该是:3 而不是:2是不是更温馨呢,呵呵。
7、浮点型检查Fatal assertion Nonfatal assertion VerifiesASSERT_FLOAT_EQ(expected, actual);EXPECT_FLOAT_EQ(expected, actual);the two float values are almost equalASSERT_DOUBLE_EQ(expected, actual);EXPECT_DOUBLE_EQ(expected,actual);the two doublevalues arealmost equal对相近的两个数比较:Fatal assertion Nonfatal assertion VerifiesASSERT_NEAR(val1, val2, abs_error);EXPECT_NEAR(val1, val2,abs_error);the difference between val1 andval2 doesn't exceed the givenabsolute error同时,还可以使用:EXPECT_PRED_FORMAT2(testing::FloatLE, val1, val2);EXPECT_PRED_FORMAT2(testing::DoubleLE, val1, val2);8、Windows HRESULT assertionsFatal assertion Nonfatal assertion VerifiesASSERT_HRESULT_SUCCEEDED(expression);EXPECT_HRESULT_SUCCEEDED(expression);expression is asuccess HRESULT ASSERT_HRESULT_FAILED(expression);EXPECT_HRESULT_FAILED(expression);expression is afailure HRESULT例如:CComPtr shell;ASSERT_HRESULT_SUCCEEDED(L""));CComVariant empty;ASSERT_HRESULT_SUCCEEDED(shell->ShellExecute(CComBSTR(url), empty, empty, empty, empty));9、类型检查类型检查失败时,直接导致代码编不过,难得用处就在这看下面的例子:template <typename T> class FooType {public: void Bar() { testing::StaticAssertTypeEq<int, T>(); }};TEST(TypeAssertionTest, Demo){FooType<bool> fooType;();}10、总结本篇将常用的断言都介绍了一遍,内容比较多,有些还是很有用的。