学习gtest笔记<1-VS2013环境搭建>

本文介绍了如何在Windows环境下使用VS2013配置并使用GoogleTest (gtest) 进行单元测试。详细步骤包括gtest的编译过程及如何创建测试用例,并提供了一个简单的示例程序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

因为工作的需要,需要使用gtest,就开始学起了gtest,写下这个博客,就当是一个学习笔记吧,在这里非常感谢“玩转Google开源C++单元测试框架Google Test系列”,我是照着他的博客进行学习的,他的博客的地址http://www.cnblogs.com/coderzh/archive/2009/03/31/1426758.html
我的系统及软件配置:
系统配置:win7 64bit专业版
VS版本:VS2013 Ultimate(旗舰版) 64 bit中文版
GTest版本:release-1.7.0

资源获取

源代码下载地址:https://github.com/google/googletest/tree/release-1.7.0

编译gtest

解压下载好的源码压缩包,进入到msvc目录下,打开VS工程,会提示升级,一路OK就行了。
1、在解决方案资源管理器中,依次(配置)编译四个工程,其实下载下来的源码,默认工程配置是可以的,下图中的圆圈运行库目录很重要,和被测代码的工程设置有关,完成后会发现在googletest-release-1.7.0\msvc\gtest\Debug目录下多了一个gtestd.lib,这就是我们需要的库。注意,用哪个版本的VS写代码,就要用相同的VS版本编译GTest。
2、GTest编译就完了,现在可以写的Demo程序玩一玩,现在用VS2013建立一个工程。修改(添加)该项目属性的C/C++ -> 常规 -> 附加附加包含目录,添加gtest下的include目录。修改(添加)该项目的属性的连接器 -> 输入 -> 附加依赖项,把上面生成的 gtestd.lib添加进来。
3、配置到此结束,接下来开始coding。完了之后,可以愉快的按Ctrl + F5,然后会看到很有感觉的黑背景亮绿色,如果有红色,很不幸的告诉你,代码有Bug。

Demo

//Foo.cpp
/*
*本代码作为GTest学习的入门。*
*主要用于熟悉VS2013的测试配置环境*
*认识测试的流程*
*/

#include "stdafx.h"
#include <iostream>
#include <gtest\gtest.h>
using namespace std;

//被测函数
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);
}


TEST(FooTest, HandleNoneZeroInput)
{//第一个参数是测试用例名,第二个参数是测试名:随后的测试结果将以"测试用例名.测试名"的形式给出 
    EXPECT_EQ(3, Foo(4.123, 10));
    EXPECT_EQ(6, Foo(30, 18));
    EXPECT_EQ(600, Foo(1, 18));
}

int _tmain(int argc, _TCHAR* argv[])
{
// gtest的测试案例允许接收一系列的命令行参数,将命令行参数传递给gtest,进行一些初始化操作。gtest的命令行参数非常丰富。
    testing::InitGoogleTest(&argc, argv);
    RUN_ALL_TESTS();
    getchar();
    return 0;
}

TEST宏:TEST宏的作用是创建一个简单测试,它定义了一个测试函数,在这个函数里可以使用任何C++代码并使用提供的断言来进行检查。
TEST的第一个 参数是测试用例名,第二个 参数是测试用例中某项测试的名称。一个测试用例可以包含任意数量的独立测试。这两个参数组成了一个测试的全称。
我们要测试这个函数:int Factorial(int n); // 返回n的阶乘
我们的测试用例是:测试输入0的情况和测试输入其它数据的情况,于是就有了:

TEST(TestFactorial, ZeroInput) 
{
    EXPECT_EQ(1, Factorial(0));   //EXPECT_EQ稍后再说,现在只要知道它是测试两个数据是否相等的就行了。
}
TEST(TestFactorial, OtherInput)
{
    EXPECT_EQ(1, Factorial(1));
    EXPECT_EQ(2, Factorial(2));
    EXPECT_EQ(6, Factorial(3));
    EXPECT_EQ(40320, Factorial(8));
}

Google Test根据测试用例来分组收集测试结果,因此,逻辑相关的测试应该在同一测试用例中;换句话说,它们的TEST()的第一个参数应该是一样的。在上面的例子中,我们有两个测试,ZeroInput和OtherInput,它们都属于同一个测试用例TestFactorial。

