• VS2015搭建GoogleTest框架--配置第一个项目


    一、googletest简介

    本文使用googletest进行单元测试,这里先简要介绍一下googletest。googletest(简称gtest)是一个跨平台的并且开源的(Linux、Mac OS X、Windows、Cygwin、Windows CE and Symbian)C++单元测试框架,由google公司发布。gtest是为在不同平台上为编写C++测试而生成的。它提供了丰富的断言、致命和非致命判断、参数化、“死亡测试”等。

    二、相关的准备工作

    本文的内容基于win10+vs2015使用googletest框架进行C++单元测试,那么我们要做的第一个工作就是去下载和配置googletest,以便于我们接下来进行使用。

    2.1下载源码

    https://github.com/google/googletest这个地址去下载googletest的源码为我们下一步进行编译做准备。

    2.2编译googletest源码生成我们需要的库文件

    下载完成之后我们得到的是一个zip格式的压缩文件,我们将其解压到合适的目录(以方便自己查找为原则)。这里我们需要注意两个文件夹,待会需要使用。

     

    使用vs2015打开msvc/2010里面的gtest.sln,会提示升级VC++编译器和库,点击确定即可。

    等待升级完成后,打开gtest项目属性对话框(可以右键单击项目名,打开属性),配置工程属性。按图中两种方式修改都是可以的(注意和后面测试项目的属性设置比较)。

    Debug、Release两个模式都要编译。

    在编译时会出现“无法启动程序”字样,这是正常的,因为我们只是生成了相关的库文件,并不是可执行文件。

     

    编译后,在msvc/2010/gtest/下有Win32-Debug、Win32-Release两个文件夹,并且每个文件夹里面有一个gtestd.lib文件,如下图所示。

    至此,准备阶段完成。

    2.3必要知识学习

    断言:gtest中采用了大量的宏来包装断言,这里的断言不同于C语言当中的断言(assert)。

    按照其使用方法可以分为两类:

    1. ASSERT系列(ASSERT_&系列,当检查点失败时,退出当前函数,并非推出当前案例);
    2. EXPECT系列(EXPECT_*系列的断言,当检查点失败时,继续往下执行)。

    按照常用功能可以依次分为12类,平常主要用到的以下这几类:

    1. 布尔值比较
    2. 数值型数据比较
    3. 字符串比较
    4. 浮点数比较
    5. 近似数比较
    6. 异常检测
    7. 自定义格式函数与参数检查

    布尔值比较

    ASSERT_TRUE(condition)

    EXPECT_TRUE(condition)

    condition == true

    ASSERT_FALSE(condition)

    EXPECT_FALSE(condition)

    condition == 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)

    val2 >= val2

    字符串比较

    ASSERT_STREQ (str1, str2)

    EXPECT_STREQ (str1, str2)

    两个C字符串内容相同(同时支持char *和wchar_t *类型)

    ASSERT_STRNE (str1, str2)

    EXPECT_STRNE (str1, str2)

    两个C字符串内容不同(同时支持char *和wchar_t *类型)

    ASSERT_STRCASEEQ (str1, str2)

    EXPECT_STRCASEEQ (str1, str2)

    两个C字符串内容相同,忽略大小写(只支持char *类型)

    ASSERT_STRCASENE (str1, str2)

    EXPECT_STRCASENE (str1, str2)

    两个C字符串内容不同,忽略大小写(只支持char *类型)

    浮点数比较

    ASSERT_FLOAT_EQ (val1, val2)

    EXPECT_FLOAT_EQ (val1, val2)

    the two float values are almost equal

    ASSERT_DOUBLE_EQ (val1, val2)

    EXPECT_DOUBLE_EQ (val1, val2)

    the two double values are almost equal

    近似数比较

    ASSERT_NEAR (val1, val2, abs_error)

    EXPECT_NEAR (val1, val2, abs_error)

    两个数值val1和val2的绝对值差不超过abs_error

     

     

     

     

    异常检查

    ASSERT_THROW (statement, exception_type)

    EXPECT_THROW (statement, exception_type)

    抛出指定类型异常

    ASSERT_THROW(statement)

    EXPECT_THROW(statement)

    抛出任意类型异常

    ASSERT_NO_THROW(statement)

    EXPECT_NO_THROW(statement)

    不抛异常

     

    函数值与参数检查(目前最多只支持5个参数)

    ASSERT_PRED1(pred1, val1)

    EXPECT_PRED1(pred1, val1)

    pred1(val1) returns true

    ASSERT_PRED2(pred2, val1, val2)

    EXPECT_PRED2(pred2, val1, val2)

    pred2(val1, val2) returns true

     

    Windows HRESULT

    ASSERT_HRESULT_SUCCEEDED(expression)

    EXPECT_HRESULT_SUCCEEDED(expression)

    expression is a success HRESULT

    ASSERT_HRESULT_FAILED(expression)

    EXPECT_HRESULT_FAILED(expression)

    expression is a failure HRESULT

     

    自定义格式函数与参数检查(目前最多支持5个参数)

    ASSERT_PRED_FORMAT1(pred1, val1)

    EXPECT_PRED_FORMAT1(pred1, val1)

    pred1(val1) is successful

    ASSERT_PRED_FORMAT1(pred1, val1, val2)

    EXPECT_PRED_FORMAT1(pred1, val1, val2)

    pred2(val1, val2) is successful

     

    2.4创建测试项目并配置属性

    在vs2015中,创建Win32控制台应用程序MyTest。

    打开项目属性对话框,配置工程属性。展开“配置属性 -> C/C++ -> 常规”,在【附加包含目录】中添加“.include”(这里省略了include的相关母目录,在之前有过关于include的说明,如果忘记在哪找,可以在前边的内容中复习一下);展开“C/C++ -> 代码生成”,在【运行库】中修改为多线程调试DLL(/MDd),如下图所示。

     

    展开“链接器 -> 输入”,在【附加依赖项】添加刚刚生成的lib文件路径,注意这里是配置Debug,要输入Win32-Debug里面的gtestd.lib文件路径(这里需要注意文件名后面有个d)。

     

    以上就是配置Debug的方式,配置Release只需要把前边相对应的位置改为Release的相关内容即可。

    2.5编写测试代码

    这里测试代码主要分为3个文件,主文件FirstGtest.cpp,以及Box类的两个相关文件CBox.h和CBox.cpp

     1 // CBox.h
     2 #pragma once
     3 #include <string.h>
     4 
     5 //Box类的定义
     6 class CBox
     7 {
     8 public:
     9     //构造函数
    10     CBox(double length_value, double width_value, double height_value);
    11     //默认构造函数
    12     CBox();
    13     //volume函数用于计算Box的体积
    14     double volume();
    15 
    16 private:
    17     //Box的3个特性:长、宽、高
    18     double Length_of_box;
    19     double Width_of_box;
    20     double Height_of_box;
    21 };
     1 //FirstGtest.cpp
     2 #include"stdafx.h"
     3 #include"gtestgtest.h"
     4 #include"CBox.h"
     5 
     6 //CBox测试类,继承Test对Box进行测试使用
     7 class CBox_test : public testing::Test 
     8 {
     9 protected:
    10     CBox* c;
    11     virtual void SetUp()
    12     {
    13         c = new CBox(2, 3, 4);
    14     }
    15 
    16     virtual void TearDown()
    17     {
    18         delete this->c;
    19     }
    20 };
    21 
    22 TEST(CBox, case1)
    23 {
    24     CBox  box1{ 78.0, 24.0, 18.0 };
    25     CBox box2;
    26     EXPECT_LT(23.0, box1.volume());
    27 }
    28 
    29 TEST_F(CBox_test, case2)
    30 {
    31     EXPECT_EQ(4, c->volume());
    32 }
    33 
    34 int main(int argc, char* argv[])
    35 {
    36     testing::InitGoogleTest(&argc, argv);
    37     return RUN_ALL_TESTS();
    38 }
     1 //CBox.cpp
     2 #include "stdafx.h"
     3 #include<iostream> 
     4 #include"CBox.h"
     5 
     6 using namespace std;
     7 
     8 //构造函数定义,包含3个参数:
     9 CBox::CBox(double length_value, double width_value, double height_value)
    10 {
    11     cout << "Constructor called." << endl;
    12     Length_of_box = length_value;
    13     Width_of_box = width_value;
    14     Height_of_box = height_value;
    15 }
    16 
    17 //默认构造函数
    18 CBox::CBox()
    19 {
    20     cout << "Default constructor is called." << endl;
    21 }
    22 
    23 
    24 // 计算Box体积函数
    25 double CBox::volume()
    26 {
    27     return Length_of_box * Width_of_box * Height_of_box;
    28 }

    三、遇到的问题及解决办法

    1. 在生成两个gtestd.lib文件时,编译器报“不是有效的Win32应用程序”,因为之前写的程序都是生成可执行程序,而没有做过只生成库文件的程序,本能地以为程序出错了,之后经过查阅资料和以及进一步地深入研究,发现这里只是生成了依赖库文件(我们也只需要这个库),并没有生成可执行文件,所以那是正常的。
    2. 配置googletest依赖库时,“配置属性 -> C/C++ -> 代码生成”中的【运行库】,前后没有设置相同的模式,从而导致找不到对应的库的情况。
    3. 在配置googletest时,修改“配置属性 -> 链接器 -> 输入”中的【附加依赖项】时,只填到了我们所生成的库文件的目录,但是没有添加文件名,报找不到*.obj文件的错误,只需要把路径填写到库文件就可以解决这个问题。

    作者:耑新新,发布于  博客园

    转载请注明出处,欢迎邮件交流:zhuanxinxin@aliyun.com

  • 相关阅读:
    单选按钮控件(Ridio Button)的使用
    带属性页的对话框
    异常处理与MiniDump详解(4) MiniDump
    单片机与嵌入式 以及ARM DSP FPGA 几个概念的理解
    VC更换图标文件
    http://user.qzone.qq.com/2413264738/2
    安装包安装 执行有相对路径的程序不能正确运行
    如何将 jar 包导入Maven 本地仓库
    19、访问者设计模式
    11、装饰器模式
  • 原文地址:https://www.cnblogs.com/Arthurian/p/8834412.html
Copyright © 2020-2023  润新知