玩转Google开源C++单元测试框架Google Test系列(gtest)之一 - 初识gtest

简介:

一、前言

本篇将介绍一些gtest的基本使用,包括下载,安装,编译,建立我们第一个测试Demo工程,以及编写一个最简单的测试案例。

二、下载

如果不记得网址, 直接在google里搜gtest,第一个就是。目前gtest的最新版本为1.3.0,从下列地址可以下载到该最新版本:

http://googletest.googlecode.com/files/gtest-1.3.0.zip 

http://googletest.googlecode.com/files/gtest-1.3.0.tar.gz 

http://googletest.googlecode.com/files/gtest-1.3.0.tar.bz2 

三、编译

下载解压后, 里面有个msvc目录:

 

使用VS的同学可以直接打开msvc里面的工程文件, 如果你在使用的是VS2005或是VS2008,打开后会提示你升级,升完级后,我们直接编译里面的“gtest”工程,可以直接编过的。

这里要提醒一下的是,如果你升级为VS2008的工程,那么你的测试Demo最好也是VS2008工程,不然你会发现很郁闷,你的Demo怎么也编不过,我也曾折腾了好久,当时我升级为了VS2008工程,结果我使用VS2005工程建Demo,死活编不过。(这里有人误解了,并不是说只能在VS2008中编译,在VS2005中同样可以。如果要编译VS2005版本,最好保证gtest和你的测试工程都使用VS2005工程。)

编译之后,在msvc里面的Debug或是Release目录里看到编译出来的gtestd.lib或是gtest.lib文件。

四、第一个Demo

下面我们开始建立我们的第一个Demo了,假如之前使用的VS2008编译的gtest,那么,我们在VS2008中,新建一个Win32 Console Application。接着就是设置工程属性,总结如下:

1.设置gtest头文件路径

2.设置gtest.lib路径

