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模式,把测试和开发完全解耦。

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

  1. mac 下配置protobuf 3.0 golang环境

    protobuf 3.0  与 之前的 protobuf 2.6 的语法是不一样的.需要重新安装一下,本机的环境是 OS X Yosemite  10.10.2 1. 不采用home brew安装,用 ...

  2. mac下安装及配置tomcat

    mac下的软件不像windows下的程序那样写注册表,对于tomcat的安装来说,在mac下是名符其实的绿色软件,具体操作如下: 1.到 apache官方主页 下载完整 tar.gz文件包.(没有专门 ...

  3. MAC下 mysql不能插入中文和中文乱码的问题总结

    MAC下 mysql不能插入中文和中文乱码的问题总结 前言 本文中所提到的问题解决方案,都是基于mac环境下的,但其他环境,比如windows应该也适用. 问题描述 本文解决下边两个问题: 往mysq ...

  4. 【开发软件】 在Mac下配置php开发环境:Apache+php+MySql

    本文地址 原文地址   本文提纲: 1. 启动Apache 2. 运行PHP 3. 配置Mysql 4. 使用PHPMyAdmin 5. 附录   有问题请先 看最后的附录   摘要: 系统OS X ...

  5. 2016年最新mac下vscode配置golang开发环境支持debug

    网上目前还找不到完整的mac下golang环境配置支持,本人配置成功,现在整理分享出来. mac最好装下xcode,好像有依赖关系安装Homebrew打开终端窗口, 粘贴脚本执行/usr/bin/ru ...

  6. 【工匠大道】Mac下Java开发环境配置简述

    本文地址 原文地址 分享提纲: 1. 下载JDK1.7 2. 配置java_home 3 .安装tomcat 4 .安装eclipse或者myeclipse 5.  mysql安装 破解版下载请参考M ...

  7. mac下查看.mobileprovision文件及钥匙串中证书.cer文件

    mac下查看.mobileprovision文件及钥匙串中证书.cer文件 一. mobileprovision文件查看 xxx.mobileprovision是ios开发中的设备描述文件,里面有证书 ...

  8. mac 下JDK 与 tomcat 的安装与配置

    一.Mac下JDK的安装 1.先检测Mac是否已经安装过JDK,在终端中输入java 或者 javac 显示说明,表明已经安装过JDK,JDK版本查询终端键入java -version,终端会返回JD ...

  9. svn服务器地址变换以后,mac下的处理方法

    svn服务器地址变换之后,mac下的处理方法 svn服务器地址变换之后,mac下的处理方法 1.进入终端,进入项目所在的文件夹下: cd 项目位置/ 2.查看svn信息 svn info 3.输出结果 ...

随机推荐

  1. Pandas系列(四)-文本数据处理

    内容目录 1. 为什么要用str属性 2. 替换和分割 3. 提取子串 3.1 提取第一个匹配的子串 3.2 匹配所有子串 3.3 测试是否包含子串 3.4 生成哑变量 3.5 方法摘要 一.为什么要 ...

  2. 版本控制工具之git

    git存储区域详解 命令快速总结 初始化 git init 当前文件夹初始化 代码提交 git add file/. 自动检测工作区修改的内容提交到暂存区 git status 查看当前文件夹工作区的 ...

  3. Java小知识点总结

    目录 配置 数据库配置文件 基础知识 Switch i++和++i 快捷打代码 输入数据 代码折叠 super关键字 instanceof 防止类型强制转换带来的错误 继承 第一个Java程序 Jav ...

  4. HBase读写的几种方式(一)java篇

    1.HBase读写的方式概况 主要分为: 纯Java API读写HBase的方式: Spark读写HBase的方式: Flink读写HBase的方式: HBase通过Phoenix读写的方式: 第一种 ...

  5. [再寄小读者之数学篇](2014-07-27 $H^{-1}$ 中的有界集与弱收敛极限)

    设 $H^{-1}$ 是 $H^1_0$ 的对偶空间, 定义域为 $[0,1]$. 试证: (1) $\sed{h\sin (2\pi hx);\ h>0}$ 在 $H^{-1}$ 中有界; ( ...

  6. [物理学与PDEs]第5章第2节 变形的描述, 应变张量 2.3 位移梯度张量与无穷小应变张量

    1.  位移向量 $$\bex {\bf u}={\bf y}-{\bf x}. \eex$$ 2.  位移梯度张量 $$\bex \n_x{\bf u}={\bf F}-{\bf I}. \eex$ ...

  7. artDialog记录

    //在子页面加按钮的方式 var api = frameElement.api, W = api.opener; api.button({ id: 'valueOk', name: '确定', cal ...

  8. 3D Slicer中文教程(二)—软件功能界面介绍

    1.界面介绍 2.菜单及工具栏介绍 (1)菜单 File-文件菜单 文件菜单包含用于加载MRML场景的选项,用于从互联网下载样本数据集或各种类型的各个数据集.此处还提供了保存场景和数据的选项. Edi ...

  9. 一个基于angularJS的工资计算器

    先看界面: 其实在ng中最让人印象深刻的就是数据的双向绑定,在html中就完成了很多操作.大概用到的就是控制器视图服务等,没有分模块写控制器,代码如下: <html ng-app = " ...

  10. Linux命令行下编辑常用的快捷键

    Linux命令行编辑快捷键: Ctrl+r 然后输入若干字符,开始向上搜索包含该字符的命令,继续按Ctrl+r,搜索上一条匹配的命令,按Ctrl+c或上下键退出. Ctrl+l 清屏 !num 执行命 ...