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

一、环境信息

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
在这里插入图片描述

(5)如图所示,已经创建好了 项目Practice 对应的 gtest项目practice_gtest
在这里插入图片描述

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

  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,模拟加减乘除运算
在这里插入图片描述
其中: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);
		}

在这里插入图片描述
(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文件
在这里插入图片描述
(5)随后通过测试资源管理器运行测试即可
在这里插入图片描述

参考信息

  1. Visual Studio 2019社区版C++ gtest简单使用,作者:西祠西山居。衷心感谢西哥对我的指导 😃
  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
下面是一个使用GTest单元测试框架读取测试用例文件,并使用这100条测试用例对NextDate函数进行测试的示例代码: ```c++ #include <gtest/gtest.h> #include <fstream> #include <string> #include "NextDate.h" using namespace std; TEST(NextDateTest, TestFromFile) { ifstream infile("testcases.txt"); string line; while (getline(infile, line)) { int year, month, day; char expected[11]; sscanf(line.c_str(), "%d/%d/%d %s", &year, &month, &day, expected); string result = NextDate(year, month, day); EXPECT_STREQ(result.c_str(), expected) << "Input: " << year << "/" << month << "/" << day; } } int main(int argc, char **argv) { testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); } ``` 其,`testcases.txt` 文件包含 100 条测试用例,每条测试用例都包含一个日期和一个期望的输出结果,格式如下: ``` 1985/2/28 1985/3/1 1985/9/30 1985/10/1 ... ``` `NextDate` 函数是待测试函数,其返回值为一个字符串,表示给定日期的下一天。在测试函数,我们使用 `sscanf` 函数测试用例文件读取每条测试用例的输入和期望输出,然后调用 `NextDate` 函数计算实际输出结果,并使用 `EXPECT_STREQ` 宏进行断言,判断实际输出结果是否等于期望输出结果。如果实际输出结果和期望输出结果不相等,则输出测试失败的信息,包括用例的输入和输出,方便我们进行调试。 最后,我们在 `main` 函数调用 `testing::InitGoogleTest` 函数来初始化 GTest 单元测试框架,并调用 `RUN_ALL_TESTS` 函数运行所有的测试用例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值