本文以Visual Studio 2010为例,来介绍如何在Visual Studio里面进行单元测试.

首先来介绍普通单元测试,这是进行顺序测试、压力测试的基础。如果在Visual Studio 2010(2008)里面没有发现下图中的Test菜单,请用Visual Studio安装光盘进行安装,因为Visual Studio单元测试插件安装时可能不是默认选项。

测试之前,我们要准备一些测试代码。或者从下面的链接下载完整的项目工程。

http://download.csdn.net/source/3014236

新建一个名为AppSample的Lib。里面有一个MathUtility文件,包含加减乘除四个方法。代码如下:

namespace TJVictor.UT.AppSample

{

public class MathUtility

{

public MathUtility() { }

public static int Add(int a, int b)

{

return a + b;

}

public static int Minus(int a, int b)

{

return a - b;

}

public static int Divide(int a, int b)

{

return a / b;

}

public static int Multiply(int a, int b)

{

return a * b;

}

}

}

创建单元测试项目有两种方法:

1.直接创建单元测试项目:File->New->Project->Test Project. 如下图:

2. 直接在需要创建单元测试的函数上创建:右击函数名->Create Unit Tests。 如下图

这样就创建好了单元测试项目。Visual Studio 会自动生成一个单元测试工程。推荐使用第二种方法创建,因为第一种方法创建的只有单元测试工程,第二种方法会把单元测试函数也一起创建了出来。

本文以第二种创建的方式为例,继续下一步,讲解单元测试文件。

创建好的单元测试工程如下图:

其中MathUtilityTest.cs就是自动生成的单元测试文件,打开可以看到类似如下代码。

[TestMethod()]

public void AddTest()

{

int a = 0; // TODO: Initialize to an appropriate value

int b = 0; // TODO: Initialize to an appropriate value

int expected = 0; // TODO: Initialize to an appropriate value

int actual;

actual = MathUtility.Add(a, b);

Assert.AreEqual(expected, actual);

Assert.Inconclusive("Verify the correctness of this test method.");

}

关于单元测试的各种断言,不在本文讨论范围之内。下表列出Visual Studio 2010支持的断言及相关解释。

断言

解释

AreEqual

验证值相等

AreNotEqual

验证值不相等

AreSame

验证引用相等

AreNotSame

验证引用不相等

Inconclusive

暗示条件还未被验证

IsTrue

验证条件为真

IsFalse

验证条件为假

IsInstanceOfType

验证实例匹配类型

IsNotInstanceOfType

验证实例不匹配类型

IsNotNull

验证条件为NULL

IsNull

验证条件不为NULL

Fail

验证失败

测试函数AddTest()的属性[TestMethod()]表示这个方法是个可运行单元测试方法,区别类中的其他方法(如一些测试辅助方法)。

需要特别注意的是:Assert.Inconclusive("Verify the correctness of this test method.");语句是默认添加的,意思是这个方法是Visual Studio自动创建,运行前自删除或注释此句,否则运行结果无法通过。

按上面的步骤,把MathUtility里面的所有方法都建立相应的单元测试,然后按F6进行编译。编译后,就可以在单元测试窗口中看到我们刚刚建立的测试方法了。

Test->Windows->Test List Editor如下图:

修改DivideTest代码如下:

[TestMethod()]

public void DivideTest()

{

int a = 100; // TODO: Initialize to an appropriate value

int b = 2; // TODO: Initialize to an appropriate value

int expected = 50; // TODO: Initialize to an appropriate value

int actual;

actual = MathUtility.Divide(a, b);

Assert.AreEqual(expected, actual);

//Assert.Inconclusive("Verify the correctness of this test method.");

}

在Test List Editor选中DivideTest方法后,右击如下图

1.Run Checked Tests:直接运行此单元测试函数

2.Debug Checked Tests:以Debug模式运行。在此模式下运行单元测试函数,可以在单元测试函数(DivideTest)或是被测函数(MathUtility.Divide)中加断点,则程序会自动停留在断点处。

3.Open Test:打开此测试函数的方法,相当于双击。

4.Disable:把此测试方法置为无效。

左击Run Checked Tests后,运行结果如下图,证明测试通过:

