1、第9章 调试、测试与程序的打包、部署第第9章章 调试、测试与程序的调试、测试与程序的打包、部署打包、部署9.1 调试简介调试简介9.2 测试简介测试简介9.3 程序的打包和部署程序的打包和部署9.4 综合案例综合案例:简易计算器简易计算器制作、测试、打包和部署制作、测试、打包和部署本章小结本章小结练习与作业练习与作业上机部分上机部分(九九)第9章 调试、测试与程序的打包、部署 学习目标学习目标 理解如何调试应用程序和排除错误 掌握如何测试C#应用程序 了解测试和调试的区别 掌握Help类及其使用方法 掌握HelpProvider控件的使用方法 掌握各种部署应用程序的方法第9章 调试、测试与程序
2、的打包、部署9.1 调调 试试 简简 介介 每当提及我们为提高软件质量做了多少工作时,开发人员总会拍胸脯保证没有问题。然而,你要永远记住一个不争的事实:程序中可能始终存在缺陷,代码中存在错误也是难免的。毕竟,程序是人设计的,无论程序员有多么优秀,程序可能总有一些问题。因此,调试、修复缺陷成为系统开发最耗时、最昂贵的过程,尤其是在大型软件开发过程中。我们将搜索和消除错误的过程称为调试。调试是软件开发过程中最艰巨的脑力劳动。调试开始时,软件开发者仅仅面对着错误的征兆,然而在问题的外部现象和内在原因之间往往并没有明显的联系,在组成程序的密密麻麻第9章 调试、测试与程序的打包、部署的元素中,每一个都可
3、能是错误的根源。如何能在浩如烟海的程序元素中找到有错误的那个(或几个)元素,这是调试过程中最关键的技术问题。9.1.1 调试的必要性调试的必要性 什么是缺陷呢?如果你的应用程序安装在任何机器上都会崩溃,你就会知道程序肯定有缺陷。发布后的系统有无缺陷呢?你可能听说过,应用程序的用户抱怨说程序没有正常工作时,这就发生了比较微妙的错误。例如,在一个大型电费管理信息系统的运行中,操作员月末统计出的多张报表,发现相互矛盾的数据;当去图书馆借书,发现需要的图书已全部被别人借走时,你希望图书馆管理人员帮助你“预约借书”,可她操作后,计算机系统却显示“预约不成功”,然后终止应用程序。第9章 调试、测试与程序的
4、打包、部署 实际上,我们把许多不同类型的问题都称为缺陷。数据被破坏是其中级别最高的,但是应用程序由于设计缺陷或者甚至界面设计混乱也会导致用户操作上的一些不方便(即不符合用户的习惯或不符合约定俗成)。例如:你在Microsoft Outlook中使用快捷键Ctrl+F,弹出的可能不是预期的查找窗口,而是转发窗口(在几乎所有的应用程序中,快捷键Ctrl+F都会调出查找窗口)。软件系统的开发包括一系列生产活动,其中由人带来的错误因素非常多。程序代码编写完成后,可能你的程序不能正常执行;程序执行后,可能还存在不影响应用程序执行的小问题,例如按钮的拼写错误等,它们也可能是导致应用程序完全失败的大错误(通
5、常称为致命错误),致命错误包括妨碍代码编 第9章 调试、测试与程序的打包、部署译的简单错误(语法错误),但更多的错误比较棘手,它们只在运行期间发生。另外,错误可能会更微妙。如果遗漏了一个请求的字段,应用程序就不能给数据库添加一个记录;或者在其他有限制的环境中把错误的数据添加到记录中,应用程序逻辑在某些方面有瑕疵时,就会产生这样的错误,这类错误称为语义错误(也称为逻辑错误)。此时需要跟踪代码,试着确定发生了什么问题,应如何修改代码,使之按希望的那样去做。程序产生的错误分为以下三种:(1)语法错误。因程序设计人员对程序设计语言的理解不够,或程序设计基本功不扎实造成的错误。程序员在编码时不遵循语法规
6、则时,就产生语法错误,发生语法错误后编译不能通过。比如,在C#要求每行代码的行末必须加分号,漏掉分号被视为语法错误。第9章 调试、测试与程序的打包、部署 (2)运行时错误。当应用系统运行时,操作员试图执行无法实施的错误时,会产生运行时错误。比如,在程序运行过程中用0作除数,这种情况就会产生运行时错误。(3)逻辑错误。是指那些虽然不违反系统规则,但是却不合逻辑或不合题目语义的错误。这些错误系统一般很难自行检测出来,比如统计报表数据出错等。表9-1列出了不同错误类型的对比。第9章 调试、测试与程序的打包、部署表表9-1 不同错误类型的对比不同错误类型的对比 语法错误 运行时错误 逻辑错误 语句的语
7、法错误,包括:拼写错误、缺少语句、缺少括号、调用参数类型不匹配等 除零错误、内存泄漏、安全异常 错误算法、不符合业务规则的处理、计算公式出错 编译时确定 运行时确定 运行时确定 容易确定和改正 难以调试 难以调试 第9章 调试、测试与程序的打包、部署9.1.2 调试过程调试过程 在调试模式下运行程序时,并不仅仅是运行编写好的代码。调试程序包含了应用程序的符号信息,这些信息包含在.pdb文件中,这些文件位于计算机的Debug目录下。它们可以执行许多有用的操作,包括(但不限于这些操作):给VS调试信息;在执行应用程序的过程中,查看(并编辑)变量的值;暂停程序、重新启动程序;在代码的某个位置自动暂停
8、程序的执行;一次执行程序中的一行代码;在应用程序的执行过程中,监视变量内容的修改;第9章 调试、测试与程序的打包、部署 在运行期间修改变量的内容;测试函数的测试调用。在VS中,应用程序可以处于运行状态,也可以处于中断模式,即暂停正常的执行。很多程序员常常调用输出函数(如Console.WriteLine()等)来获得操作的额外反馈消息。这是一种有效的调试技术,但麻烦的是,一旦找到问题,必须从代码中删除这些输出函数的调用,这是一个相当繁琐的工作。为简化此过程,Visual Studio 提供了调试器。Visual Studio调试器是一个功能强大的工具,它使您可以观察程序的运行时行为并确定逻辑错
9、误的位置。该调试器可用于所有的 Visual Studio编程语言及其关联的库。使用调试器,可以中断(或挂起)程序的执行以检查代码,计算和编辑程序中的变量,查看寄存第9章 调试、测试与程序的打包、部署器,查看从源代码创建的指令,以及查看应用程序所占用的内存空间。Visual Studio还提供了新功能“编辑并继续”,使用此功能您可以在调试时对代码进行更改,然后继续执行。Visual Studio 调试器提供了一个用于访问调试器工具的“调试”菜单。调试器的窗口和对话框显示有关您的程序的信息,并允许您输入附加的信息。您可以通过按F1键获得关于任何窗口或对话框的帮助。“调试”菜单如图9-1所示。第9
10、章 调试、测试与程序的打包、部署图9-1 “调试”菜单 第9章 调试、测试与程序的打包、部署 使用调试器,我们可以在源代码行或函数上设置断点,断点通知调试器应在某点上中断应用程序并暂停执行。这时程序员可以做一些检查,比如检查变量的值,如需要还可以修改变量的值,也可以检查其他情况。当程序调试时,从菜单中选择“调试”“启动调试”。这样就在调试器中启动了程序,并因而激活了断点。一旦程序遇到断点,调试器便会接收程序的控制。这时会有一个箭头指向当前执行的行。要单步调试一行代码,可以选择“调试”“逐语句”,并观察光标是否移到下一行。“调试”“逐过程”命令允许您单步执行将要调用的函数。提示:F5是启动调试的
11、快捷键。第9章 调试、测试与程序的打包、部署 在Visual Studio 2005中设置简单断点可通过快捷菜单和通过“调试”菜单两种方法进行。1通过快捷菜单设置简单断点通过快捷菜单设置简单断点 (1)在源代码窗口中,单击要设置断点的那行可执行代码。(2)在快捷菜单中,转到“断点”,然后选择“插入断点”,如图9-2所示。程序运行遇到断点时,会在设置断点所在的代码行暂停运行,如图9-3所示。提示提示:F9是插入断点的快捷键。第9章 调试、测试与程序的打包、部署图9-2 通过快捷菜单设置简单断点 第9章 调试、测试与程序的打包、部署图9-3 程序在断点处暂停运行第9章 调试、测试与程序的打包、部署
12、 2通过通过“调试调试”菜单设置简单断点菜单设置简单断点 (1)在源窗口中,单击要设置断点的那行可执行代码。(2)从“调试”菜单中选择“切换断点”。如图9-4所示。普通断点标志符号说明如下:实心标志符号指示断点已启用;空心标志符号指示断点已禁用。第9章 调试、测试与程序的打包、部署图9-4 通过“调试”菜单设置简单断点 第9章 调试、测试与程序的打包、部署9.1.3 Visual Studio.NET中的调试工具中的调试工具 调试器提供了很多变量窗口,这些窗口用于显示、计算和编辑变量与表达式。每个变量窗口都是网格窗口,其中包含三列:“名称”、“值”和“类型”。“名称”列包含变量名称或表达式。“
13、值”和“类型”列显示变量或表达式的值和数据类型。可在调试过程使用的变量窗口包括:“局部变量”窗口、“自动”窗口、“监视”窗口、“快速监视”窗口和“即时”窗口。调试程序时,从菜单中选择“调试”“窗体”“监视(W)”“监视1”,即可显示“监视1”窗口,如图9-5所示。类似地,可显示其他变量窗口。第9章 调试、测试与程序的打包、部署图9-5 显示变量窗口第9章 调试、测试与程序的打包、部署 下面分别说明这几个窗口。1“局部变量局部变量”窗口窗口显示对于当前上下文或范围来说位于当前作用域的变量。通常,这是当前正在执行的过程或函数。调试器自动填充此窗口。在Visual C#中,如果禁用了异常助手,一旦出
14、现活动异常,则“局部变量”窗口还会显示伪变量$exception,用以查看异常的详细信息。图9-6所示为“局部变量”窗口。当程序执行从一个方法转向另一个方法时,“局部变量”窗口中显示的变量也会改变,只显示局部变量。可以修改字符串和数值变量的值,当值被改变后,新值显示为红色,应用程序将使用新值继续执行。第9章 调试、测试与程序的打包、部署图9-6 “局部变量”窗口 第9章 调试、测试与程序的打包、部署 2“自动自动”窗口窗口 显示在当前代码行和上一代码行中使用的变量。对于本机 C+,“自动”窗口还显示函数返回值。与“局部变量”窗口类似,“自动”窗口是由调试器自动填充的。图9-7所示为“自动”窗口
15、。3“监视监视”窗口窗口 在“监视”窗口中可以添加被监视值的变量。此外,还可以添加变量以外的其他内容。您可以添加调试器所能识别的任何有效表达式。Visual Studio 2005有多个“监视”窗口,其编号为Watch1到Watch4。执行程序时,“监视”窗口会自动跟踪变量的值,如果被监视的变量不在当前执行的方法内,将会显示“操作符超出范围”的错误。图9-8所示为“监视”窗口。第9章 调试、测试与程序的打包、部署图9-7 自动窗口第9章 调试、测试与程序的打包、部署图9-8 “监视”窗口第9章 调试、测试与程序的打包、部署 4“快速监视快速监视”窗口窗口 “快速监视”在概念上类似于“监视”窗口
16、,但是“快速监视”每次只能显示一个变量或表达式。如果需要快速查看变量或表达式而不想打开“监视”窗口,则可以使用“快速监视”。但是,很多用户会发现新的增强的数据提示功能强大,以至于他们越来越少地使用到“快速监视”。图9-9所示为“快速监视”窗口。虽然“快速监视”是对话框,但其工作方式很像其他变量窗口。除了特别指出的不同之处以外,这一节所描述的过程适用于“快速变量”对话框以及其他变量窗口。第9章 调试、测试与程序的打包、部署图9-9 “快速监视”窗口 第9章 调试、测试与程序的打包、部署 5“即时即时”窗口窗口 “即时”窗口可用于检查变量的值、给变量赋值以及运行一行代码。要查找变量的值,需要在变量
17、前添加问号“?”,如图9-10所示。要想改变变量的值,在此窗口键入赋值代码,然后按下Enter键。调试器具有许多其他工具的功能。例如,可以使用“寄存器”窗口显示寄存器的内容,还可以获得内存转储和关于进程中线程的信息。下面介绍Visual Studio 2005中编译调试新功能“可视化调试器”。第9章 调试、测试与程序的打包、部署图9-10 “即时”窗口第9章 调试、测试与程序的打包、部署6可视化调试器可视化调试器(Debugging Visualizers)在调试的时候,我们常会遇到的较麻烦的问题,就是有的时候很难看到某些参数的值。比如,你设置了一个断点去监测一个DataSet,并且想看Dat
18、aSet里的每个DataTable的数据,这在Visual Studio 2003中是十分麻烦的,必须在“自动/局部变量”的监视窗口中,一层层地展开去看其值。在Visual Studio 2005中,为解决这个问题,新增加了“可视化调试器”的功能,该功能可以在调试状态时,很容易方便地以各类形式查看各种参数。在各类监视窗口中,比如在“局部变量”窗口、“自动”窗口、“监视”窗口、“快速监视”窗口中,都可以调用可视化调试器,方法是在某个需要监视的参数旁边,点击放大镜图标,就可以在打开的可视化调试器中看到该参数的详细情况,如图9-11所示。利用可视化调试器,就可以很方便地查看诸如DataSet类型的数
19、据。第9章 调试、测试与程序的打包、部署图9-11 “可视化调试器”窗口第9章 调试、测试与程序的打包、部署9.1.4 实例实例1:在:在VS.NET 2005中调试程序中调试程序 使用VS.NET 2005的“编辑并继续”功能,可以一边进行调试一边在中断模式下更改代码。不必停止并重新启动调试会话,即可应用更改。(1)使用C#建立一个WinForms的应用程序,命名为Debug。(2)为窗体添加如表9-2所示的控件。程序主界面如图9-12所示。我们要实现的功能是,在文本框输入一些信息后,点按钮,会弹出一个消息框,显示的是刚才输入的信息。第9章 调试、测试与程序的打包、部署表表9-2 窗体的控件
20、列表窗体的控件列表控 件 名称 文本 标签 label1 姓名:文本框 textBox1 按钮 button1 显示信息 第9章 调试、测试与程序的打包、部署图9-12 程序主界面第9章 调试、测试与程序的打包、部署 (3)编写的代码如下所示,假设我们出现了一个小错误,把textbox1.text的内容当作字符串的一部分了,所以显示不出用户输入的信息。private void button1_Click(object sender,EventArgs e)MessageBox.Show(Welcome textBox1.Text to Edit and Continue.);现在,如果我们在调
21、试时遇到了这个错误,则可以使用“编辑并继续”功能来进行改正。(4)按F7键切换到代码视图,在MessageBox.Show这一行设置断点。第9章 调试、测试与程序的打包、部署 (5)按F5键运行程序,当在文本框输入字符串时,由于设置了中断,光标停留在MessageBox.Show这一行上。(6)修改代码:private void button1_Click(object sender,EventArgs e)MessageBox.Show(Welcome +textBox1.Text+to Edit and Continue!);(7)按F5键继续运行。将显示正确的结果,而不需要使用以往的“停
22、止调试”的功能,即先停止调试,再修改程序。第9章 调试、测试与程序的打包、部署9.2 测测 试试 简简 介介 测试是检查应用程序以确保它满足设计要求并满足质量期望值的过程。测试可以完成许多事,但最重要的是可以衡量正在开发的软件的质量。这种观点预先假定软件中存在等待被发现的缺陷,并且这种观点很少被反驳,甚至也不存在争议。开发周期中,越早使测试成为投入的一部分越好。规划对于成功的测试投入至关重要,部分是因为它在设置预期值方面需要做大量的工作。在测试计划中考虑预算、日程和性能可以增加测试确实发生的可能性,并且高效实惠。规划还确保不会忘记或重复测试,除非重复测试对于回归测试是必要的。第9章 调试、测试
23、与程序的打包、部署 Visual Studio Team Edition for Testers 中提供了一套与 Microsoft Visual Studio 2005紧密集成的测试工具。这些工具不仅能在自身的测试框架中工作,还可在软件生命周期工具的更大框架中发挥作用。Team Edition for Testers使您能够创建、管理、编辑和运行测试,还可以获取和存储测试结果。除代码覆盖率度量外,Visual Studio 中还集成了几种测试类型,其中包括:单元测试:单元测试调用类的方法(传递参数),并验证返回值是否为期望的值。既可以手动编写单元测试,也可以自动生成它们。第9章 调试、测试与
24、程序的打包、部署 Web测试:Web测试由您使用Microsoft Internet Explorer在一个浏览器会话中记录的一系列有序的HTTP请求组成。也可以创建一个编码Web测试,并在其中添加更多高级功能,例如流控制。可以让测试报告有关它所请求的页或站点的特定细节,例如某个特定的页是否包含指定的字符串。在记录Web测试之后,可以对它进行编辑以分配一些属性,例如思考时间和数据源(用于存储要发送到Web服务器的数据)。Web测试在用作负载测试的一部分时功能会变得更为强大。负载测试:可以使用负载测试来封装非手动测试(即,单元测试、Web 测试、一般测试和顺序测试),然后使用虚拟用户同时运行它们
25、。在负载下运行这些测试将生成测试结果,包括用表格和图形方式显示的性能计数器和其他计数器。第9章 调试、测试与程序的打包、部署 例如,通过将Web测试添加到负载测试,可以模拟数百个用户与某个特定的 Web 应用程序同时进行交互的情形。这可以让您在部署Web应用程序之前,测试其在峰值使用情况下的行为,以便找出应用程序的错误或瓶颈。手动测试:手动测试可用于逐句通过任务,通常适用于那些很难或无法自动运行的测试,例如计算机与其电源之间的连接已中断的测试。当需要由测试工程师而非自动脚本来完成测试任务时,应使用此测试类型。可以使用Visual Studio IDE运行测试。此外,还可以从命令行运行手动测试之
26、外的测试组或任何单项测试。因为测试工具与Visual Studio Team System的其他部分集成在一起,所以可以将结果发布到数据库,生成趋势和历史记录第9章 调试、测试与程序的打包、部署报告,对比不同种类的数据,查看通过测试发现了多少bug(指软件中存在的错误)及具体都有哪些错误。下面介绍 Team System testing tools 的一些基本内容,包括如何创建和使用测试,可用的测试类型以及如何配置测试工具等。1先决条件先决条件 如果你是测试人员,可以通过选择测试人员配置文件设置启动 Visual Studio。方法如下:(1)首次启动 Visual Studio 2005 时
27、,将出现“选择默认环境设置”对话框,如图9-15所示。(2)单击“Team Test 设置”。(3)单击“启动Visual Studio”。第9章 调试、测试与程序的打包、部署 (4)启动后将显示“测试管理器”,如图9-13所示。注意注意:如果启动Visual Studio时没有出现图9-13所示对话框,请打开运行命令“开始”“运行”,键入devenv/resetuserdata,再按回车(如图9-14所示)。然后再次启动Visual Studio,即可出现“选择默认环境设置”对话框(如图9-15所示)。第9章 调试、测试与程序的打包、部署图9-13 选择“Team Test 设置”后的VS界
28、面第9章 调试、测试与程序的打包、部署图9-14 “运行”窗口 第9章 调试、测试与程序的打包、部署 图9-15 “选择默认环境设置”窗口第9章 调试、测试与程序的打包、部署 这样使用测试人员配置文件启动Visual Studio之后,将移除某些特定于编程的菜单和窗口,使测试员可以集中精力执行以下任务:创建非编程测试,管理现有测试及运行测试。下面讲述进行测试的一般步骤:(1)创建测试项目。(2)创建新测试,进行测试环境的设置。选择测试类型,比如单元测试、Web测试、负载测试。(3)打开测试进行编辑测试。(4)运行测试。(5)测试运行之后,需要记录测试结果。对于单元测试,在第(3)步时,需要“创
29、作单元测试”;对于Web 测试,第(3)步时需要“记录Web测试”。第9章 调试、测试与程序的打包、部署 2创建测试项目创建测试项目 创建测试项目的常用方法有以下三种:添加测试时创建测试项目。新建测试时,可以新建一个要向其中添加测试的测试项目,也可以将测试添加到现有的测试项目中。在生成单元测试时创建测试项目。生成单元测试时,可以新建一个要向其中添加测试的测试项目,也可以将测试添加到现有的测试项目中。使用“添加新项目”对话框。使用此方法,可以选择测试项目的编程语言,如果计划编写测试代码(如在单元测试或编码Web测试中),则编程语言的选择就可能很重要。第9章 调试、测试与程序的打包、部署 1)添加
30、测试时创建测试项目 (1)单击“测试”“新建测试”。随即出现“添加新测试”对话框。如图9-16所示。(2)在“添加到测试项目”下,选择用于创建新测试项目的选项之一。例如,单击“创建新Visual C#测试项目”。如图9-17所示。(3)在“模板”窗格中,选择要添加的测试类型,单击“确定”。(4)随即出现“新建测试项目”对话框。输入新测试项目的名称或接受默认名称,然后单击“创建”,如图9-18所示。测试项目及其包含的测试将添加到解决方案中。第9章 调试、测试与程序的打包、部署图9-16 “新建测试”菜单第9章 调试、测试与程序的打包、部署图9-17 “添加新测试”窗口 第9章 调试、测试与程序的
31、打包、部署图9-18 “新建测试项目”对话框第9章 调试、测试与程序的打包、部署 2)在生成单元测试时创建测试项目 (1)打开一个源代码文件。(2)右击某命名空间、类或方法,在弹出菜单中单击“创建单元测试”,如图9-19所示。(3)随即出现“创建单元测试”对话框。可以更改要为其生成单元测试的选定成员。在“输出项目”下,选择用于创建新测试项目的选项之一。例如,单击“创建新的Visual C#测试项目”,如图9-20所示。(4)单击“生成”。随即出现“新建测试项目”对话框。(5)输入新测试项目的名称或接受默认名称,然后单击“创建”。该测试项目以及新单元测试将添加到解决方案中。第9章 调试、测试与程
32、序的打包、部署图9-19 “创建单元测试”菜单第9章 调试、测试与程序的打包、部署图9-20“创建单元测试”对话框 第9章 调试、测试与程序的打包、部署 3)使用“添加新项目”对话框创建测试项目 (1)在“解决方案资源管理器”中右击解决方案,指向“添加”,然后单击“新建项目”。(2)出现“添加新项目”对话框。“项目类型”窗格包含一个“测试项目节点”和多个特定编程语言节点。如果希望新测试项目使用特定编程语言,请展开该语言的节点;否则,展开“测试项目”。如果展开了一个语言节点,则单击“测试”;如果展开了“测试项目”节点,则单击“测试文档”,如图9-21所示。(3)在“模板”之下单击“测试项目”。(
33、4)单击“确定”。测试项目将添加到解决方案中。第9章 调试、测试与程序的打包、部署图9-21 “添加新项目”对话框第9章 调试、测试与程序的打包、部署 3生成单元测试生成单元测试 在生成单元测试时,为在“创建单元测试”对话框中选择的每个码方法创建一个单元测试方法。生成的每个单元测试调用Inconclusive方法,由于测试未实现,这将使测试失败。下一步是添加有意义的代码以检测所测试的方法是否正确运行,从而实现测试。下面介绍生成单元测试的步骤:(1)有四种方法可以生成单元测试。在解决方案资源管理器中右击某个测试项目,指向“添加”,再单击“单元测试”。第9章 调试、测试与程序的打包、部署 在解决方
34、案资源管理器中右击某个测试项目,指向“添加”,再单击“新建测试”。在“添加新测试”对话框中单击“单元测试向导”,再单击“确定”。在“测试管理器”窗口或“测试视图”窗口中右击窗口图面,再单击“新建测试”。在“添加新测试”对话框中单击“单元测试向导”,再单击“确定”。在Visual Studio代码编辑器中,右击要测试的命名空间、类或方法并选择“创建单元测试”(如图9-19所示)。第9章 调试、测试与程序的打包、部署 (2)将显示“创建单元测试”对话框(如图9-20所示)。为选定的所有成员或类生成单元测试,并可以选择要在其中放置生成的单元测试的项目。(3)(可选)单击“筛选器”可更改显示的类和成员
35、层次结构的内容。(4)(可选)通过选中其复选框选择其他代码元素。(5)(可选)单击“设置”可更改此测试的生成配置设置。例如,可以为要生成的测试文件、类和方法更改默认的命名选项。(6)单击“确定”。第9章 调试、测试与程序的打包、部署 4编辑单元测试编辑单元测试 编辑单元测试的原因有两个:您正在手动创作一个单元测试;或者正在编辑一个新生成的单元测试。虽然您可以运行新生成的单元测试,但是由于它们是使用默认内容创建的,为了使测试能够产生有意义的结果,必须使用适当的值对默认内容进行初始化。在生成的单元测试中,通常需要自定义变量的赋值以及一个或多个Assert语句。(1)在单元测试中使用Assert语句
36、。默认情况下,每个生成的单元测试都调用 Inconclusive 方法,这会导致测试失败,因为测试实际上仍未实现。下一步是第9章 调试、测试与程序的打包、部署添加有意义的代码,以检查所测试的方法的操作是否正确。实现该目的的典型方法是生成一个值,然后使用 Assert.AreEqual 语句将该值与预期值进行比较。不包含Assert语句的单元测试只要不超时,并且不引发意外的异常,就会自动通过。这是单元测试框架不包含Assert.Pass语句的原因。(2)编辑现有单元测试。在解决方案资源管理器中的测试项目中,找到并打开包含该单元测试的文件,然后找到要编辑的单元测试方法,如图9-22所示。第9章 调
37、试、测试与程序的打包、部署图9-22 单元测试文件第9章 调试、测试与程序的打包、部署 在方法中找到变量赋值部分,为每个变量赋给相应的值。对于新生成的测试,将使用“To-Do”语句标记变量赋值部分,旨在提醒您需要自定义这些赋值语句。例如,以下便是需要编辑的一个典型的赋值语句:string target.owner=null;/TODO:Initialize to an appropriate value 若要了解什么样的值才是适当的,应考虑以下几个方面:在调用方法之前这些变量可能被初始化为的值;在调用方法时这些变量值可能发生的更改以及期望的结果。(3)在方法中查找并编辑Assert语句。如果需
38、要,添加其他Assert语句。Assert.AreEqual(期望值,实际运行结果,错误信息);第9章 调试、测试与程序的打包、部署 5运行单元测试运行单元测试 (1)在“测试视图”中选择需要测试的项目,单击右键,在弹出的菜单中单击“运行选中的测试”;如图9-23所示。(2)在“测试结果”窗口的“结果”列中,当测试运行时,测试状态将显示为“正在运行”。测试运行完成后,测试的结果将更改为“通过”,如图9-24所示。(3)如测试“未通过”,可在“测试结果”窗口中双击表示测试的行,将打开“测试结果详细信息”页,其中显示以下错误消息:“Assert.AreEqual失败。期望值:,实际值:”。此时需要
39、检查被测试的方法。第9章 调试、测试与程序的打包、部署图9-23 运行选中的测试第9章 调试、测试与程序的打包、部署图9-24“测试结果”窗口第9章 调试、测试与程序的打包、部署 【例9-1】使用VS2005进行银行项目的单元测试。(1)使用C#建立一个“类库”,命名为Bank。(2)在Class1.es类文件中编写下列代码:using System;namespace BankAccountNS public class BankAccount private string m_customerName;private double m_balance;public BankAccount(
40、string customerName,double balance)m_customerName=customerName;m_balance=balance;第9章 调试、测试与程序的打包、部署 public string CustomerName get return m_customerName;public double Balance get return m_balance;/借:取款;模拟编码人员逻辑错误 public void Debit(double amount)if(amount m_balance)throw new ArgumentOutOfRangeExcepti
41、on(amount);m_balance-=amount;第9章 调试、测试与程序的打包、部署 public static void Main()BankAccount ba=new BankAccount(Mr.Bryan Walton,11.99);ba.Credit(5.77);ba.Debit(11.22);Console.WriteLine(Current balance is$0,ba.Balance);第9章 调试、测试与程序的打包、部署 下面我们来进行借、贷两个方法的单元测试:(3)在Class1.cs文件的“BankAccount”类中,滚动到“Debit()”方法。右击“D
42、ebit()”方法,并选择“创建单元测试”(如图9-19所示)。(4)这时将显示“创建单元测试”对话框。在程序集的类和成员层次结构树中,选择“Debit()”方法。并选择“Credit()”方法(如图9-20所示)。对于“输出项目”,单击“创建新的Visual C#测试项目”。然后在“生成单元测试”对话框中单击“确定”。(5)在“新建测试项目”对话框中接受默认名称,然后单击“创建”(如图9-21所示)。这时将创建一个名为TestProject1的项目,该项目将显示在解决方案资源管理器中。第9章 调试、测试与程序的打包、部署 (6)选中Class1Tests.cs中,为要测试的变量指定值。然后滚
43、动到“DebitTest”方法。在此可以看到指示要设置的变量(即“customerName”、“balance”和“amount”)的三个/TODO行。复制代码:public void DebitTest()string customerName=Mr.Bryan Walton;/客户名 double balance=11.99;/帐户余额 double amount=11.22;第9章 调试、测试与程序的打包、部署 /新建立一个帐户:户名,帐户金额11.99 BankAccount target=new BankAccount(customerName,balance);/取款11.22 t
44、arget.Debit(amount);Assert.Inconclusive(无法验证不返回值的方法。);应使用什么值?若要回答此问题,必须知道应用程序运行时要使用的值。上述代码首先新建立一个帐户:户名Mr.Bryan Walton,帐户金额11.99;取款11.22后,帐户金额应为0.77。第9章 调试、测试与程序的打包、部署 (7)修改“Assert”语句的测试方法。替换代码:public void DebitTest()/修改前 /Assert.Inconclusive(无法验证不返回值的方法。);/修改后 Assert.AreEqual(System.Convert.ToDouble
45、(0.77),target.Balance,0.05);此语句将预期结果(0.77)与调用“BankAccount”类的“Balance”方法所产生的实际结果进行比较。如果两个值不相等,则“Assert”返回“False”,从而使测试失败。第9章 调试、测试与程序的打包、部署 注意注意:此“Assert”语句还包括第三个参数“delta”,其值为0.05。在“Assert.AreEqual”方法的此重载中需要该delta参数;它可以补偿“Doubles”等浮点型所固有的舍入错误。(8)运行和自定义单元测试。使用“测试管理器”窗口或“测试视图”窗口运行DebitTest单元测试。在“测试结果”窗
46、口的“结果”列中,测试状态将显示为“正在运行”,如图9-25所示。测试结束后,显示CreditTest单元测试“通过”;DebitTest单元测试“失败”;需要对DebitTest方法进行调试、修改。第9章 调试、测试与程序的打包、部署图9-25 测试结果 第9章 调试、测试与程序的打包、部署9.3 程序的打包和部署程序的打包和部署9.3.1 帮助文件的制作帮助文件的制作 完善用户帮助系统可以增加软件的易用性,以便用户更快、更方便、更容易使用帮助系统进行自我学习或排除疑惑。只有包含帮助文件,应用系统才能称得上是完整的系统。Visual Studio提供了对两种不同帮助系统的支持:传统的Wind
47、ows帮助系统(WinHelp);HTML帮助(CHM帮助)。目前chm格式的帮助文件已经成为主流。可以使用HTML Help Workshop提供的工具创建HTML Help 联机帮助系统。另外,也可使用第三方工具对HTML Help文件进行编辑和编译。第9章 调试、测试与程序的打包、部署 1Help类类 应用程序可使用Help对象,以HTML帮助的格式显示已编译的帮助文件(.chm)或HTML文件。无法创建Help类的新实例。若要为应用程序提供“帮助”,请调用静态ShowHelp和 ShowHelpIndex方法。ShowHelp方法用于显示指定 URL 处的帮助文件的“目录”选项卡,其语
48、法如下:Help.ShowHelp(Control parent,String url)其中,parent参数标识要显示的帮助文件的父级控件;url参数为帮助文件的路径和名称。url可以是文件URL(如d:appHelp.htm),也可以是HTTP URL(如http:/appHelp.htm)。第9章 调试、测试与程序的打包、部署 【例例9-2】显示帮助文件。(1)新建一个Windows应用程序,将其名称设置为Demo9-2。(2)将默认创建的窗体名称设置为frm9_2,将窗体的标题设置为“范例9-2”。(3)在主窗口中添加一个Button控件。将Button控件的Name属性设置为“sho
49、wHelp”,Text属性设置为“帮助信息”。(4)在showHelp控件的Click事件中编写下列代码:private void showHelp_Click(object sender,System.EventArgs e)Help.ShowHelp(this,.calc.chm)(5)保存项目,并“生成解决方案”。第9章 调试、测试与程序的打包、部署 (6)将C:WINDOWSHelp目录下的calc.chm复制到该项目的子目录binDebug下。(7)运行项目。ShowHelpIndex 方法“显示帮助索引”用于显示帮助文件的“索引”选项卡,其语法如下:public static vo
50、id ShowHelpIndex(Control parent,string url)其调用方法与ShowHelp相似。【例例9-3】显示帮助文件的“索引”选项卡。(1)新建一个Windows应用程序,将其名称设置为Demo9-3。(2)将默认创建的窗体名称设置为frm9_3,将窗体的标题设置为“范例9-3”。第9章 调试、测试与程序的打包、部署 (3)在主窗口中添加一个Button控件。将Button控件的Name属性设置为“showHelp”,Text属性设置为“帮助信息”。(4)在showHelp控件的 Click事件中编写下列代码:private void showIndex_Clic