它的package.xml为:<?xml version="1.0"?> <package> <name>dh_hand_driver</name> <version>0.0.0</version> <description>The dh_hand_driver package</description> <!-- One maintainer tag required, multiple allowed, one person per tag --> <!-- Example: --> <!-- <maintainer email="jane.doe@example.com">Jane Doe</maintainer> --> <maintainer email="jiesun@todo.todo">jiesun</maintainer> <!-- One license tag required, multiple allowed, one license per tag --> <!-- Commonly used license strings: --> <!-- BSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, LGPLv3 --> <license>TODO</license> <!-- Url tags are optional, but multiple are allowed, one per tag --> <!-- Optional attribute type can be: website, bugtracker, or repository --> <!-- Example: --> <!-- <url type="website">http://wiki.ros.org/dh_hand_driver</url> --> <!-- Author tags are optional, multiple are allowed, one per tag --> <!-- Authors do not have to be maintainers, but could be --> <!-- Example: --> <!-- <author email="jane.doe@example.com">Jane Doe</author> --> <!-- The *depend tags are used to specify dependencies --> <!-- Dependencies can be catkin packages or system dependencies --> <!-- Examples: --> <!-- Use depend as a shortcut for packages that are both build and exec dependencies --> <!-- <depend>roscpp</depend> --> <!-- Note that this is equivalent to the following: --> <!-- <build_depend>roscpp</build_depend> --> <!-- <exec_depend>roscpp</exec_depend> --> <!-- Use build_depend for packages you need at compile time: --> <!-- <build_depend>message_generation</build_depend> --> <!-- Use build_export_depend for packages you need in order to build against this package: --> <!-- <build_export_depend>message_generation</build_export_depend> --> <!-- Use buildtool_depend for build tool packages: --> <!-- <buildtool_depend>catkin</buildtool_depend> --> <!-- Use exec_depend for packages you need at runtime: --> <!-- <exec_depend>message_runtime</exec_depend> --> <!-- Use test_depend for packages you need only for testing: --> <!-- <test_depend>gtest</test_depend> --> <!-- Use doc_depend for packages you need only for building documentation: --> <!-- <doc_depend>doxygen</doc_depend> --> <buildtool_depend>catkin</buildtool_depend> <build_depend>actionlib</build_depend> <build_depend>actionlib_msgs</build_depend> <build_depend>message_generation</build_depend> <build_depend>roscpp</build_depend> <build_depend>rospy</build_depend> <build_depend>serial</build_depend> <build_depend>std_msgs</build_depend> <run_depend>std_msgs</run_depend> <run_depend>actionlib</run_depend> <run_depend>actionlib_msgs</run_depend> <run_depend>message_runtime</run_depend> <run_depend>roscpp</run_depend> <run_depend>rospy</run_depend> <run_depend>serial</run_depend> <!-- The export tag contains other, unspecified, tags --> <export> <!-- Other tools can request additional information be placed here --> </export> </package>。需要修改吗?
最新发布
03-11
<think>好的,我需要分析用户提供的这个package.xml文件,看看是否有需要修改的地方。首先,我应该回忆一下ROS中package.xml的结构和常见规范。 用户提供的package.xml看起来是一个ROS包的配置文件。首先检查基本元素是否正确。比如,<name>是dh_hand_driver,版本是0.0.0,这通常是初始值,可能需要更新,但可能暂时可以接受。不过按照ROS的惯例,正式发布的包应该设置有效的版本号,比如0.1.0或类似的,而不是保持0.0.0。所以这里可能需要修改版本号。 接下来是<description>标签,当前的描述是“The dh_hand_driver package”,这显然是一个占位符,应该更详细地描述包的功能,比如“Driver for controlling DH robotic hands”之类的具体说明。所以这里需要补充更详细的描述。 然后是<maintainer>标签,用户填写了jiesun,邮箱是jiesun@todo.todo。这里的问题在于邮箱域名为todo.todo,这显然不是有效的邮箱地址。正确的应该是一个真实的邮箱,比如公司域名或者个人域名下的地址。所以这个需要修正,否则其他开发者无法联系维护者。 <license>标签当前是TODO,这是必须填写的部分。常见的许可证如BSD、MIT、Apache等,必须选择一个合适的许可证,不能留空或TODO。所以这里必须修改,否则在构建时可能产生警告或错误。 接下来是<url>标签,用户注释掉了示例,这里最好提供一个相关的链接,比如维基页面、代码仓库地址或者文档链接。虽然这不是强制的,但建议添加,以便用户获取更多信息。 <author>标签也被注释掉了,如果有其他作者的话,应该添加,但这不是必须的。不过如果有贡献者的话,最好注明。 在依赖项部分,用户使用了<build_depend>和<run_depend>。注意到在较新版本的catkin(ROS Noetic及以后)中,推荐使用<depend>来代替同时需要编译和运行的依赖,而<exec_depend>用于仅运行时依赖,<build_depend>用于仅编译时依赖。不过用户的写法可能兼容旧版格式,但需要注意是否有冗余或遗漏。 例如,检查是否有重复的依赖项。比如roscpp、rospy、serial在build和run中都出现了,可以用<depend>来简化。而message_generation是编译时需要,message_runtime是运行时,这部分处理是正确的。actionlib和actionlib_msgs在build和run中都有,同样可以合并为<depend>。 另外,用户可能使用了旧的标签<run_depend>,而新版本中建议使用<exec_depend>。不过catkin仍然支持<run_depend>,但为了符合最新规范,最好替换成<exec_depend>。 此外,是否有遗漏的依赖?比如,如果使用了其他消息或服务,可能需要添加相应的依赖,但根据现有内容无法判断。用户需要根据实际代码检查是否所有依赖都已正确声明。 总结需要修改的地方: 1. 许可证必须填写有效值,如BSD。 2. 维护者的邮箱需要有效。 3. 版本号建议从0.0.0改为更有意义的版本。 4. 补充描述信息,使其更具体。 5. 添加<url>标签,提供相关链接。 6. 考虑将<run_depend>替换为<exec_depend>,或合并重复依赖项到<depend>。 7. 检查是否有未声明的依赖,比如如果有消息生成,可能需要message_generation和message_runtime,但用户已经包含,可能没问题。 可能还有其他细节需要调整,比如格式是否正确,是否有注释未处理等。比如,用户有很多注释,但实际发布时应清理不必要的注释,保持文件整洁。 现在需要把这些整理成一个清晰的回答,帮助用户逐步检查和修改他们的package.xml文件。</think>根据提供的`package.xml`内容,该文件存在以下需要改进的地方,我将逐步说明修改建议: --- ### 1. **许可证信息不完整** ```xml <license>TODO</license> ``` - **问题**:必须指定具体开源协议(如BSD/MIT等) - **修改建议**: ```xml <license>BSD</license> <!-- 或其他实际使用的协议 --> ``` --- ### 2. **维护者邮箱无效** ```xml <maintainer email="jiesun@todo.todo">jiesun</maintainer> ``` - **问题**:`todo.todo`是无效域名 - **修改建议**: ```xml <maintainer email="jiesun@your-domain.com">jiesun</maintainer> ``` --- ### 3. **缺少必要元信息** - **描述(description)**:当前描述过于简单 ```xml <description>Driver for DH robotic hand hardware, providing ROS interfaces for control and communication.</description> ``` - **文档链接(url)**:建议添加代码仓库或文档链接 ```xml <url type="repository">https://github.com/yourusername/dh_hand_driver</url> ``` --- ### 4. **依赖项格式优化** - **过时标签**:ROS新版本推荐用`<exec_depend>`替代`<run_depend>` - **合并重复依赖**:如`roscpp`同时在build和run中出现,可简化为: ```xml <depend>roscpp</depend> <depend>serial</depend> ``` --- ### 5. **版本号占位符** ```xml <version>0.0.0</version> ``` - **建议**:设置为初始开发版本 ```xml <version>0.1.0</version> ``` --- ### 完整修改示例 ```xml <?xml version="1.0"?> <package> <name>dh_hand_driver</name> <version>0.1.0</version> <description>Driver for DH robotic hand hardware, providing ROS interfaces for control and communication.</description> <maintainer email="jiesun@your-domain.com">jiesun</maintainer> <license>BSD</license> <url type="repository">https://github.com/yourusername/dh_hand_driver</url> <buildtool_depend>catkin</buildtool_depend> <!-- 合并重复依赖 --> <depend>actionlib</depend> <depend>actionlib_msgs</depend> <depend>roscpp</depend> <depend>rospy</depend> <depend>serial</depend> <depend>std_msgs</depend> <!-- 消息生成依赖 --> <build_depend>message_generation</build_depend> <exec_depend>message_runtime</exec_depend> <export> </export> </package> ``` --- ### 关键修改说明表 | 原内容 | 问题类型 | 修改后 | 作用 | |-------------------------|----------------|-----------------------|-----------------------------| | `<license>TODO</license>` | 必填项缺失 | `<license>BSD</license>` | 声明合法许可协议 | | `jiesun@todo.todo` | 无效联系方式 | `jiesun@your-domain.com` | 确保开发者可联系 | | `version 0.0.0` | 非标准版本号 | `version 0.1.0` | 符合语义化版本规范 | | 重复依赖项 | 冗余代码 | 合并为`<depend>` | 提升可维护性 | --- ### 验证方法 1. 运行ROS包依赖检查: ```bash rosdep check dh_hand_driver ``` 2. 使用`catkin_lint`检测潜在问题: ```bash catkin_lint package.xml ``` 建议在完成修改后重新编译测试包功能是否正常。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值