上一篇文章带你玩转Visual Studio——性能分析与优化讲了找出性能瓶颈和性能优化相关的技能,在大型企业项目的开发中,性能是固然重要的,而另一个过程——测试也是必不可少的。测试有很多的各类:功能测试、系统测试、白盒测试、黑盒测试、单元测试,在这些测试中单元测试是程序员最经过遇到的。


什么是单元测试

所谓单元测试(unit testing),就是对软件中的最小单元进行检查和验证,其一般验证对象是一个函数或者一个类。

对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Java里或C++里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。

单元测试的作用:

  • 确定自己的代码功能和逻辑的正确性;
  • 发现问题并及早地改进一些不当的设计;
  • 对于一些被依赖信很强的代码作修改时,确保逻辑的正确才能不影响其它模块的功能;
  • 更好地管理和保存测试代码,以便下次代码修改后可方便地进行Debugging;


VC++的单元测试

我们继续使用上一章带你玩转Visual Studio——性能分析与优化的案例和代码。经过上一文的优化,我们的代码性能是提高了,但每个函数是否正确无误并没有经过验证。现在就用单元测试进行椎一下。

使用UnitText工程

1、 在Solution中添加一个UnitTest的项目


图1: 添加UnitTest工程

,关于多工程的开发,请参考《带你玩转Visual Studio——带你多工程开发》

2、这时会自动帮我们创建一个unittest1.cpp并生成部分初始代码。(如果没有自动生成也可自己手动添加.cpp文件并编写测试代码)


图2: 工程目录

3、根据给定的初始代码框架,编写测试代码

