【教程】在 Visual Studio 2015 上对 C++ 进行单元测试

news2024/11/27 4:28:29

更新中

目录

  • 前言
  • 环境
  • Visual Studio 2015 提供的单元测试工具
  • 创建 C++ 测试框架
  • 在测试项目内测试一个函数
  • 测试另一个 Project 的函数
  • 参考

前言

本文的测试环境是 Visual Studio 2015,高级别版本(如,2017,2022)的操作略有不同,但提供了更强大的测试功能,这两种版本 IDE 下的测试方式,可以阅读官方文档

环境

  1. os:win10
  2. IDE:Visual Studio 2015

Visual Studio 2015 提供的单元测试工具

  1. Test Explorer:可视化的测试辅助工具,可以在这个工具里查看测试的结果,它取代了以前版本的单元测试窗口。Test Explorer 可以适配包括第三方测试框架在内的各种测试框架
  2. Microsoft unit test framework for managed code:提供给托管代码的测试框架(托管代码一般是微软环境下的特定用于,是指可以运行在 .Net 平台上的,诸如 C#,F# 等语言)
  3. Microsoft unit test framework for C++:提供给 C++ 的测试框架
  4. IntelliTest:智能测试工具,仅供 C# 使用

创建 C++ 测试框架

在本节中,我们利用 Test Explorer 和 Visual Stuido 自带的 C++ 测试框架来完成一个简单语句的测试。

第一步,创建测试框架项目:在 solution 上右键,选择 [ Add ] - [ New Project ]
在这里插入图片描述
第二步[ Visual C++] - [ Test ] - [ Native Unit Test Project] 创建基于 C++ 的测试框架(注,Managed Test Project 用于托管代码的测试框架
在这里插入图片描述
第三步,打开测试文件:在 Solution Explorer 窗口中打开刚刚新建的测试框架项目,打开 测试文件
在这里插入图片描述
文件内部是下面的样子,简单解释一下结构 TEST_METHOD(TestMethod1) 表示一个测试单元,其中 TestMethod1 表示这个测试单元的名字,在 //TODO:Your test code here 这里填写你的测试语句,或者测试函数。
在这里插入图片描述
下面我们先来测试一段简单的代码逻辑(下一节将介绍如何测试函数)。这段逻辑如下,有 a,b 为输入,求 a,b 的和,并输入给 c,有 aimValue 作为基准值进行对比,来判断测试结果是否准确。

具体代码如下

	namespace UnitTest1
	{		
		TEST_CLASS(UnitTest1)
		{
		public:
			
			TEST_METHOD(TestMethod1)
			{
				// TODO: Your test code here
				int a = 10;
				int b = 20;
				int c = a + b;
				int aimValue = 30;
				Assert::AreEqual(c, aimValue);
			}
		};
	}

【注】Assert 是什么:这是微软测试框架提供的一个类似断言功能的类,它提供了大量函数方便你做结果的判断,测试框架将会根据这个类中的函数的结果作为测试是否通过的结果。
【注】Assert::AreEqual(c, aimValue) 用于判断 c 和 aimValue 是否相等,若相等则测试通过,否则不通过。
第四步,进行测试

  1. 简单介绍一下 Test 选项下的内容

    1. Run:运行选项
    2. Debug:可以在单元测试时进行 Debug 操作
    3. PlayList:测试用例
    4. Test setting:测试设置
    5. Windows:调出 Test Explorer 窗口
      在这里插入图片描述
  2. 设置测试默认处理器架构:一般现在我们选择 x64 的架构,如果不设置该选项,会报错不兼容的问题。[ Test ] - [ Test Settings ] - [ Default Processor Architecture ] - [ x64 ]
    在这里插入图片描述

  3. 然后我们运行测试。[ Test ] - [ Run ] - [ ALL Tests ]
    在这里插入图片描述

  4. 查看测试结果

    1. 最下面的 [ Output ] 窗口输出一些基本信息,如测试花费的时间
    2. 左侧的 [ Test Explorer ] 自动弹出,展示了测试的结果。这里,我们的测试用例 TestMethod1 成功通过了测试
      在这里插入图片描述第五步. 测试多个用例:刚刚我们测试了一个用例,叫做 TestMethod1,现在我们新增一个测试用例,用来展示一个错误的示例,叫做 FailTest1,该测试用例将加法逻辑改为减法,但我们的测试用例数据并未改变
    		namespace UnitTest1
    		{		
    			TEST_CLASS(UnitTest1)
    			{
    			public:
    				
    				TEST_METHOD(TestMethod1)
    				{
    					// TODO: Your test code here
    					int a = 10;
    					int b = 20;
    					int c = a + b;
    					int aimValue = 30;
    					Assert::AreEqual(c, aimValue);
    				}
    				
    				// add new test case
    				TEST_METHOD(FailTest1)
    				{
    					// TODO: Your test code here
    					int a = 10;
    					int b = 20;
    					// change a + b to a - b
    					int c = a - b;
    					int aimValue = 30;
    					Assert::AreEqual(c, aimValue);
    				}
    			};
    		}
    

第六步,运行测试,最终 FailTest1 未能通过测试
在这里插入图片描述

在测试项目内测试一个函数

在当前测试框架中创建两个文件,一个 test_fun.cpp 文件存放要测试的函数,一个 test_func.h 存放被测试函数的声明
在这里插入图片描述
我们在 test_fun.cpp 中实现一个乘法函数,非常简单,具体代码如下:

void Multiple(int a, int b, int *c)
{
	*c = a * b;
}

同时在 test_func.h 完成该函数的声明,这里就不贴图了。

在我们的测试文件(unittest1.cpp)中引入 test_func.h 头文件,然后新增一个测试单元叫做 TestFunc,具体代码如下:

#include "stdafx.h"
#include <iostream>
#include "CppUnitTest.h"

#include "test_func.h" // 引入我们的测试函数头文件

using namespace Microsoft::VisualStudio::CppUnitTestFramework;

namespace UnitTest1
{		
	TEST_CLASS(UnitTest1)
	{
	public:
		
		TEST_METHOD(TestMethod1)
		{
			// TODO: Your test code here
			// ...
		}

		TEST_METHOD(FailTest1)
		{
			// TODO: Your test code here
			// ...
		}

		TEST_METHOD(TestFunc)
		{
			// TODO: Your test code here
			int a = 10;
			int b = 20;
			int c = 0;

			// call Multiple
			Multiple(a, b, &c);
			 
			int aimValue = 200;
			Assert::AreEqual(c, aimValue);
		}
	};
}

然后运行测试,测试结果如下,TestFunc 测试通过
在这里插入图片描述

测试另一个 Project 的函数

现在假设我们有一个已经存在的项目叫做 TestClient,我需要测试其中的函数叫做 MainTest

第一步,我们还是在测试文件中新增一个测试单元叫做 TestProjectFunc,具体的代码如下:

TEST_METHOD(TestProjectFunc)
{
	// TODO: Your test code here
	int a = 10;
	int b = 20;
	int c = 0;

	MainTest(a, b, &c);

	int aimValue = 30;
	Assert::AreEqual(c, aimValue);
}

第二步,引入要测试函数所在的头文件 #include "../TestClient/TestClient.h"
第三步,为测试项目添加外部引用,关联我们的 TestClient
在这里插入图片描述
在这里插入图片描述
第四步,添加额外依赖,也就是 MainTest 函数所在的源文件对应的 obj 文件
在这里插入图片描述
本例中,我的 MainTesttest.cpp 中,则对应需要依赖 test.obj 这个中间文件
在这里插入图片描述
所有这些操作完成之后,运行测试,测试结果如下
在这里插入图片描述

参考

  1. Visual Studio 2015 测试官方文档
  2. Visual Studio 使用教程:在Visual Studio中编写C / C ++的单元测试:2017 及更高版本
  3. vs2015单元测试总结——3种方法可用
  4. 关联测试与对象或库文件:2022 版本

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/598363.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot + 规则引擎 URule,太强了!

一、背景 前段时间&#xff0c;在做项目重构的时候&#xff0c;遇到很多地方需要做很多的条件判断。当然可以用很多的if-else判断去解决&#xff0c;但是当时也不清楚怎么回事&#xff0c;就想玩点别的。于是乎&#xff0c;就去调研了规则引擎。 当然&#xff0c;市面上有很多…

[unity]如何并行for循环

序 并行for循环 计算着色器里可以弄&#xff0c;但是那个得先了解一堆api&#xff0c;比如什么setBuffer unity 的 job system好像也可以弄&#xff0c;但是那个也得先了解一堆api 这些都是大而全的&#xff0c;有没有那种&#xff0c;没那么神通广大但是比较容易上手的&am…

【CocosCreator入门】CocosCreator组件 | TiledTile(地图块)组件

&#x1f4e2;博客主页&#xff1a;肩匣与橘&#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;本文由肩匣与橘编写&#xff0c;首发于CSDN&#x1f649;&#x1f4e2;生活依旧是美好而又温柔的&#xff0c;你也是✨ …

HIve技术详解(一)

第1章 Hive基本概念 1.1 Hive 1.1.1 Hive的产生背景 在那一年的大数据开源社区&#xff0c;我们有了HDFS来存储海量数据、MapReduce来对海量数据进行分布式并行计算、Yarn来实现资源管理和作业调度。但是面对海量数据和负责的业务逻辑&#xff0c;开发人员要编写MR来对数据进…

3.3 最长公共子序列

博主简介&#xff1a;一个爱打游戏的计算机专业学生博主主页&#xff1a; 夏驰和徐策所属专栏&#xff1a;算法设计与分析 1.什么是子序列&#xff1f; 我的理解&#xff1a; 在字符串或序列中&#xff0c;子序列是指从原始序列中删除零个或多个元素后得到的序列&#xff0c;…

Spring Boot如何实现分布式事务的协调和管理

Spring Boot如何实现分布式事务的协调和管理 在分布式系统中&#xff0c;事务是非常重要的一部分&#xff0c;可以保证多个操作在一个原子性的操作中完成&#xff0c;确保数据的一致性和可靠性。在分布式系统中&#xff0c;分布式事务需要考虑多个服务之间的数据一致性和事务提…

论文排版!

目录 Visio画图后&#xff0c;粘贴到word白边太宽&#xff1f; 【IEEE论文投稿word中双栏情况下插入单栏效果图片】 论文排版之Word双栏排版问题解决 Word公式居中&#xff0c;公式序号靠右&#xff08;制表位实现&#xff09; 请问word如何实现这种长公式的排版&#xff1…

MVCC 实现原理

&#x1f49f;这里是CS大白话专场&#xff0c;让枯燥的学习变得有趣&#xff01; &#x1f49f;没有对象不要怕&#xff0c;我们new一个出来&#xff0c;每天对ta说不尽情话&#xff01; &#x1f49f;好记性不如烂键盘&#xff0c;自己总结不如收藏别人&#xff01; &#x1f…

Pycharm 安装PyQt5

第一步: 新建项目文件夹 新建项目 新建一个 Pyqt5Tools 的文件夹 这里放到了 D盘 安装成功 第二步: 安装相关包 安装PyQt5 pip3 install -i https://pypi.douban.com/simple PyQt5,PyQt5-tools时间根据网速 更新下pip python.exe -m pip install --upgrade pip -i https:…

tensorRT推理相关及遇到的坑

tebsorRT是什么 tensorRT是NVIDIA出的一个高性能深度学习推理&#xff08;inference&#xff09;优化器&#xff0c;可以为深度学习应用提供低延迟、高吞吐率的部署推理。TensorRT可用于对超大规模数据中心、嵌入式平台或自动驾驶平台进行推理加速。TensorRT现已能支持TensorF…

数据库隔离级别

1. 数据库隔离级别 1.1 事务 事务只是一个改变&#xff0c;是一些操作的集合&#xff1b;用专业的术语讲&#xff0c;他就是一个程序的执行单元&#xff1b;事务本身其实并不包含这4个特性&#xff0c;只是我们需要通过某些手段&#xff0c;尽可能的让这个执行单元满足这四个特…

Java学习路线(20)——多线程

一、线程&#xff08;Thread&#xff09; 1、概念&#xff1a; 是一个程序内部的一条执行路径 2、分类 单线程&#xff1a; 程序中只有一条执行路径多线程&#xff1a; 程序中有多条执行路径 二、多线程的创建 1、Thread的概念&#xff1a; Java通过java.lang.Thread类代表…

HTTP 教程2

HTTP 消息结构 HTTP是基于客户端/服务端&#xff08;C/S&#xff09;的架构模型&#xff0c;通过一个可靠的链接来交换信息&#xff0c;是一个无状态的请求/响应协议。 一个HTTP"客户端"是一个应用程序&#xff08;Web浏览器或其他任何客户端&#xff09;&#xff…

什么是C/S架构?与B/S架构有什么区别?

1、 1.1、C/S架构的全称是Client/Server&#xff0c;即客户端/服务器体系结构&#xff0c;主要应用于局域网内。 1.2、B/S架构的全称为Browser/Server&#xff0c;即浏览器/服务器结构。百度安全验证https://baijiahao.baidu.com/s?id1742761249590653499&wfrspider&f…

微信小程序——CSS限制文字宽度和行数(溢出显示省略号)

手把手教你学会判断用户在做向上滑动还是向下滑动 知识回调&#xff08;不懂就看这儿&#xff01;&#xff09;场景复现核心干货单行文本溢出显示省略号多行文本溢出显示省略号 知识回调&#xff08;不懂就看这儿&#xff01;&#xff09; 知识专栏专栏链接微信小程序专栏http…

基于HTML+CSS+JavaScript的在线图书阅读网页设计

目 录 1.项目总体设计 2 1.1需求分析 2 1.2网站结构分析 3 1.2.1导航栏 3 1.2.2主体部分 3 1.3网络风格分析 3 1.4网站结构图 3 2.项目详细设计 4 2.1登录页面设计 4 2.2主页页面设计 5 2.3在线读书页面设计 6 3.项目总结 7 4.参考文献 7 此网页能够满足喜欢看书的书友&#x…

深度学习 - 53.Bert 简介与 Keras-Bert 常用示例

目录 一.引言 二.Bert 简介 1.Embedding Layer 2.Encoder layer 3.Pre-training 与 Fine-Tuning 三.Keras-Bert 常用 Demo 1.获取预训练模型 2.加载预训练模型 3.Fill Text 4.IsCorrelation 5.Get Embedding 6.完整代码 四. Fine-Tuning 五.Bert VS OpenAI GPT …

chatgpt赋能python:Python中等待一秒的语句:让你的程序暂停与等待

Python中等待一秒的语句&#xff1a;让你的程序暂停与等待 当编写Python程序时&#xff0c;经常需要添加暂停或延迟功能&#xff0c;以使程序能够在执行某些操作之前或之后等待一段时间。Python拥有一个内置的语句可以实现这种延迟&#xff1a;time.sleep()。 什么是 time.sl…

四信大气环保远程监测平台,实现大气网格化、精准化监测

近年来&#xff0c;随着国民经济快速发展&#xff0c;我国工业化、城镇化进程加快&#xff0c;随之造成的大气污染问题日益严峻&#xff0c;严重影响人们日常生活幸福指数与身体健康。为此&#xff0c;中共中央、国务院先后发布一系列文件&#xff0c;要求加强大气环境监测&…

价格限制与经济福利

价格控制 实行价格控制通常是政府相信市场价格对买方或卖方不公平两种价格控制&#xff1a;价格上限和价格下限 价格上限&#xff1a; 法定最高价格&#xff0c;任何人不得收取或付出高于此的价格。 价格下限&#xff1a; 法定最低价格&#xff0c;任何人不得收取或付出低于…