Mac下GTest的基本使用

Mac下GTest的基本使用

gtest全称Google C++ Testing Framework,它是从谷歌内部诞生并受到业界追捧的一个非常优秀的测试框架,支持如自动发现测试、自定义断言、死亡测试、自动报告等诸多功能。

本文记录Mac下安装配置gtest以及它的基本应用

一、安装

博主尝试用brew install 遇到了问题,于是直接源码安装

编译安装

 git clone https://github.com/google/googletest
 cd googletest
 mkdir build && cd build
 cmake ..
 make
 make install

测试代码

CMakeLists.txt

cmake_minimum_required(VERSION 3.0)
set(CMAKE_CXX_STANDARD 11)

project(demo)

find_package(GTEST REQUIRED)

add_executable(${PROJECT_NAME} main.cpp)

target_link_libraries(${PROJECT_NAME} ${GTEST_LIBRARIES})

main.cpp

#include <iostream>
#include <gtest/gtest.h>

int add(int a, int b) {
    return a + b;
}

int sub(int a, int b) {
    return a - b;
}

// case1
TEST(test, c1) {
    EXPECT_EQ(3, add(1, 2));
    EXPECT_EQ(12, add(2, 6));
}

// case2
TEST(test, c2) {
    EXPECT_EQ(-1, sub(1, 2));
}