3.Runtime 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 / gtest.h >

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,一切就绪了,我们直接运行案例试试(一片绿色,非常爽):


    五、总结

    本篇内容确实是非常的初级,目的是让从来没有接触过gtest的同学了解gtest最基本的使用。gtest还有很多更高级的使用方法,我们将会在后面讨论。总结本篇的内容的话:

        1. 使用VS编译gtest.lib文件

        2. 设置测试工程的属性(头文件,lib文件,/MT参数(和编译gtest时使用一样的参数就行了))

        3. 使用TEST宏开始一个测试案例,使用EXPECT_*,ASSER_*系列设置检查点。

        4. 在Main函数中初始化环境,再使用RUN_ALL_TEST()宏运行测试案例。

      优点:

          1. 我们的测试案例本身就是一个exe工程,编译之后可以直接运行,非常的方便。

          2. 编写测试案例变的非常简单(使用一些简单的宏如TEST),让我们将更多精力花在案例的设计和编写上。

          3. 提供了强大丰富的断言的宏,用于对各种不同检查点的检查。

          4. 提高了丰富的命令行参数对案例运行进行一系列的设置。

      系列链接:

      1.玩转Google开源C++单元测试框架Google Test系列(gtest)之一 - 初识gtest

      2.玩转Google开源C++单元测试框架Google Test系列(gtest)之二 - 断言

      3.玩转Google开源C++单元测试框架Google Test系列(gtest)之三 - 事件机制

      4.玩转Google开源C++单元测试框架Google Test系列(gtest)之四 - 参数化

      5.玩转Google开源C++单元测试框架Google Test系列(gtest)之五 - 死亡测试

      6.玩转Google开源C++单元测试框架Google Test系列(gtest)之六 - 运行参数

      7.玩转Google开源C++单元测试框架Google Test系列(gtest)之七 - 深入解析gtest

      8.玩转Google开源C++单元测试框架Google Test系列(gtest)之八 - 打造自己的单

       

       

      本文转自CoderZh博客园博客,原文链接:http://www.cnblogs.com/coderzh/archive/2009/04/06/1426758.html,如需转载请自行联系原作者

       

      相关文章
      WK
      |
      8天前
      |
      开发框架 开发工具 C++
      C++跨平台框架Qt
      Qt是一个功能强大的C++跨平台应用程序开发框架,支持Windows、macOS、Linux、Android和iOS等操作系统。它提供了250多个C++类,涵盖GUI设计、数据库操作、网络编程等功能。Qt的核心特点是跨平台性、丰富的类库、信号与槽机制,以及良好的文档和社区支持。Qt Creator是其官方IDE,提供了一整套开发工具,方便创建、编译、调试和运行应用程序。Qt适用于桌面、嵌入式和移动应用开发。
      WK
      29 5
      |
      5月前
      |
      算法 Linux C++
      C++框架设计中实现可扩展性的方法
      在软件开发中,可扩展性至关重要,尤其对于C++这样的静态类型语言。本文探讨了在C++框架设计中实现可扩展性的方法:1) 模块化设计降低耦合;2) 使用继承和接口实现功能扩展;3) 通过插件机制动态添加功能;4) 利用模板和泛型提升代码复用;5) 遵循设计原则和最佳实践;6) 应用配置和策略模式以改变运行时行为;7) 使用工厂和抽象工厂模式创建可扩展的对象;8) 实现依赖注入增强灵活性。这些策略有助于构建适应变化、易于维护的C++框架。
      418 2
      WK
      |
      15天前
      |
      C++ 开发者 iOS开发
      C++跨平台框架
      C++跨平台框架使开发者能够编写一次代码,在多个操作系统和硬件平台上运行,提高开发效率和软件可扩展性。常见的框架包括Qt、wxWidgets、SDL、JUCE等,它们各自具有丰富的功能和特点,适用于不同的应用场景。选择框架时需考虑目标平台、功能需求、学习曲线和社区支持等因素。
      WK
      26 0
      |
      2月前
      |
      JavaScript 前端开发 测试技术
      一个google Test文件C++语言案例
      这篇文章我们来介绍一下真正的C++语言如何用GTest来实现单元测试。
      19 0
      |
      3月前
      |
      测试技术 C++
      【C++】解决googleTest报错error: SEH exception with code 0xc0000005 thrown in the test body.
      【C++】解决googleTest报错error: SEH exception with code 0xc0000005 thrown in the test body.
      |
      3月前
      |
      数据安全/隐私保护 C++ 开发者
      C++框架设计秘籍:解锁可扩展性的神奇密码,让你的代码无所不能!
      【8月更文挑战第5天】在C++框架设计中,实现可扩展性至关重要以适应需求变化和新功能的加入。主要策略包括:使用接口与抽象类提供统一访问并允许多种实现;采用依赖注入分离对象创建与依赖管理;运用模板和泛型编程实现代码通用性;设计插件机制允许第三方扩展;以及利用配置文件和动态加载支持灵活的功能启用与模块加载。遵循这些实践能构建出更灵活、可维护及可扩展的框架。
      45 1
      |
      5月前
      |
      jenkins 测试技术 持续交付
      利用C++增强框架的可测试性(Testability)
      **C++框架可测试性提升策略**:通过模块化设计、依赖注入、使用Mock对象和Stub、编写清晰接口及文档、断言与异常处理、分离测试代码与生产代码、自动化测试,可以有效增强C++框架的可测试性。这些方法有助于确保代码正确性、健壮性,提高可维护性和可扩展性。示例包括使用类和接口实现模块化,通过构造函数进行依赖注入,以及利用Google Test和Google Mock进行断言和模拟测试。
      81 1
      |
      5月前
      |
      缓存 Java Maven
      深入解析Google Guava库与Spring Retry重试框架
      深入解析Google Guava库与Spring Retry重试框架
      |
      12天前
      |
      测试技术 开发者 UED
      探索软件测试的深度:从单元测试到自动化测试
      【10月更文挑战第30天】在软件开发的世界中,测试是确保产品质量和用户满意度的关键步骤。本文将深入探讨软件测试的不同层次,从基本的单元测试到复杂的自动化测试,揭示它们如何共同构建一个坚实的质量保证体系。我们将通过实际代码示例,展示如何在开发过程中实施有效的测试策略,以确保软件的稳定性和可靠性。无论你是新手还是经验丰富的开发者,这篇文章都将为你提供宝贵的见解和实用技巧。
      |
      3月前
      |
      JSON Dubbo 测试技术
      单元测试问题之增加JCode5插件生成的测试代码的可信度如何解决
      单元测试问题之增加JCode5插件生成的测试代码的可信度如何解决
      55 2
      单元测试问题之增加JCode5插件生成的测试代码的可信度如何解决

      热门文章

      最新文章