在软件开发领域,测试驱动开发(Test Driven Development ,TDD )技术在逐渐为广大开发者所接受,它是在添加新代码 之前让你的测试代码出错的一种开发技术。在开始编写代码之前首先要写你的测试代码,然后再编写代码让你的测试通过,可以想象,如果没有一个好的单元测试工 具,这项工作其实是无法完成的。相信很多.NET 开发人员者对于开源的NUnit 都不陌生,但是它并不能很好的与Visual Studio.NET IDE 集成起来。
这里我将向大家介绍另一款优秀的单元测试工具——TestDriven.NET 2.0 。它是以插件的形式集成在Visual Studio.NET IDE 中的 单元测试工具,能够兼容各种Visual Studio 版本,并且集成了多种单元测试框架诸如NUnit ,MbUnit ,以及Visual Studio Team System 适配器等。
TestDriven.NET 的前身是NUnitAddIn ,由Jamie Cansdale 大 师开发,一开始作者只是想做一个NUnit 插件集成到Visual Studio 中,经过多次版本更新,NUnitAddIn 在2004 年9 月底更名为TestDriven.NET ,并在当年的12 月初发布 了它的第一个Release 版本,即TestDriven.NET 1.0 。由于它在开发中的出色表现,让很多开发人员期待它的下一个版本的发布,这一等待却足足等了两年,在今年的10 月底,终于迎来了姗姗来迟的TestDriven.NET 2.0 版 本。然而这一等待却是值得的,在2.0 中,给我们带来了太多的惊喜,它集成了.NET Reflector 、NConver 、NConverExplorer 、TypeMock.NET 等, 功能更加强大,下面我将一一介绍TestDriven.NET 2.0 中涌现出的这些亮点。
安装完TestDriven.NET 2.0 后,重新启动Visual Studio 2005 ,可以发现在Visual Studio.NET IDE 的 右键菜单中会多出一些新项,所有的操作都是直接通过这些右键菜单来完成。我们先来编写一小段简单的测试代码:
[Test ]
public void TestMethodRun()
{
ClassA ca = new ClassA ();
int expected = 2;
int result = ca.GetResult();
Assert .AreEqual(expected, result);
}
在以前如果您使用NUnit 进行单元测试,对于这样一个简单的测试,首先需要运行NUnit GUI ,加载当前的程序集,并点击Run 按钮运行测试,测试通过后再回到IDE 继续编写代码:
现在有了TestDriven.NET 2.0 ,就不会有这么麻烦了,我们不用额外运行任何程序,只需要在Visual Studio 2005 IDE 中右击并选择Run Test 菜单命令就可以运行测试,日常开发中我们都已经习惯了在IDE 中进行这种操 作,所以这样更加符合我们的开发习惯,也不用频繁在应用程序之间切换窗口。
TestDriven.NET 2.0 测试的结果将在Output 窗 口中显示。
稍微写过一点单元测试 代码的朋友都知道,实际开发中的每一个测试,测试方法都不可能只有一个断言(Assert ),在以 前使用NUnit 时,测试如果通不过,我们无法根据错误信息快速准确的定位到代码中的某一个断言, 有了TestDriven.NET 2.0 ,当测试出现错误时,您只需要在Output 窗口中双击错误提示,就可以直接定位到出错的断言代码行,极大的提高了排错的效率。
在上面的测试代码中, 我们仅仅是点击了右键菜单Run Test ,并没有选择运行哪一个测试方法或者测试类,那么TestDriven.NET 2.0 是如何选择并运行测试的呢?其实这跟我们点击鼠标的位置有关,点击鼠标 的位置如果在标记为Test 的测试方法内,它只会执行该测试方法;点击鼠标的位置如果在方法之外而 在标记为TestFixture 的类里面,它会执行该类中所有标记为Test 的测试方法;点击鼠标的位置如果在类之外,而在某一个命名空间里面,则它会执行该命名空间下所有标记为TestFixture 的测试类。
在开发中,我们常常会 遇到跟踪一些变量的值和某些方法的返回值,一般情况下大家都会选择使用Command Window , 这种方式需要通过输入一些命令来查看,未免有些麻烦。TestDriven.NET 2.0 为我们 提供了一键操作的功能,让我们可以随时随地的跟踪方法的返回值等,而不用输入任何命令。在普通的方法中TestDriven.NET 2.0 也可以运行测试(Run Test ),不管方法的作用域是public 还是private ,是实例方法还是static 方法。如果测试方法是实例方法,它会使用默认的构造函数创建一个类的对象,在执行测试完成时再释 放掉该对象。如果方法有返回值,将会显示在Output 窗口中。运行下面的测试:
会在Output 窗口中输出:
在运行测试的过程中, 有时候需要调试跟踪一些信息,如果使用NUnit ,由于它没有集成在IDE 中,也就无法设置断点。在TestDriven.NET 2.0 提 供了以Debug 模式进行测试,可以在测试代码中设置断点,并进行跟踪,这时我们需要选择Test with | Debugger 菜单命令。
在运行测试过程中,有 时候会有创建一些应用程序域,但并没有被释放,这样会有部分程序集被加载该应用程序域中并且已经锁定,所以可能会造成编译失败。这时需要释放掉一些测试进 程来可以继续编译。在任务栏的右下角,所有的测试进程都会显示在这里,点击右键,选择Stop 菜单 命令可以结束测试进程。
.NET Reflector 是一个.NET 平台 下的类浏览器和反编译工具,我们可以用它来浏览程序集的类和方法,可以分析由这些类和方法生成的中间语言 (MSIL) ,相信大家都用过,但它仍然是作为一个独立的工具存在的,在TestDriven.NET 2.0 中它被很好的集成在了Visual Studio.NET IDE ,通过右 键菜单,就可以直接使用.NET Reflector 。
在做单元测试的时候, 我们总是希望知道自己的代码有多少覆盖到了,哪些代码是没有测试到的,如果没有安装Visual Studio Team System ,无法用Team Converage 进行代码覆盖率的分 析,这时使用大名鼎鼎的NConver 是一个不错的选择,并且使用NconverExplorer 可以去查看分析结果,所有这些仍然需要运行新的应用程序,TestDriven.NET 2.0 把这一切都集成到了IDE 中, 可以在没有安装Team System 的环境下使用Team Converage ,也不用单独安装NConver 。
重复运行测试可以说是TestDriven.NET 2.0 的 一大亮点。TestDriven.NET2.0 出现之前,如果在运行测试的过程中,测试代码不能通 过,这时我们会花几秒钟时间去修改测试代码,并再次运行测试,但是往往却发现找不到刚才测试的是哪个代码块,这时您可以使用重复运行测试命令,不管你鼠标 点击的位置在哪儿,它都会直接运行上一次的测试。
在.NET 平台下,单元测试框架有很多,TestDriven.NET 2.0 不可能把所有的单元测试框架尽收其中,但是它提供了一种很好的可插拔的机制。当你安装一种新的测试框架后,TestDriven.NET 2.0 会自动在它的菜单中出现这一项,在测试项目上点右键选择Test With 菜单命令,可以选择使用哪一个单元测试框架。
在做单元测试的过程 中,最麻烦的部分就是我们的测试代码必须依赖于系统的其他部分,如数据库等。这时候我们会使用一类替代品来代替这些真实的对象,即使用Mock 对象,幸运的是我们不用每次都去实现自己的Mock 对 象,在.NET 平台下,有很多款Mock 对 象的框架供我们选择。在TestDriven.NET 2.0 出现之前,使用哪个Mock 对象的框架,我们需要去下载并安装它们,在TestDriven.NET 2.0 中已经集成了TypeMock.NET 框架,这使得我们可以很方便的直接 使用而不用再去自行选择。
如果只做单元测试,我 会选择Nunit ;如果要进行类库反编译,我会选择.NET Relector ;如果要分析代码的覆盖率,我会选择NConver ;如果要查看 代码覆盖率的分析结果,我会选择NConverExplorer ,但如果要把以上所有的事情集成在IDE 中一起去做,那毫无疑问,我会选择TestDriven.NET 2.0 。希望我这篇文章能抛砖引玉,引领大家使用TestDriven.NET 2.0 , 走上单元测试之路。当然对于TestDriven.NET 2.0 它的专业版和开发版已经开始收 费,只有个人版仍然可以免费下载使用。
有关TestDriven.NET 2.0 的详细信息请访问:http://www.testdriven.net/