GTEST_API_ int main(int argc, char ** argv) {
    testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

编译运行

cmake .
make
./demo
# 输出
?  build ./demo
[==========] Running 2 tests from 1 test case.
[----------] Global test environment set-up.
[----------] 2 tests from test
[ RUN      ] test.c1
/Users/fanghao/Desktop/test/main.cpp:15: Failure
Expected equality of these values:
  12
  add(2, 6)
    Which is: 8
[  FAILED  ] test.c1 (0 ms)
[ RUN      ] test.c2
[       OK ] test.c2 (0 ms)
[----------] 2 tests from test (0 ms total)

[----------] Global test environment tear-down
[==========] 2 tests from 1 test case ran. (0 ms total)
[  PASSED  ] 1 test.
[  FAILED  ] 1 test, listed below:
[  FAILED  ] test.c1

 1 FAILED TEST

二、基本概念

  • 断言:即assertion,检查条件是否为真,一个断言的结果有

    • sucess
    • nonfatal failure(非致命失败)
    • fatal failure(致命失败)

    这里值得注意的是后两个,nonfatal failure会指出错误,然后继续运行,由EXPECT_XX产生,fatal failure会指出错误但是终止当前测试函数,由ASSERT_XX产生,一般推荐用前者,这样一次可以查出多个问题

  • 测试样例:test case表示要测试的对象,一般TEST会有两个参数,分别是测试样例,以及测试的子case,如下面这个测试阶乘的样例,HandlesZeroInput和HandlesPositiveInput都属于FactorialTest这个测试样例
    // Tests factorial of 0
    TEST(FactorialTest, HandlesZeroInput) {
    EXPECT_EQ(1, Factorial(0));
    }
    
    // Tests factorial of positive numbers.
    TEST(FactorialTest, HandlesPositiveInput) {
    EXPECT_EQ(1, Factorial(1));
    EXPECT_EQ(2, Factorial(2));
    EXPECT_EQ(6, Factorial(3));
    EXPECT_EQ(40320, Factorial(8));
    }
  • 常用断言
    Fatal assertion Nonfatal assertion Verifies
    ASSERT_TRUE(condition); EXPECT_TRUE(condition); condition is true
    ASSERT_FALSE(condition); EXPECT_FALSE(condition); condition is false
    ASSERT_EQ(expected, actual); EXPECT_EQ(expected, actual); expected == actual
    ASSERT_NE(val1, val2); EXPECT_NE(val1, val2); val1 != val2
    ASSERT_LT(val1, val2); EXPECT_LT(val1, val2); val1 < val2
    ASSERT_LE(val1, val2); EXPECT_LE(val1, val2); val1 <= val2
    ASSERT_GT(val1, val2); EXPECT_GT(val1, val2); val1 > val2
    ASSERT_GE(val1, val2); EXPECT_GE(val1, val2); val1 >= val2
    ASSERT_STREQ(expected_str, actual_str); EXPECT_STREQ(expected_str, actual_str); the two C strings have the same content
    ASSERT_STRNE(str1, str2); EXPECT_STRNE(str1,str2); the two C strings have different content
    ASSERT_STRCASEEQ(expected_str, actual_str); EXPECT_STRCASEEQ(expected_str, actual_str); the two C strings have the same content,ignore case
    ASSERT_STRCASENE(str1, str2); EXPECT_STRCASENE(str1,str2); the two C strings have different content,ignore case

三、 Test Fixture

Test Fixture是对基本test case的封装,如果多个test需要操作类似数据,可以把他们封装在一个类里面,然后共享一些配置。

编写Fixure步骤

  1. 建立一个类,并继承::testing::Test,并且使用protected或public限制符,以便其子类可以访问到共享的数据
  2. 在这个类中,声明你想复用的对象。
  3. 写一个SetUp函数来准备所需对象
  4. 写一个TearDown函数来释放资源
  5. 其他用法和基本的test case一样,只是用TEST_F()宏代替TEST()宏,每次调用一个TEST_F都会重新运行一次SetUp和TearDown,但但成员对象可以共享

看一个示例应该更能说明问题

#include <iostream>
#include <gtest/gtest.h>

class Foo
{
  public:
    int add(int a, int b)
    {
        return a + b;
    }
    int sub(int a, int b)
    {
        return a - b;
    }
};

class FooTest : public ::testing::Test
{
  protected:
    Foo foo; // shared object
    // SetUp && TearDown will be called for every Test Case
    virtual void SetUp()
    {
        std::cout << "Code here will be called immediately after the constructor" << std::endl;
    }
    virtual void TearDown()
    {
        std::cout << "Code here will be called immediately after each test" << std::endl;
    }
};

// Test Case 1
TEST_F(FooTest, TestMethodAdd)
{
    EXPECT_EQ(3, foo.add(1, 2));
}

// Test Case 2
TEST_F(FooTest, TestMethodSub)
{
    EXPECT_EQ(-1, foo.sub(1, 2));
}

int main(int argc, char *argv[])
{
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

# 输出
?  build ./demo
[==========] Running 2 tests from 1 test case.
[----------] Global test environment set-up.
[----------] 2 tests from FooTest
[ RUN      ] FooTest.TestMethodAdd
Code here will be called immediately after the constructor
Code here will be called immediately after each test
[       OK ] FooTest.TestMethodAdd (0 ms)
[ RUN      ] FooTest.TestMethodSub
Code here will be called immediately after the constructor
Code here will be called immediately after each test
[       OK ] FooTest.TestMethodSub (0 ms)
[----------] 2 tests from FooTest (0 ms total)

[----------] Global test environment tear-down
[==========] 2 tests from 1 test case ran. (1 ms total)
[  PASSED  ] 2 tests.

四、小结

感觉gtest还是挺优雅的,适合TDD模式,把测试和开发完全解耦。

原文地址:https://www.cnblogs.com/fanghao/p/9616112.html

时间: 2024-07-31 14:06:02

Mac下GTest的基本使用的相关文章

Mac下获取AppStore安装包文件路径

本文介绍了Mac下如何找到AppStore下载的安装包路径,以及如何提取出来供以后使用的相关步骤,希望对大家有所帮助. 通过远在大洋彼岸的苹果服务器下载东西,确实有够慢啊!AppStore更甚:甚至都经常提示连不上服务器,而有些软件呢,还必须从AppStore下载安装,所以没办法,谁让上了苹果的贼船呢!公司的网速更是不敢恭维,以至于基本上不下东西,除非像这次一样:手贱的把iPhone6升级到8.2.2了,然后Xcode6.1.1真机调试不成了,所以需要下个Xcode6.2.昨天刚更新的Xcode

.NET跨平台之mac 下vs code 多层架构编程

合肥程序员群:49313181.    合肥实名程序员群:128131462 (不愿透露姓名和信息者勿加入,申请备注填写姓名+技术+工作年限) Q  Q:408365330     E-Mail:[email protected] 概述: 为了研究跨平台.NET 开发,我打算利用.NET core 编写一个跨平台的cms,这个CMS我也秉着开源的原则放到github上面,为.NET 开源社区做点小小的贡献吧.如果有兴趣的可以联系我一起为.NET开源和跨平台做点小小的贡献吧.EgojitCMS传送

Mac&#160;下locate命令使用问题WARNING: The locate database (/var/db/locate.database) does not exist.

想在Mac下使用locate时,提醒数据库没创建: WARNING: The locate database (/var/db/locate.database) does not exist. To create the database, run the following command: sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.plist Please be aware that the d

mac下创建cocos2d-x 3.7项目

因为之前开发都是在window下进行开发,而且都是用quick进行开发,因此对c++以及在Mac下的开发还不是很了解,最近买了台Mac,想把这方面补给一下,做一下笔记. 首先先去cocos2d-x官网上下载cocos2d-x3.7,在打开终端,进入cocos2d-x3.7文件夹下的: cocos2d-x-3.7/tools/cocos2d-console/bin目录下,输入命令: ./cocos.py new HelloWorldDemo -p com.coco2dx.org -l cpp -d

关于Mac下的SSH客户端iterm2等配置

linux后台开发的同学们晓得,在windows下有xshell\securecrt这样优秀的ssh客户端软件.mac下查找了下,有securecrt mac版,网上也有破解的,试用了一段时间,一个问题始终没有能解决——ssh链接偶尔会断掉.关于这个问题,先说下leby的工作环境吧:我们是不能直接ssh目标主机的,必须用ssh代理中转,于是搭建了一个HTTP的proxy,这之前在windows下xshell工作很好.在mac的scrt下,总是会随机掉线,一些超时配置当然是试过的,不能解决问题.

mac下,mysql5.7.18连接出错,错误信息为:Access denied for user &#39;root&#39;@&#39;localhost&#39; (using password: YES)

mac下,mysql5.7.18连接出错,错误信息为:Access denied for user 'root'@'localhost' (using password: YES)()里面的为shell中输入的命令,一定要输全包括:&等符号 第一步:苹果->系统偏好设置->最下面点MySQL,关闭mysql服务 第二步:进入终端输入(cd /usr/local/mysql/bin/)回车输入(sudo su)回车以获取管理员权限输入(./mysqld_safe --skip-grant

Mac下切换Python版本

Mac下有多个版本的Python时,需要进行版本切换.我使用的是anaconda,在终端下进行包安装时,默认Python版本是MacOS自带的Python,需要进行手动的版本切换. # 将anaconda的bin目录加入PATH,根据版本不同,也可能是~/anaconda3/bin echo 'export PATH="~/anaconda2/bin:$PATH"' >> ~/.bashrc # 更新bashrc以立即生效 source ~/.bashrc 以我主机为例,切

mac下配置maven环境变量

记下配置mac下maven环境变量的问题. 下载maven 后解压到某一路径下.根据网上很多人的方法,echo ??M3_HOME只能得到路径.但 mvn --version是没用的, 还是会提示 command not found. jdk是没有任何问题的.所以应该解决的还是maven的问题. 修改bash_profile vim ~/.bash_profile 输入以下内容: 即可.

整理MAC下Eclipse的常用快捷键

整理Eclipse常用快捷键 开发环境切换到Mac下后原来Window下的快捷键很大一部分是不相容的,习惯了快捷键的生活忽然哪天快捷键不起作用了,跟着的就是开发效率明显降低,频繁录入错误的快捷键让Eclipse都不知道你想要什么了. 以下内容是我整理的经常使用的Eclipse快捷键,主要依据首个按键进行了分类. 文档末尾是收集了Mac系统下对文本编辑当标跳转或选中的快捷键. 一.Command类 Command+1 快速修复 Command+d 删除当前行 Command+Option+↓ 复制