福建白癜风医院 https://m.39.net/baidianfeng/a_4292721.htmlC#核心开发-第20单元-VS单元测试C#核心开发-单元测试1.什么是单元测试?单元测试是指编写代码来验证开发者编写代码的正确性,一般单元测试也是由开发者完成的,自已开发单元测试代码来检查自己编写代码的通过性。定义:单元测试是开发人员编写的、用于检测在特定条件下目标代码正确性的代码,单元测试是代码级别的测试。做为一个合格的.NET程序开发者,单元测试是必须具备的技能,一个稍复杂的软件项目,存在多种情况的路径执行代码,如果没有一一全部验证过,就不能保证自己开发的代码%没有问题。因此,我们要对自己开发的代码负责任,BUG先在自己这里消灭掉,让自己提交的代码质量非常高,这样也能让自己的编程生涯更有自信。在VisualStudio中内置了多种测试工具,这里我们使用基于.NETFramework的单元测试项目来测试代码。单元测试是以项目的方式存在的,与应用程序项目结合在一起对代码进行单元测试,保证每开发一个方法都是经过测试的合格程序。这里我们使用微软提供的单元测试项目,来测试C#语言编写的代码,详细讲解一下如何创建单元测试项目、编写C#代码、编写测试代码和测试C#方法的结果。2.创建单元测试项目首先创建一个名称为:Yidosoft.Edu.Csharp.UnitTest的.NET控制台应用程序,然后再创建一个基于该控制台项目的单元测试项目,用于对控制台应用程序代码的测试。在解决方案的名称上右击:VS添加项目图1中的“Yidosoft.Edu.Csharp.UnitTest”是一个控制台应用程序项目。然后点击“新建项目”,如图2所示:创建单元测试项目在图2中选择“单元测试项目(.NETFramework)”,点击“下一步”按钮,如图3所示:配置新项目在图3中输入单元测试项目名称为:Yidosoft.Edu.Csharp.UnitTest.Test,点击“创建”按钮,如图4所示:单元测试项目3.添加项目引用当测试项目创建完成之后,还要添加具体要测试哪个应用程序项目的代码,需要添加该应用程序项目的引用:在图4的“Yidosoft.Edu.Csharp.UnitTest.Test”测试项目中右击“引用”,如图5所示:添加引用在图5中点击“添加引用”,如图6所示:选择引用在图6左侧的“项目”中选择“Yidosoft.Edu.Csharp.UnitTest”控制台应用程序项目,点击“确定”按钮。如图7所示:已添加引用在图7中,已看到控制台应用程序项目的程序集已添加到单元测试项目的“引用”中了。4.编写控制台应用程序代码下面我们在控制台应用程序:Yidosoft.Edu.Csharp.UnitTest的Main()方法中编写一行C#代码,用于向控制台输出一段文本内容:在图8中,只是在Main()方法中输出一段文本内容,非常简单的一段代码,那现在我们不想运行此控制台应程序,就能够保证Main()方法中的代码就能输出“你好,小强。”Mian()方法无参数。要想实现在不运行程序的情况下,就能够保证编写的方法逻辑是正确的,可以使用单元测试来完成。注意:图8的Program类和Main()要使用public访问修饰符,因为此项目要在测试项目中使用,属于公开访问。5.编写单元测试代码现在我们在Yidosoft.Edu.Csharp.UnitTest.Test单元测试项目UnitTest1类下的TestMethod1()方法下编写如下测试代码,用于对.NET控制台应用程序Main()方法进行测试:由于Program类中的Main()方法是向控制台写入(显示)文本,写入之后我们就能看到文本内容了。这个写入操作需要System.IO命名空间,所以首先添加此命名空间:然后在TestMethod1()方法中编写如下代码:图10的代码说明如下:(1).定义了一个string类型的变量,用于存放我们测试的预期值,最终正确的结果。这里就是测试Main()方法向控制台写入的是否是此文本内容。(2).实现用于将信息写入字符串的System.IO.TextWriter。信息存储在基础StringBuilder中。(3).SetOut()方法用于设置一个新的标准输出。(4).Main()方法是静态方法,直接使用类名.方法名()访问,表示这是一个输出操作,与SetOut()配合。(5).此时sw对象就是Main()方法执行的结果了,就是输出的文本内容。(6).使用Assert.AreEqual()比较Main()方法执行的结果与我们指定的expected变量的值是否相等,如果相等,则测试成功,说明Main()方法逻辑没有问题。6.运行单元测试单元测试代码编写完成之后,就可以运行了,运行C#测试代码,查看是否全部通过,如果全部通过,表示测试通过,说明开发者编写的代码没有问题。在VS中,可以非常方便的运行单元测试,找到顶部工具栏的“测试”菜单,如图11所示:单元测试项目在图11中依次点击“测试”à“Windows”à“测试资源管理器”,打开“测试资源管理器”,如图12所示:未运行测试图12左侧红线框住的就是“测试资源管理器”,其中带有感叹号的表示未运行单元测试。在图12中点击第一个“绿色的播放”,此按钮是“全部运行”按钮,快捷键是Ctrl+R+A,旁边第二个“绿色播放”是“运行所选测试”按钮。这里点击“全部运行”按钮,如图13所示:正在运行单元测试在图13中出现了滚动的小横线,表示正在运行单元测试,过一会儿运行完成:测试已全部通过在图14中,当出现了打对号的图标,表示测试全部通过,并且在测试方法TestMethod1()上也出现了打对号的小图标,表示此测试方法运行成功,测试的代码已通过测试。如果我们修改一下expected变量的值:在图15中,我们设置的预期值变成了“你好,小花。”,再次全部运行一下单元测试:单元测试运行失败图16的单元测试失败了,因为测试的Main()方法输出的结果与我们的预期值不一样,所以需要修改一下Main()方法:在图17中,将Main()方法中的“小强”修改为“小花”,再运行一下单元测试:图18的测试结果全部通过了,并且测试的Main()方法上还显示“通过”字样。7.测试返回类型和参数的方法在上面我们测试的是Main()方法,该方法是C#静态方法,且无参数,无返回类型。现在我们来测试一个非静态方法,不仅带有参数,还具有返回类型。在Program类中编写如下方法:图19是一个非常简单的实例方法GetData(),该方法返回类型是string,参数是string类型的name,返回一行简单的文本内容。返回到单元测试项目:Yidosoft.Edu.Csharp.UnitTest.Test,在UnitTest1类中编写如下测试方法:图20的TestMethod2()方法的代码说明如下:(1).对于带参数的方法,最重要的就是实际参数值,传入不同的实际参数值,返回的结果也是不一样的。(2).string类型的name变量相当于方法参数。(3).sting类型的expected变是是方法返回的预期结果。(4).GetData()是实例方法,需要实例化类才可以调用。(5).var类型的result是方法返回的实际结果值,并将name参数传入。(6).最后使用Assert.AreEqual()方法比较预期值和实际值是否相等,如果相等,则测试通过。运行一下单元测试:从图21上看,TestMethod2()测试方法具有绿色的对勾,表示测试通过,说明GetData()方法的功能逻辑代码是正确的。使用单元测试的如好处如下:(1).有效代码重构:重构是指在不改变软件系统外部行为的前提下,改善它的内部结构,目的是防止因需求变化而对程序修改带来越来越多的BUG,通过重构造调整内部结构,从而能够适应各种修改。如果单元测试做的好,则重构后运行一遍单元测试,如果未发现新的BUG,表示这次重构很成功,测试为先,持续重构作为良好开发习惯被越来越多的人所采纳。(2).优化设计:可能为了更好的单元测试,去优化设计,并可解除大量的耦合。(3).持久使用:一次编写单元测试,后期一下可用,并且可记录每次的测试记录。(4).快速测试:不需部署到设备上,快速测试结果,保证部署不会有问题。
转载请注明原文网址:http://www.helimiaopu.com/cxtx/cxtx/12845.html |