#include "stdafx.h"
#include "CppUnitTest.h"
#include "Prime.h"using namespace Microsoft::VisualStudio::CppUnitTestFramework;namespace UnitTest
{TEST_CLASS(UnitTest1){public:// 测试100以内的质数TEST_METHOD(TestPrime){int primes[] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29,31, 37, 41, 43, 47, 53, 59, 61, 67,71, 73, 79, 83, 89, 97/*,   101, 103, 107*/ };int n = sizeof(primes) / sizeof(primes[0]);for (int  i = 0; i < n; i++){Assert::AreEqual(IsPrime(primes[i]), true);}}TEST_METHOD(TestCalculateSum){// 测试1到n的整数之和Assert::AreEqual((int)CalculateSum(4), 10);Assert::AreEqual((int)CalculateSum(6), 21);Assert::AreEqual((int)CalculateSum(10), 55);Assert::AreEqual((int)CalculateSum(100), 5050);}};
}

说明:
TEST_METHOD是一个测试宏,每一个宏对应一个测试单元。大括号({})内的内容是这个测试单元的测试代码。

4、进行单元测试
选择Test->Windows->Test Explorer菜单,打开单元测试的工具窗口


图3: 测试资源管理器窗口
测试方法:
(1).选择其中的一个或多个单元,右键鼠标->Run Selected Tests,
(2).点击”Run All”,测试所有单元。

如果测试成功,Output窗口会有类似如下的提示:

========== Run test finished: 2 run (0:00:00.7490429) ==========

测试项的标记色会变成绿色:


图4: 测试成功标记色


ManagedTest工程

我们在图1中可以看到有两个跟测试相关的工程,一个是Native Unit Test Project(上面已经讲了),一个是Managed Test Project。其实这两个工程都可用来进行单元测试,Managed Test Project提供了更全面的功能,如对类的开始初始化和结束销毁的处理,每个测试方法前后进行初始化和销毁处理等。而Unit Test Project相当于是对Managed Test Project的一种封装,只提供最简单、最常用的测试功能,而帮我们默认处理很多繁琐的工作。在VS2013及之前版本的VisualStudio只有Managed Test Project类型的工程(之前的版本名称好像为Test Project)。

1、添加Managed Test Project工程,完成之后会自动帮我们创建UnitTest.cpp文件和初始代码框架。
2、修改UnitTest.cpp,添加自己的测试代码:

#include "stdafx.h"
#include "Prime.h"using namespace System;
using namespace System::Text;
using namespace System::Collections::Generic;
using namespace Microsoft::VisualStudio::TestTools::UnitTesting;namespace ManagedTest
{[TestClass]public ref class UnitTest{private:TestContext^ testContextInstance;public: /// <summary>///Gets or sets the test context which provides///information about and functionality for the current test run.///</summary>property Microsoft::VisualStudio::TestTools::UnitTesting::TestContext^ TestContext{Microsoft::VisualStudio::TestTools::UnitTesting::TestContext^ get(){return testContextInstance;}System::Void set(Microsoft::VisualStudio::TestTools::UnitTesting::TestContext^ value){testContextInstance = value;}};#pragma region Additional test attributes////You can use the following additional attributes as you write your tests:// ClassInitialize为 在执行(类中)第一个测试单元之前要执行的代码// 如全局变量(或静态变量)的初始化//[ClassInitialize()]//static void MyClassInitialize(TestContext^ testContext) {};//ClassCleanup为 在(类中)所有的测试单元执行完之后要执行的代码// 如全局变量(或静态变量)的销毁//[ClassCleanup()]//static void MyClassCleanup() {};// TestInitialize为 在执行每一个测试单元之前要执行的代码// 如对象中文件流的打开//[TestInitialize()]//void MyTestInitialize() {};// TestCleanup 为 在执行完每一个测试单元之后要执行的代码// 如对象中文件流的关闭//[TestCleanup()]//void MyTestCleanup() {};//#pragma endregion [TestMethod]void TestMethod(){// TODO: 在此添加测试逻辑};[TestMethod]void TestPrime2(){// 测试100以内的质数int primes[] ={2, 3, 5, 7, 11, 13, 17, 19, 23, 29,31, 37, 41, 43, 47, 53, 59, 61, 67,71, 73, 79, 83, 89, 97/*,   101, 103, 107*/};int n = sizeof(primes) / sizeof(primes[0]);for (int i = 0; i < n; i++){Assert::AreEqual(IsPrime(primes[i]), true);}};[TestMethod]void TestCalculateSum2(){// 测试1到n的整数之和Assert::AreEqual((int)CalculateSum(4), 10);Assert::AreEqual((int)CalculateSum(6), 21);Assert::AreEqual((int)CalculateSum(10), 55);Assert::AreEqual((int)CalculateSum(100), 5050);};};
}

3、编译工程。
编译时,如果出现类似如下的错误:

1>VisualStudioProject.lib(Prime.obj) : warning LNK4075: ignoring ‘/EDITANDCONTINUE’ due to ‘/OPT:LBR’ specification
1>VisualStudioProject.lib(Prime.obj) : error LNK2019: unresolved external symbol __imp___invalid_parameter referenced in function “public: char const & __thiscall
1>VisualStudioProject.lib(Prime.obj) : error LNK2019: unresolved external symbol __imp___CrtDbgReportW referenced in function “public: char const & __thiscall
1>msvcprtd.lib(locale0_implib.obj) : error LNK2019: unresolved external symbol __imp___free_dbg referenced in function “public: static void __cdecl std::_Fac_node::operator delete(void *)” (??3_Fac_node@std@@SAXPAX@Z)
1>msvcprtd.lib(locale0_implib.obj) : error LNK2019: unresolved external symbol __imp___malloc_dbg referenced in function “public: static void * __cdecl std::_Fac_node::operator new(unsigned int)” (??2_Fac_node@std@@SAPAXI@Z)
1>D:\CppWorkspace\VS2015\ConsoleApplication1\Debug\DefaultTest.dll : fatal error LNK1120: 4 unresolved externals

右键工程属性(Properties) Configuration Properties -> C/C++ -> Code Generation -> Runtime Library, 将运行库的方式改为 “Multi-Threaded Debug DLL (/MDd)”

4、运行测试代码


测试结果



上一篇回顾:
带你玩转Visual Studio——性能分析与优化

下一篇要讲述的内容:
带你玩转Visual Studio——绑定进程调试


带你玩转Visual Studio——单元测试相关推荐

  1. 带你玩转Visual Studio——性能分析与优化

    上一篇文章带你玩转Visual Studio--VC++的多线程开发讲了VC++中多线程的主要用法.多线程是提升性能和解决并发问题的有效途经.在商用程序的开发中,性能是一个重要的指标,程序的性能优化也 ...

  2. 【转】带你玩转Visual Studio——03.带你了解VC++各种类型的工程

    上一篇文章带你玩转Visual Studio--带你新建一个工程一文中提到新建一个工程时会有很多的工程类型(图1),现在将简单介绍各种类型工程的含义和主要用途.由于这里包含的工程类型太多,有很多本人也 ...

  3. 【转】带你玩转Visual Studio——04.带你高效开发

    上一篇文章带你玩转Visual Studio--带你了解VC++各种类型的工程一文中讲了各种类型VC++工程的主要功能和用途.现在将带你一起快速开发c++程序. 有过Java开发经验的人都知道Java ...

  4. 【转】带你玩转Visual Studio——02.带你新建一个工程

    接着上一篇文章带你玩转Visual Studio--开篇介绍继续讲这个主题,现在我们从创建一个新的工程开始. 一步一步创建项目 依次选择菜单:File\New\Project,打开New Projec ...

  5. 【转】带你玩转Visual Studio——01.开篇介绍

    开篇之前,先唠叨几句 本人从事C++开发工作一年半,总想就C++开发方面写点东西.写什么呢?想了一下还是写点跟开发密切相关的吧,要说跟开发最密切相关的那莫过于就是开发工具了,也就是常常说的集成开发环境 ...

  6. 带你玩转Visual Studio(八)——带你跳出坑爹的Runtime Library坑

    在Windows下进行C++的开发,不可避免的要与Windows的底层库进行交互,然而VS下的一项设置MT.MTd.MD和MDd却经常让人搞迷糊,相信不少人都被他坑过,特别是你工程使用了很多第三库的时 ...

  7. 带你玩转Visual Studio——开篇介绍

    开篇之前,先唠叨几句 本人从事C++开发工作一年半,总想就C++开发方面写点东西.写什么呢?想了一下还是写点跟开发密切相关的吧,要说跟开发最密切相关的那莫过于就是开发工具了,也就是常常说的集成开发环境 ...

  8. [转载]带你玩转Visual Studio——带你高效开发

    原文地址:http://blog.csdn.net/luoweifu/article/details/48852119#t15 VassistX的简单介绍与下载安装 简单介绍 VassistX的全称是 ...

  9. 一文带你弄懂Visual Studio:运行时库及MT/MTD、MD/MDD

    一文带你弄懂Visual Studio:运行时库及MT/MTD.MD/MDD 引子 什么是Runtime Library? Runtime Library和运行库 MT MTD MD MDD的关系 静 ...

最新文章

  1. CCNA 第二学期答案
  2. ASP.NET MVC5 + EF6 入门教程 (6) View中的Razor使用
  3. 自学linux指令总结
  4. vue使用 xterm_为什么我坚持使用xterm
  5. AvtiveMQ与SpringBoot结合
  6. [USACO07FEB]银牛派对Silver Cow Party
  7. Nginx源码分析 - 基础数据结构篇 - hash表结构 ngx_hash.c(07)
  8. 信息熵--决策树的建立算法ID3中使用
  9. PHP的压力测试工具ab.exe 和mpm介绍提高并发数
  10. selenium报错 : WebDriverException: ‘chromedriver‘ executable needs to be in PATH解决方案
  11. 利用动态数组生成魔方矩阵
  12. 支付宝扫码枪收银的实现原理你了解吗?
  13. 常用网线T568A或T568B类型详细讲解
  14. 终于有人把大数定律讲明白了
  15. python实现趋势外推法
  16. php输入框里的提示文字,input标签输入框带提示文字方法
  17. ajaxpro安装和使用---有人说ajaxpro是ajax的替代品
  18. libuv 原理_进程 | libuv中文教程
  19. PXC 5.7 WSREP_SST: [ERROR] xtrabackup_checkpoints missing
  20. (一)因式分解机(Factorization Machine,FM)原理及实践

热门文章

  1. 项目前的一篇战地日记-菜鸟和大神的区别
  2. 《程序员》2012年5期精彩内容:云计算!
  3. Web前端数据存储—cookie机制(设置,获取,删除cookie)
  4. 自定义view让图片慢慢画出来
  5. node服务器性能测试,nodejs 性能测试报告
  6. windows ssh代理_如何在Windows上通过SSH设置代理?
  7. 计算机组装与维护计划,计算机组装与维护实习计划.ppt
  8. Systrace6 Input 解读
  9. 分享一下,如何防止工具(八门神器)进行内存修改!
  10. 鹦鹉学舌1c语言,鹦鹉学舌的秘密,大脑结构奇特/模仿人类语言(脑力惊人)