重新修改DivideTest()程序如下:

[TestMethod()]

public void DivideTest()

{

int a = 100; // TODO: Initialize to an appropriate value

int b = 2; // TODO: Initialize to an appropriate value

int expected = 60; // TODO: Initialize to an appropriate value

int actual;

actual = MathUtility.Divide(a, b);

Assert.AreEqual(expected, actual);

//Assert.Inconclusive("Verify the correctness of this test method.");

}

再次运行,结果如下:

测试失败,原因是:期待值为60,实际值为50,断言失败。

重新修改DivideTest()程序如下:

public void DivideTest()

{

int a = 100; // TODO: Initialize to an appropriate value

int b = 0; // TODO: Initialize to an appropriate value

int expected = 60; // TODO: Initialize to an appropriate value

int actual;

actual = MathUtility.Divide(a, b);

Assert.AreEqual(expected, actual);

//Assert.Inconclusive("Verify the correctness of this test method.");

}

这次以Debug模式运行,则程序会在return a / b;抛出异常,显示被除数不能为0.

至此,一个简单的单元测试已经从头到尾跑了一遍。细心的读者一定会发现在MathUtilityTest.cs测试文件里面还有四个被注释掉的方法,下表列出了这四个方法的解释和用法。

函数名

用法

[ClassInitialize()]

MyClassInitialize

这个方法会在每次调用测试方法前被自动调用。假设在调用AddTest(),DivideTest()等方法之前都需要初始化一些基本数据列表,则这个工作可以放在MyClassInitialize函数里面,不用分别写在每个测试方法里。

[ClassCleanup()]

MyClassCleanup

这个方法会在每次调用测试方法结束后被自动调用。

[TestInitialize()]

MyTestInitialize

这个方法会在每次启动一个测试过程前被自动调用。例如本次测试一共选择了AddTest(),DivideTest()两个测试方法,则在调用这两个方法前,MyTestInitialize会先被调用。与MyClassInitialize不同的是,MyClassInitialize是每次调用测试方法时都会被调用,相当于函数级的调用,MyTestInitialize则只在测试过程前会被调用一次,在测试过程结束前,不会再被调用,相当于过程级的调用。

[TestCleanup()]

MyTestCleanup

这个方法会在每次结束一个测试过程后被自动调用。

Visual Studio 之所谓把这四个函数注释掉,原因是这四个函数只是示意性函数(从名字中就可以看出)。关键是看这四个函数的方法属性[ClassInitialize()],[ClassCleanup()], [TestInitialize()], [TestCleanup()]只要把相关的属性加到相关的方法上,那么这个方法就具有的上面所描述的功能。

单元测试适用范围:

1.验证函数正确性。对于一个函数,只要我们把相关的测试数据都写全,然后run一下,就知道是否都能通过。以后修改此方法后,只要再次run一下,就知道此次修改是否影响到了以前的测试用例,大大节省时间和提高正确率。

2.Debug程序。我们一般写后台代码时,都要写一个console或是winform小程序要调试验证所写的类是否能run起来,那么单元测试中的Debug模式就可以胜任此工作。

下面介绍两个使用时的小技巧。

1.可以在Test Result窗口里面导出测试结果。导出的结果包括一份测试报告和测试程序。证明此程序已经通过了报告中的所有测试用例,相当于Release了一个版本。

2.设置测试数量。每运行一次测试过程,就会生成一次测试报告和程序。Visual Studio默认次数是25,即超过25后,就会提示超出测试数次。我们可以通过下面的设置来提高次数。

Tool->Options->Test Tools->Test Execution,把里面的25改成100即可。如下图

至此,普通单元测试已经完成。请继续关注顺序单元测试。

Visual Studio 2010单元测试系列已经全部完成,以方便大家阅读,请使用http://blog.csdn.net/tjvictor/archive/2011/02/09/6175358.aspx来查看这一系列的所有博文。

转载于:https://www.cnblogs.com/songtzu/archive/2012/10/22/2733456.html

