gtest的基础使用02:测试已有项目中的类和函数

  • 一、环境信息
  • 二、创建待测项目配套的Google Test项目
  • 三、测试已有项目中的函数
  • 四、测试项目中的类
  • 五、一些疑惑和分析
  • 六、改进点
  • 参考信息


一、环境信息

1.Visual Studio 2019
2.Windows 10

二、创建待测项目配套的Google Test项目

  1. 在VS2019中创建新项目 Practice

    其中的Practice.cpp包含main( )函数
#include <iostream>
using namespace std;

int main()
{
    cout << "Hello Google Test!\n";
}
  1. 创建 Practice 配套的 gtest项目
    (1)文件-新建-项目,打开 创建新项目 窗口
    (2)选择创建Google Test,然后点击下一步
    (3)在 配置新项目 窗口,项目名称自定,解决方案选择:添加到解决方案。然后点击创建

(4)选择要测试的项目后,点击OK

gtest如何安装到服务器上 gtest main_EQ

(5)如图所示,已经创建好了 项目Practice 对应的 gtest项目practice_gtest

gtest如何安装到服务器上 gtest main_头文件_02

三、测试已有项目中的函数

  1. 在已有项目practice中新建文件 factorial.cpp

    factorial.cpp包含函数factorial( ),用于计算正整数的阶乘。注意:这里要加 关键字 inline,否则引用factorial.cpp时会触发fatal error LNK1169: 找到一个或多个多重定义的符号
inline int factorial(int n)  
{
	if (n <= 1)
		return 1;
	else
		return n * factorial(n - 1);
}
  1. 在 Practice_gtest项目—test.cpp中编写 factorial( )函数的单元测试用例。需要注意:
    (1) #include中需要指明 factorial( )所在文件的路径:…/Practice/factorial.cpp ( …/ 表示上一层目录, ./ 表示当前路径),否则会找不到 factorial( )函数
    (2) TEST(a, b) 中,a表示测试用例集的名称、b表示a中的一条用例
    (3) 对于测试用例TEST(a, b) , TEST(a, c) , b c 命名不能相等,否则会导致测试执行失败
#include "pch.h"
#include "../Practice/factorial.cpp"

TEST(factorialFucTest, BelowZero) 
{
	EXPECT_EQ(1, factorial(-3)); //预期是1,实际结果为1
}

TEST(factorialFucTest, Zero)
{
	EXPECT_FALSE(factorial(0)); //预期是0,实际结果是1 
}

TEST(factorialFucTest,BeyondZero )
{
	EXPECT_EQ(2, factorial(2)); //预期是2,实际结果是2 
	ASSERT_EQ(4, factorial(3)); //预期是4,实际结果是6 
	EXPECT_EQ(2, factorial(4)); //预期是2,实际结果是24 
}
  1. 运行单元测试用例:测试–测试资源管理器 或者 视图–测试资源管理器,点击 在视图中运行所有测试用例

    运行结果如下,可以看到与预期是一致的

    由于在测试用例BeyondZero 中使用了ASSERT断言,ASSERT运行失败后,同一用例中,ASSERT后的测试项没有被执行,因此这里只出现了一个报错

四、测试项目中的类

1.新建类Calc,模拟加减乘除运算

gtest如何安装到服务器上 gtest main_单元测试_03


其中:Calc.h

class Calc
{
public:
	int  Add(int a, int b);
	int  Minus(int a, int b);
	int  Multi(int a, int b);
	float Divide(float a, float b);
};

其中:Calc.cpp

#include "Calc.h"

int Calc::Add(int a, int b)
{
	return a + b;
}

int Calc::Minus(int a, int b)
{
	return a - b;
}

int Calc::Multi(int a, int b)
{
	return a * b;
}

float Calc::Divide(float a, float b)
{
	return a / b;
}
  1. 在gtest测试工程中新建 ClassCalcTest.cpp,用于测试类Calc
#include "pch.h"
#include "../Practice/Calc.h"

Calc calculation;

TEST(CalcClassTest, add)
{
	EXPECT_EQ(3,calculation.Add(1, 2));
}

TEST(CalcClassTest, minus)
{
	EXPECT_EQ(calculation.Minus(1, 2), -1);
}

TEST(CalcClassTest, multi)
{
	EXPECT_EQ(calculation.Multi(1, 2), 2);
}

TEST(CalcClassTest, devide)
{
	EXPECT_FLOAT_EQ(calculation.Divide(1, 2),0.5);
}
  1. 测试类时,需要先设定好对应目标文件的地址,具体步骤如下
    (1) 进入 测试工程Practice_gtest的属性设定界面(右键点击项目,在弹出菜单中选择属性)
    (2) 依次定位到链接器-输入-附加依赖项,点击下拉框,进行编辑
    (3) 输入类Calc的目标文件 Calc.obj的地址
  2. 打开测试资源管理器,执行测试

五、一些疑惑和分析

  1. 测试类时,为什么一定要设定目标文件的地址?另外,设定目标文件地址的方法感觉有些低效,是否有更好的办法?
  2. 当测试多个类时,需要分别添加对应的obj文件,该场景下不能使用通配符 * ,否则执行测试时会报错

六、改进点

  1. 通过设置Project之间的依赖,简化头文件的路径描述。以ClassCalcTest.cpp为例
#include "pch.h"
	//#include "../Practice/Calc.h"   //设置Project之间的依赖前
	#include "Calc.h" //设置Project之间的依赖后
	
	Calc calculation;
	
	TEST(CalcClassTest, add)
	{
		EXPECT_EQ(3,calculation.Add(1, 2));
	}
  1. 设置Project依赖关系的方法
    (1) 右键点击 Practice_gtest,选择 属性
    (2) 在属性页中,依次定位到:配置属性 - C/C++ - 常规 - 附加包含目录,点击下拉框后选择编辑

    (3) 在弹出的附加包含目录窗口中设定依赖关系:输入待测项目的目录地址
  2. 下图中的include方式需要修改:正确的做法是 include 头文件。因为需要依赖接口(.h头文件),而不是依赖实现(.cpp文件)

    针对问题3的修改过程:

(1) 在 Practice项目 中新建头文件 factorial.h ,内容如下

int factorial(int n);

(2) factorial.cpp也进行适当调整,包含头文件 factorial.h ,关键字inline 不再需要

#include "factorial.h"
		
		int factorial(int n)
		{
			if (n <= 1)
				return 1;
			else
				return n * factorial(n - 1);
		}

gtest如何安装到服务器上 gtest main_gtest如何安装到服务器上_04


(3)对应的 Practice_gtest – test.cpp也进行调整,包含对应的头文件factorial.h

#include "pch.h"
//#include "../Practice/factorial.cpp"
#include "factorial.h"

TEST(factorialFucTest, BelowZero) 
{
	EXPECT_EQ(1, factorial(-3));
}

(4)依次进入Practice_gtest-属性-链接器-输入-附加依赖项-编辑,添加对应的obj文件

gtest如何安装到服务器上 gtest main_gtest如何安装到服务器上_05


(5)随后通过测试资源管理器运行测试即可

gtest如何安装到服务器上 gtest main_头文件_06