Visual Studio 2010 单元测试之一---普通单元测试
原文:Visual Studio 2010 单元测试之一---普通单元测试
本文以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来查看这一系列的所有博文。
如需转载,请注明本文原创自灰太狼的博客:http://blog.csdn.net/tjvictor
Visual Studio 2010 单元测试之一---普通单元测试的更多相关文章
- [转]Visual Studio 2010单元测试(1)--运行和定义普通单元测试
Visual Studio 2010 运行和定义单元测试 在VS2010中,单元测试的功能很强大,使得建立单元测试和编写单元测试代码,以及管理和运行单元测试都变得简单起来,通过私有访问器可以对私有方法 ...
- [转]Visual Studio 2010 单元测试目录
Visual Studio 2010 单元测试共分七个部分: 普通单元测试.顺序单元测试.压力测试,Generic测试.数据库测试.UI界面测试和Web性能测试. 这个系列的博客实例程序可以在下面的链 ...
- Visual Studio 2010 单元测试目录
单元测试的重要性这里我就不多说了,以前大家一直使用NUnit来进行单元测试,其实早在Visual Studio 2005里面,微软就已经集成了一个叫Test的专门测试插件,经过几年的发展,这个工具现在 ...
- Visual Studio 2010 单元测试--运行测试并查看代码覆盖率
原文:Visual Studio 2010 单元测试--运行测试并查看代码覆盖率 运行测试并查看代码覆盖率对程序集中的代码运行测试时,可以通过收集代码覆盖率数据来查看正在测试的项目代码部分. 运行测试 ...
- [转]Visual Studio 2010单元测试(2)--运行测试并查看代码覆盖率
Visual Studio 2010 单元测试--运行测试并查看代码覆盖率 运行测试并查看代码覆盖率对程序集中的代码运行测试时,可以通过收集代码覆盖率数据来查看正在测试的项目代码部分. 运行测试并查看 ...
- Visual Studio 单元测试之二---顺序单元测试
原文:Visual Studio 单元测试之二---顺序单元测试 此文是上一篇博文:Visual Studio 单元测试之一---普通单元测试的后续篇章.如果读者对Visual Studio的单元测试 ...
- 第三次作业 (一)----------------------Visual Studio 2015的安装及单元测试
这是第三周的第一个作业,Visual Studio 2015的安装及单元测试. 我的电脑之前安装过Visual Studio 2015,但是在安装过程中我从来没有留意过各种注意事项,所集正好借此作业的 ...
- [入门级] 基于 visual studio 2010 mvc4 的图书管理系统开发初步 (二)
[入门级] 基于 visual studio 2010 mvc4 的图书管理系统开发初步 (二) Date 周六 10 一月 2015 By 钟谢伟 Category website develop ...
- 【转】Visual Studio 2010在数据库生成随机测数据
测试在项目中是很重要的一个环节,在Visual Studio 2010中,在测试方面已经有很好的支持了,比如有单元测试,负载测试等等.在数据测试的方面,Visual Studio 2010,还支持对数 ...
随机推荐
- linux下一个php未找到php型材php.ini解决方案
编译并安装自己php经常会遇到这样的问题.我找不到php.ini.对于根据下面的方法可以解决例: 首先是需要解释.假设你php它被编译并安装,那么默认是没有php.ini的,你必须得去复制源代码包内. ...
- ABP项目中的使用AutoMapper
AutoMapper之ABP项目中的使用 最近在研究ABP项目,昨天写了Castle Windsor常用介绍以及其在ABP项目的应用介绍 欢迎各位拍砖,有关ABP的介绍请看阳光铭睿 博客 AutoMa ...
- Codeforces 487C. Prefix Product Sequence 逆+结构体
意甲冠军: 对于数字n, 他询问是否有1~n置换 这种布置能够在产品上模每个前缀n 有可能0~n-1 解析: 通过观察1肯定要在首位,n一定要在最后 除4意外的合数都没有解 其它质数构造 a[i]=i ...
- 酒旗少年狂暖风,至0基本的前端开发project教师们学习计划
酒旗风暖少年狂,为0基础前端开发project师做学习计划 夜幕降暂时.走到一张废弃已久的书桌前,打开台灯,看到书桌上已经布满灰尘,而桌上的那盆羸弱的文竹已经枝繁叶茂.我擦干净了桌面,坐了下来,把买回 ...
- The Swift Programming Language中国完整版
近来的ios的swift语言似乎火了.我没有objectc基金会,但在此之前有c随着java在...的基础上.从几天开始学习ios的swift语言,晚发表在博客形式.下面是英文版本翻译swif图书.还 ...
- Oracle 11g oracle客户端(32位)PL/SQL develepment的安装配置
Oracle 11g+oracle客户端(32位)+PL/SQL develepment的安装配置 之前一直想学Oracle,可是就是安装配置Oracle一直未成功,让人很苦恼,特别是什么监听器什么的 ...
- Oracle 多行转多列
Oracle 多行转多列,列值转为列名 前段时间做调查问卷,客户创建自定义问卷内容,包括题目和选项内容; 之后需要到处问卷明细,,,,麻烦来咯 于是到网上到处搜索,没有直接结果;于是又找各种相似的 ...
- jdk和cglib简单理解(转)
之前使用cglib的时候不需要将classLoader作为参数传入,但动态代理却要,带着这个疑惑进入这个方法: Proxy.newProxyInstance(classLoader, interfac ...
- UI測试内容
我们在实际工作其中,针对web应用程序,也就是常常所说的B/S系统,能够从例如以下方面来进行用户界面測试: 导航測试 导航描写叙述了用户在一个页面内操作的方式,在不同的用户接口控制之间,比如butto ...
- DP 水的问题
假设的自然数N的K随机二进制表示是不相邻的两个相邻的数字.那么我们说这个数字是K好一些. 乞讨L地点K十六进制数K的相当数量的数. 例如K = 4.L = 2什么时候.整个K好一些11.13.20.2 ...