Visual Studio 2010 单元测试之一---普通单元测试:http://blog.csdn.net/tjvictor/archive/2011/02/09/6175362.aspx...相关推荐

  1. Visual Studio 单元测试之二---顺序单元测试

    此文是上一篇博文:Visual Studio 单元测试之一---普通单元测试的后续篇章.如果读者对Visual Studio的单元测试不熟悉的话,请先参看上一篇.http://blog.csdn.ne ...

  2. Microsoft Visual Studio 2010 Service Pack 1 正式版官方下载地址

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! Micr ...

  3. 使用 Visual Studio 2005 Team System 进行单元测试并生成用于 Unit Test Framework 的源代码...

    PS:微软专家写的一往篇VSTS2005测试功能说明,非常详细.适合初学者查看. 适用于: Microsoft Visual Studio 2005 Team System Beta 2 Team A ...

  4. Visual Studio 2010 Ultimate敏捷测试驱动开发

    在微软Visual Studio 2010 Ultimate Beta2版本中,MSF for Agile Software Development 5.0过程框架,是以Scrum模型为基础导向扩展, ...

  5. 微软MSDN中文网络广播(Webcast)——Visual Studio 2010 ALM应用实践系列课程预告(2011)...

    Visual Studio 2010 & ALM应用实践系列课程:(将在2011年3月前录制完成) 本系列课程较完整的覆盖了基于Visual Studio 2010 & ALM来进行软 ...

  6. 微软发布Visual Studio 2010 SP1公测版

    微软今天宣布了Visual Studio 2010 SP1的Beta测试版,MSDN订阅用户即日起可以下载,普通用户则要等到明天.微软表示,SP1 Beta拥有"go live"许 ...

  7. Visual Studio 2010 sp1介绍与下载

    Visual Studio 2010 SP1适用于Visual Studio 2010的所有版本,其改进如下: 1. 采用了新的帮助查看器: 2. 提供了更好的平台支持: 3. 新增了对Silverl ...

  8. Visual Studio 2010 SP1 中文升级补丁下载及说明

    最近事情比较多,差点忘记了这个VS2010 SP1的升级补丁更新了,程序员们赶快更新吧!这次发布的SP1包含了下列语言:英文,简体中文,繁体中文,法语,德语,印度语,日语,韩语,俄语以及西班牙语.虽然 ...

  9. Win7使用Visual Studio 2010编译用于Qt4.8.6的MySQL驱动

    其实编译过程在Qt Creator 的帮助文档里有,我就是照着做的,但是没成功,因为不能照搬照抄! 1.确保path环境变量里有QTDIR,这个就不细说了. 2.打开"开始"-&g ...

最新文章

  1. np.asarray和np.array、np.nanmean和np.mean、np.diff、
  2. Hibernate的批量查询
  3. MTK的LK代码异常向量表解析
  4. python判断是否是英文字母_用python如何判断字符串是纯英文
  5. 1017 A除以B (20 分)(c语言)
  6. CG-CTF-Web-MYSQL
  7. 不懂电容原理?那是你没看到这些动图
  8. 一文看懂什么是MQ消息队列
  9. 数据库左连接查询时候的技巧.
  10. [GZOI2017]取石子游戏
  11. Spring揭秘 — IoC
  12. 机顶盒固件简单做刷机包方法
  13. Cadence PSpice 仿真6:反向放大器傅里叶仿真(FFT,谐波分析)实战图文教程
  14. 索尼耳机的降噪功能怎么样?
  15. matlab 输入数据类型,Matlab数据类型及基本输入输出
  16. 计算机科学导论实验报告,上海电力学院计算机导论实验报告.docx
  17. J-LINK放了一晚,不能识别,灯一直闪
  18. Git add回退 commit回退
  19. Electron对接语音唤醒Windows SDK
  20. WindowsTool

热门文章

  1. 昨天添加的clustrMaps,忘了截屏,今天补上,就作为我在园子里的奠基。
  2. sp_decrypt
  3. spring 设计模式
  4. 密码中不能包含全角字符的正则表达式
  5. Lecture 14 Competive Analysis
  6. Lecture 9 Random built Binary Search Trees BSTs
  7. redis系列:分布式锁
  8. 用 Go 编写一个简单的 WebSocket 推送服务
  9. 简单文件传输TFTP服务器搭建 Linux RHEL6
  10. linux 内核配置过程中遇到的问题