《Visual C# NET程序设计基础》课件009_第1页
《Visual C# NET程序设计基础》课件009_第2页
《Visual C# NET程序设计基础》课件009_第3页
《Visual C# NET程序设计基础》课件009_第4页
《Visual C# NET程序设计基础》课件009_第5页
已阅读5页,还剩180页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第9章调试、测试与程序的打包、部署9.1调试简介 9.2测试简介 9.3程序的打包和部署

9.4综合案例:简易计算器制作、测试、打包和部署

本章小结

练习与作业

上机部分(九)

学习目标●理解如何调试应用程序和排除错误●掌握如何测试C#应用程序●了解测试和调试的区别●掌握Help类及其使用方法●掌握HelpProvider控件的使用方法●掌握各种部署应用程序的方法9.1调试简介

每当提及我们为提高软件质量做了多少工作时,开发人员总会拍胸脯保证没有问题。然而,你要永远记住一个不争的事实:程序中可能始终存在缺陷,代码中存在错误也是难免的。毕竟,程序是人设计的,无论程序员有多么优秀,程序可能总有一些问题。因此,调试、修复缺陷成为系统开发最耗时、最昂贵的过程,尤其是在大型软件开发过程中。我们将搜索和消除错误的过程称为调试。

调试是软件开发过程中最艰巨的脑力劳动。调试开始时,软件开发者仅仅面对着错误的征兆,然而在问题的外部现象和内在原因之间往往并没有明显的联系,在组成程序的密密麻麻的元素中,每一个都可能是错误的根源。如何能在浩如烟海的程序元素中找到有错误的那个(或几个)元素,这是调试过程中最关键的技术问题。9.1.1调试的必要性

什么是缺陷呢?如果你的应用程序安装在任何机器上都会崩溃,你就会知道程序肯定有缺陷。发布后的系统有无缺陷呢?你可能听说过,应用程序的用户抱怨说程序没有正常工作时,这就发生了比较微妙的错误。例如,在一个大型电费管理信息系统的运行中,操作员月末统计出的多张报表,发现相互矛盾的数据;当去图书馆借书,发现需要的图书已全部被别人借走时,你希望图书馆管理人员帮助你“预约借书”,可她操作后,计算机系统却显示“预约不成功”,然后终止应用程序。

实际上,我们把许多不同类型的问题都称为缺陷。数据被破坏是其中级别最高的,但是应用程序由于设计缺陷或者甚至界面设计混乱也会导致用户操作上的一些不方便(即不符合用户的习惯或不符合约定俗成)。例如:你在MicrosoftOutlook中使用快捷键Ctrl+F,弹出的可能不是预期的查找窗口,而是转发窗口(在几乎所有的应用程序中,快捷键Ctrl+F都会调出查找窗口)。

软件系统的开发包括一系列生产活动,其中由人带来的错误因素非常多。程序代码编写完成后,可能你的程序不能正常执行;程序执行后,可能还存在不影响应用程序执行的小问题,例如按钮的拼写错误等,它们也可能是导致应用程序完全失败的大错误(通常称为致命错误),致命错误包括妨碍代码编译的简单错误(语法错误),但更多的错误比较棘手,它们只在运行期间发生。另外,错误可能会更微妙。如果遗漏了一个请求的字段,应用程序就不能给数据库添加一个记录;或者在其他有限制的环境中把错误的数据添加到记录中,应用程序逻辑在某些方面有瑕疵时,就会产生这样的错误,这类错误称为语义错误(也称为逻辑错误)。此时需要跟踪代码,试着确定发生了什么问题,应如何修改代码,使之按希望的那样去做。

程序产生的错误分为以下三种:

(1)语法错误。因程序设计人员对程序设计语言的理解不够,或程序设计基本功不扎实造成的错误。程序员在编码时不遵循语法规则时,就产生语法错误,发生语法错误后编译不能通过。比如,在C#要求每行代码的行末必须加分号,漏掉分号被视为语法错误。

(2)运行时错误。当应用系统运行时,操作员试图执行无法实施的错误时,会产生运行时错误。比如,在程序运行过程中用0作除数,这种情况就会产生运行时错误。

(3)逻辑错误。是指那些虽然不违反系统规则,但是却不合逻辑或不合题目语义的错误。这些错误系统一般很难自行检测出来,比如统计报表数据出错等。表9-1列出了不同错误类型的对比。

表9-1不同错误类型的对比9.1.2调试过程

在调试模式下运行程序时,并不仅仅是运行编写好的代码。调试程序包含了应用程序的符号信息,这些信息包含在.pdb文件中,这些文件位于计算机的Debug目录下。它们可以执行许多有用的操作,包括(但不限于这些操作):

●给VS调试信息;

●在执行应用程序的过程中,查看(并编辑)变量的值;

●暂停程序、重新启动程序;

●在代码的某个位置自动暂停程序的执行;

●一次执行程序中的一行代码;

●在应用程序的执行过程中,监视变量内容的修改;

●在运行期间修改变量的内容;

●测试函数的测试调用。

在VS中,应用程序可以处于运行状态,也可以处于中断模式,即暂停正常的执行。很多程序员常常调用输出函数(如Console.WriteLine()等)来获得操作的额外反馈消息。这是一种有效的调试技术,但麻烦的是,一旦找到问题,必须从代码中删除这些输出函数的调用,这是一个相当繁琐的工作。

为简化此过程,VisualStudio提供了调试器。VisualStudio调试器是一个功能强大的工具,它使您可以观察程序的运行时行为并确定逻辑错误的位置。该调试器可用于所有的VisualStudio编程语言及其关联的库。使用调试器,可以中断(或挂起)程序的执行以检查代码,计算和编辑程序中的变量,查看寄存器,查看从源代码创建的指令,以及查看应用程序所占用的内存空间。VisualStudio还提供了新功能“编辑并继续”,使用此功能您可以在调试时对代码进行更改,然后继续执行。

VisualStudio调试器提供了一个用于访问调试器工具的“调试”菜单。调试器的窗口和对话框显示有关您的程序的信息,并允许您输入附加的信息。您可以通过按F1键获得关于任何窗口或对话框的帮助。“调试”菜单如图9-1所示。

图9-1“调试”菜单

使用调试器,我们可以在源代码行或函数上设置断点,断点通知调试器应在某点上中断应用程序并暂停执行。这时程序员可以做一些检查,比如检查变量的值,如需要还可以修改变量的值,也可以检查其他情况。当程序调试时,从菜单中选择“调试”→“启动调试”。这样就在调试器中启动了程序,并因而激活了断点。一旦程序遇到断点,调试器便会接收程序的控制。这时会有一个箭头指向当前执行的行。要单步调试一行代码,可以选择“调试”→“逐语句”,并观察光标是否移到下一行。“调试”→“逐过程”命令允许您单步执行将要调用的函数。

提示:F5是启动调试的快捷键。

在VisualStudio2005中设置简单断点可通过快捷菜单和通过“调试”菜单两种方法进行。

1.通过快捷菜单设置简单断点

(1)在源代码窗口中,单击要设置断点的那行可执行代码。

(2)在快捷菜单中,转到“断点”,然后选择“插入断点”,如图9-2所示。程序运行遇到断点时,会在设置断点所在的代码行暂停运行,如图9-3所示。

提示:F9是插入断点的快捷键。图9-2通过快捷菜单设置简单断点图9-3程序在断点处暂停运行2.通过“调试”菜单设置简单断点

(1)在源窗口中,单击要设置断点的那行可执行代码。

(2)从“调试”菜单中选择“切换断点”。如图9-4所示。普通断点标志符号说明如下::实心标志符号指示断点已启用;空心标志符号指示断点已禁用。图9-4通过“调试”菜单设置简单断点9.1.3VisualStudio.NET中的调试工具

调试器提供了很多变量窗口,这些窗口用于显示、计算和编辑变量与表达式。每个变量窗口都是网格窗口,其中包含三列:“名称”、“值”和“类型”。“名称”列包含变量名称或表达式。“值”和“类型”列显示变量或表达式的值和数据类型。可在调试过程使用的变量窗口包括:“局部变量”窗口、“自动”窗口、“监视”窗口、“快速监视”窗口和“即时”窗口。

调试程序时,从菜单中选择“调试”→“窗体”→“监视(W)”→“监视1”,即可显示“监视1”窗口,如图9-5所示。类似地,可显示其他变量窗口。图9-5显示变量窗口

下面分别说明这几个窗口。

1.“局部变量”窗口显示对于当前上下文或范围来说位于当前作用域的变量。通常,这是当前正在执行的过程或函数。调试器自动填充此窗口。在VisualC#中,如果禁用了异常助手,一旦出现活动异常,则“局部变量”窗口还会显示伪变量$exception,用以查看异常的详细信息。图9-6所示为“局部变量”窗口。当程序执行从一个方法转向另一个方法时,“局部变量”窗口中显示的变量也会改变,只显示局部变量。可以修改字符串和数值变量的值,当值被改变后,新值显示为红色,应用程序将使用新值继续执行。图9-6“局部变量”窗口

2.“自动”窗口

显示在当前代码行和上一代码行中使用的变量。对于本机C++,“自动”窗口还显示函数返回值。与“局部变量”窗口类似,“自动”窗口是由调试器自动填充的。图9-7所示为“自动”窗口。

3.“监视”窗口

在“监视”窗口中可以添加被监视值的变量。此外,还可以添加变量以外的其他内容。您可以添加调试器所能识别的任何有效表达式。VisualStudio2005有多个“监视”窗口,其编号为Watch1到Watch4。

执行程序时,“监视”窗口会自动跟踪变量的值,如果被监视的变量不在当前执行的方法内,将会显示“操作符超出范围”的错误。图9-8所示为“监视”窗口。图9-7自动窗口图9-8“监视”窗口

4.“快速监视”窗口

“快速监视”在概念上类似于“监视”窗口,但是“快速监视”每次只能显示一个变量或表达式。如果需要快速查看变量或表达式而不想打开“监视”窗口,则可以使用“快速监视”。但是,很多用户会发现新的增强的数据提示功能强大,以至于他们越来越少地使用到“快速监视”。图9-9所示为“快速监视”窗口。

虽然“快速监视”是对话框,但其工作方式很像其他变量窗口。除了特别指出的不同之处以外,这一节所描述的过程适用于“快速变量”对话框以及其他变量窗口。图9-9“快速监视”窗口

5.“即时”窗口

“即时”窗口可用于检查变量的值、给变量赋值以及运行一行代码。要查找变量的值,需要在变量前添加问号“?”,如图9-10所示。要想改变变量的值,在此窗口键入赋值代码,然后按下Enter键。调试器具有许多其他工具的功能。例如,可以使用“寄存器”窗口显示寄存器的内容,还可以获得内存转储和关于进程中线程的信息。下面介绍VisualStudio2005中编译调试新功能“可视化调试器”。图9-10“即时”窗口6.可视化调试器(DebuggingVisualizers)

在调试的时候,我们常会遇到的较麻烦的问题,就是有的时候很难看到某些参数的值。比如,你设置了一个断点去监测一个DataSet,并且想看DataSet里的每个DataTable的数据,这在VisualStudio2003中是十分麻烦的,必须在“自动/局部变量”的监视窗口中,一层层地展开去看其值。在VisualStudio2005中,为解决这个问题,新增加了“可视化调试器”的功能,该功能可以在调试状态时,很容易方便地以各类形式查看各种参数。

在各类监视窗口中,比如在“局部变量”窗口、“自动”窗口、“监视”窗口、“快速监视”窗口中,都可以调用可视化调试器,方法是在某个需要监视的参数旁边,点击放大镜图标,就可以在打开的可视化调试器中看到该参数的详细情况,如图9-11所示。

利用可视化调试器,就可以很方便地查看诸如DataSet类型的数据。图9-11“可视化调试器”窗口9.1.4实例1:在VS.NET2005中调试程序

使用VS.NET2005的“编辑并继续”功能,可以一边进行调试一边在中断模式下更改代码。不必停止并重新启动调试会话,即可应用更改。

(1)使用C#建立一个WinForms的应用程序,命名为Debug。

(2)为窗体添加如表9-2所示的控件。程序主界面如图9-12所示。我们要实现的功能是,在文本框输入一些信息后,点按钮,会弹出一个消息框,显示的是刚才输入的信息。表9-2窗体的控件列表图9-12程序主界面

(3)编写的代码如下所示,假设我们出现了一个小错误,把textbox1.text的内容当作字符串的一部分了,所以显示不出用户输入的信息。

privatevoidbutton1_Click(objectsender,EventArgse){MessageBox.Show("WelcometextBox1.TexttoEditandContinue.");}

现在,如果我们在调试时遇到了这个错误,则可以使用“编辑并继续”功能来进行改正。

(4)按F7键切换到代码视图,在MessageBox.Show这一行设置断点。

(5)按F5键运行程序,当在文本框输入字符串时,由于设置了中断,光标停留在MessageBox.Show这一行上。

(6)修改代码:

privatevoidbutton1_Click(objectsender,EventArgse){MessageBox.Show("Welcome"+textBox1.Text+"toEditandContinue!");}(7)

按F5键继续运行。将显示正确的结果,而不需要使用以往的“停止调试”的功能,即先停止调试,再修改程序。

9.2测试简介

测试是检查应用程序以确保它满足设计要求并满足质量期望值的过程。

测试可以完成许多事,但最重要的是可以衡量正在开发的软件的质量。这种观点预先假定软件中存在等待被发现的缺陷,并且这种观点很少被反驳,甚至也不存在争议。

开发周期中,越早使测试成为投入的一部分越好。规划对于成功的测试投入至关重要,部分是因为它在设置预期值方面需要做大量的工作。在测试计划中考虑预算、日程和性能可以增加测试确实发生的可能性,并且高效实惠。规划还确保不会忘记或重复测试,除非重复测试对于回归测试是必要的。

VisualStudioTeamEditionforTesters中提供了一套与MicrosoftVisualStudio2005紧密集成的测试工具。这些工具不仅能在自身的测试框架中工作,还可在软件生命周期工具的更大框架中发挥作用。

TeamEditionforTesters使您能够创建、管理、编辑和运行测试,还可以获取和存储测试结果。除代码覆盖率度量外,VisualStudio中还集成了几种测试类型,其中包括:

●单元测试:单元测试调用类的方法(传递参数),并验证返回值是否为期望的值。既可以手动编写单元测试,也可以自动生成它们。

Web测试:Web测试由您使用MicrosoftInternetExplorer在一个浏览器会话中记录的一系列有序的HTTP请求组成。也可以创建一个编码Web测试,并在其中添加更多高级功能,例如流控制。可以让测试报告有关它所请求的页或站点的特定细节,例如某个特定的页是否包含指定的字符串。

●在记录Web测试之后,可以对它进行编辑以分配一些属性,例如思考时间和数据源(用于存储要发送到Web服务器的数据)。Web测试在用作负载测试的一部分时功能会变得更为强大。

●负载测试:可以使用负载测试来封装非手动测试(即,单元测试、Web测试、一般测试和顺序测试),然后使用虚拟用户同时运行它们。在负载下运行这些测试将生成测试结果,包括用表格和图形方式显示的性能计数器和其他计数器。

例如,通过将Web测试添加到负载测试,可以模拟数百个用户与某个特定的Web应用程序同时进行交互的情形。这可以让您在部署Web应用程序之前,测试其在峰值使用情况下的行为,以便找出应用程序的错误或瓶颈。

●手动测试:手动测试可用于逐句通过任务,通常适用于那些很难或无法自动运行的测试,例如计算机与其电源之间的连接已中断的测试。当需要由测试工程师而非自动脚本来完成测试任务时,应使用此测试类型。

可以使用VisualStudioIDE运行测试。此外,还可以从命令行运行手动测试之外的测试组或任何单项测试。

因为测试工具与VisualStudioTeamSystem的其他部分集成在一起,所以可以将结果发布到数据库,生成趋势和历史记录报告,对比不同种类的数据,查看通过测试发现了多少bug(指软件中存在的错误)及具体都有哪些错误。

下面介绍TeamSystemtestingtools的一些基本内容,包括如何创建和使用测试,可用的测试类型以及如何配置测试工具等。

1.先决条件

如果你是测试人员,可以通过选择测试人员配置文件设置启动VisualStudio。方法如下:

(1)首次启动VisualStudio2005时,将出现“选择默认环境设置”对话框,如图9-15所示。

(2)单击“TeamTest设置”。

(3)单击“启动VisualStudio”。(4)

启动后将显示“测试管理器”,如图9-13所示。

注意:如果启动VisualStudio时没有出现图9-13所示对话框,请打开运行命令“开始”→“运行”,键入devenv/resetuserdata,再按回车(如图9-14所示)。然后再次启动VisualStudio,即可出现“选择默认环境设置”对话框(如图9-15所示)。图9-13选择“TeamTest设置”后的VS界面图9-14“运行”窗口图9-15“选择默认环境设置”窗口

这样使用测试人员配置文件启动VisualStudio之后,将移除某些特定于编程的菜单和窗口,使测试员可以集中精力执行以下任务:创建非编程测试,管理现有测试及运行测试。

下面讲述进行测试的一般步骤:

(1)创建测试项目。

(2)创建新测试,进行测试环境的设置。选择测试类型,比如单元测试、Web测试、负载测试。

(3)打开测试进行编辑测试。

(4)运行测试。

(5)测试运行之后,需要记录测试结果。

对于单元测试,在第(3)步时,需要“创作单元测试”;对于Web测试,第(3)步时需要“记录Web测试”。

2.创建测试项目

创建测试项目的常用方法有以下三种:

●添加测试时创建测试项目。新建测试时,可以新建一个要向其中添加测试的测试项目,也可以将测试添加到现有的测试项目中。

●在生成单元测试时创建测试项目。生成单元测试时,可以新建一个要向其中添加测试的测试项目,也可以将测试添加到现有的测试项目中。

●使用“添加新项目”对话框。使用此方法,可以选择测试项目的编程语言,如果计划编写测试代码(如在单元测试或编码Web测试中),则编程语言的选择就可能很重要。1)添加测试时创建测试项目

(1)单击“测试”→“新建测试”。随即出现“添加新测试”对话框。如图9-16所示。

(2)在“添加到测试项目”下,选择用于创建新测试项目的选项之一。例如,单击“创建新VisualC#测试项目”。如图9-17所示。

(3)在“模板”窗格中,选择要添加的测试类型,单击“确定”。

(4)随即出现“新建测试项目”对话框。输入新测试项目的名称或接受默认名称,然后单击“创建”,如图9-18所示。测试项目及其包含的测试将添加到解决方案中。图9-16“新建测试”菜单图9-17“添加新测试”窗口图9-18“新建测试项目”对话框2)在生成单元测试时创建测试项目

(1)打开一个源代码文件。

(2)右击某命名空间、类或方法,在弹出菜单中单击“创建单元测试”,如图9-19所示。

(3)随即出现“创建单元测试”对话框。可以更改要为其生成单元测试的选定成员。在“输出项目”下,选择用于创建新测试项目的选项之一。例如,单击“创建新的VisualC# 测试项目”,如图9-20所示。

(4)单击“生成”。随即出现“新建测试项目”对话框。

(5)输入新测试项目的名称或接受默认名称,然后单击“创建”。该测试项目以及新单元测试将添加到解决方案中。图9-19“创建单元测试”菜单图9-20“创建单元测试”对话框3)使用“添加新项目”对话框创建测试项目

(1)在“解决方案资源管理器”中右击解决方案,指向“添加”,然后单击“新建项目”。

(2)出现“添加新项目”对话框。“项目类型”窗格包含一个“测试项目节点”和多个特定编程语言节点。如果希望新测试项目使用特定编程语言,请展开该语言的节点;否则,展开“测试项目”。如果展开了一个语言节点,则单击“测试”;如果展开了“测试项目”节点,则单击“测试文档”,如图9-21所示。

(3)在“模板”之下单击“测试项目”。

(4)单击“确定”。测试项目将添加到解决方案中。图9-21“添加新项目”对话框

3.生成单元测试

在生成单元测试时,为在“创建单元测试”对话框中选择的每个码方法创建一个单元测试方法。生成的每个单元测试调用Inconclusive方法,由于测试未实现,这将使测试失败。下一步是添加有意义的代码以检测所测试的方法是否正确运行,从而实现测试。

下面介绍生成单元测试的步骤:

(1)有四种方法可以生成单元测试。

●在解决方案资源管理器中右击某个测试项目,指向“添加”,再单击“单元测试”。

●在解决方案资源管理器中右击某个测试项目,指向“添加”,再单击“新建测试”。在“添加新测试”对话框中单击“单元测试向导”,再单击“确定”。

●在“测试管理器”窗口或“测试视图”窗口中右击窗口图面,再单击“新建测试”。在“添加新测试”对话框中单击“单元测试向导”,再单击“确定”。

●在VisualStudio代码编辑器中,右击要测试的命名空间、类或方法并选择“创建单元测试”(如图9-19所示)。

(2)将显示“创建单元测试”对话框(如图9-20所示)。为选定的所有成员或类生成单元测试,并可以选择要在其中放置生成的单元测试的项目。

(3)

(可选)单击“筛选器”可更改显示的类和成员层次结构的内容。

(4)

(可选)通过选中其复选框选择其他代码元素。

(5)

(可选)单击“设置”可更改此测试的生成配置设置。例如,可以为要生成的测试文件、类和方法更改默认的命名选项。

(6)单击“确定”。

4.编辑单元测试

编辑单元测试的原因有两个:您正在手动创作一个单元测试;或者正在编辑一个新生成的单元测试。虽然您可以运行新生成的单元测试,但是由于它们是使用默认内容创建的,为了使测试能够产生有意义的结果,必须使用适当的值对默认内容进行初始化。

在生成的单元测试中,通常需要自定义变量的赋值以及一个或多个Assert语句。

(1)在单元测试中使用Assert语句。

默认情况下,每个生成的单元测试都调用Inconclusive方法,这会导致测试失败,因为测试实际上仍未实现。下一步是添加有意义的代码,以检查所测试的方法的操作是否正确。实现该目的的典型方法是生成一个值,然后使用Assert.AreEqual语句将该值与预期值进行比较。

不包含Assert语句的单元测试只要不超时,并且不引发意外的异常,就会自动通过。这是单元测试框架不包含Assert.Pass语句的原因。

(2)编辑现有单元测试。

●在解决方案资源管理器中的测试项目中,找到并打开包含该单元测试的文件,然后找到要编辑的单元测试方法,如图9-22所示。图9-22单元测试文件

●在方法中找到变量赋值部分,为每个变量赋给相应的值。

对于新生成的测试,将使用“To-Do”语句标记变量赋值部分,旨在提醒您需要自定义这些赋值语句。例如,以下便是需要编辑的一个典型的赋值语句:

stringtarget.owner=null;//TODO:Initializetoanappropriatevalue

若要了解什么样的值才是适当的,应考虑以下几个方面:在调用方法之前这些变量可能被初始化为的值;在调用方法时这些变量值可能发生的更改以及期望的结果。

(3)在方法中查找并编辑Assert语句。如果需要,添加其他Assert语句。

Assert.AreEqual(期望值,实际运行结果,错误信息);

5.运行单元测试

(1)在“测试视图”中选择需要测试的项目,单击右键,在弹出的菜单中单击“运行选中的测试”;如图9-23所示。

(2)在“测试结果”窗口的“结果”列中,当测试运行时,测试状态将显示为“正在运行”。测试运行完成后,测试的结果将更改为“通过”,如图9-24所示。

(3)如测试“未通过”,可在“测试结果”窗口中双击表示测试的行,将打开“测试结果详细信息”页,其中显示以下错误消息:“Assert.AreEqual失败。期望值:<...>,实际值:<...>”。

此时需要检查被测试的方法。图9-23运行选中的测试图9-24“测试结果”窗口【例9-1】使用VS2005进行银行项目的单元测试。

(1)使用C#建立一个“类库”,命名为Bank。

(2)

在Class1.es类文件中编写下列代码:

usingSystem;

namespaceBankAccountNS

{

publicclassBankAccount

{

privatestringm_customerName;

privatedoublem_balance;

publicBankAccount(stringcustomerName,doublebalance){m_customerName=customerName;m_balance=balance;}publicstringCustomerName{get{returnm_customerName;}}publicdoubleBalance{get{returnm_balance;}}//借:取款;模拟编码人员逻辑错误

publicvoidDebit(doubleamount){if(amount<0){thrownewArgumentOutOfRangeException("amount");}m_balance+=amount;}//贷:存款;模拟编码人员逻辑错误

publicvoidCredit(doubleamount){if(amount>m_balance){thrownewArgumentOutOfRangeException("amount");}m_balance-=amount;}publicstaticvoidMain(){BankAccountba=newBankAccount("Mr.BryanWalton",11.99);ba.Credit(5.77);ba.Debit(11.22);Console.WriteLine("Currentbalanceis${0}",ba.Balance);}}}

下面我们来进行借、贷两个方法的单元测试:

(3)在Class1.cs文件的“BankAccount”类中,滚动到“Debit()”方法。右击“Debit()”方法,并选择“创建单元测试”(如图9-19所示)。

(4)这时将显示“创建单元测试”对话框。在程序集的类和成员层次结构树中,选择“Debit()”方法。并选择“Credit()”方法(如图9-20所示)。

对于“输出项目”,单击“创建新的VisualC#测试项目”。然后在“生成单元测试”对话框中单击“确定”。

(5)

在“新建测试项目”对话框中接受默认名称,然后单击“创建”(如图9-21所示)。这时将创建一个名为TestProject1的项目,该项目将显示在解决方案资源管理器中。(6)

选中Class1Tests.cs中,为要测试的变量指定值。然后滚动到“DebitTest”方法。在此可以看到指示要设置的变量(即“customerName”、“balance”和“amount”)的三个//TODO行。复制代码:

publicvoidDebitTest(){stringcustomerName="Mr.BryanWalton";//客户名

doublebalance=11.99;//帐户余额

doubleamount=11.22;

//新建立一个帐户:户名,帐户金额11.99BankAccounttarget=newBankAccount(customerName,balance);//取款11.22target.Debit(amount);Assert.Inconclusive("无法验证不返回值的方法。");}

应使用什么值?若要回答此问题,必须知道应用程序运行时要使用的值。

上述代码首先新建立一个帐户:户名"Mr.BryanWalton",帐户金额11.99;取款11.22后,帐户金额应为0.77。(7)

修改“Assert”语句的测试方法。替换代码:

publicvoidDebitTest()

{

…//修改前

//Assert.Inconclusive("无法验证不返回值的方法。");//修改后

Assert.AreEqual((System.Convert.ToDouble(0.77)),target.Balance,0.05);}

此语句将预期结果(0.77)

与调用“BankAccount”类的“Balance”方法所产生的实际结果进行比较。如果两个值不相等,则“Assert”返回“False”,从而使测试失败。

注意:此“Assert”语句还包括第三个参数“delta”,其值为0.05。在“Assert.AreEqual”方法的此重载中需要该delta参数;它可以补偿“Doubles”等浮点型所固有的舍入错误。

(8)运行和自定义单元测试。使用“测试管理器”窗口或“测试视图”窗口运行DebitTest单元测试。

在“测试结果”窗口的“结果”列中,测试状态将显示为“正在运行”,如图9-25所示。测试结束后,显示CreditTest单元测试“通过”;DebitTest单元测试“失败”;需要对DebitTest方法进行调试、修改。图9-25测试结果9.3

程序的打包和部署9.3.1帮助文件的制作

完善用户帮助系统可以增加软件的易用性,以便用户更快、更方便、更容易使用帮助系统进行自我学习或排除疑惑。

只有包含帮助文件,应用系统才能称得上是完整的系统。

VisualStudio提供了对两种不同帮助系统的支持:

●传统的Windows帮助系统(WinHelp);

HTML帮助(CHM帮助)。

目前chm格式的帮助文件已经成为主流。

可以使用HTMLHelpWorkshop提供的工具创建HTMLHelp联机帮助系统。另外,也可使用第三方工具对HTMLHelp文件进行编辑和编译。

1.Help类

应用程序可使用Help对象,以HTML帮助的格式显示已编译的帮助文件(.chm)或HTML文件。

无法创建Help类的新实例。若要为应用程序提供“帮助”,请调用静态ShowHelp和ShowHelpIndex方法。

ShowHelp方法用于显示指定URL处的帮助文件的“目录”选项卡,其语法如下:

Help.ShowHelp(Controlparent,Stringurl)

其中,parent参数标识要显示的帮助文件的父级控件;url参数为帮助文件的路径和名称。url可以是文件URL(如d:\appHelp.htm),也可以是HTTPURL(如http://appHelp.htm)。【例9-2】显示帮助文件。

(1)新建一个Windows应用程序,将其名称设置为Demo9-2。

(2)将默认创建的窗体名称设置为frm9_2,将窗体的标题设置为“范例9-2”。

(3)在主窗口中添加一个Button控件。将Button控件的Name属性设置为“showHelp”,Text属性设置为“帮助信息”。

(4)在showHelp控件的Click事件中编写下列代码:

privatevoidshowHelp_Click(objectsender,System.EventArgse)

{

Help.ShowHelp(this,@".\calc.chm")}(5)

保存项目,并“生成解决方案”。

(6)将C:\WINDOWS\Help目录下的calc.chm复制到该项目的子目录\bin\Debug下。

(7)运行项目。

ShowHelpIndex方法“显示帮助索引”用于显示帮助文件的“索引”选项卡,其语法如下:

publicstaticvoidShowHelpIndex(Controlparent,stringurl)

其调用方法与ShowHelp相似。

【例9-3】

显示帮助文件的“索引”选项卡。

(1)新建一个Windows应用程序,将其名称设置为Demo9-3。

(2)将默认创建的窗体名称设置为frm9_3,将窗体的标题设置为“范例9-3”。

(3)在主窗口中添加一个Button控件。将Button控件的Name属性设置为“showHelp”,Text属性设置为“帮助信息”。

(4)在showHelp控件的Click事件中编写下列代码:

privatevoidshowIndex_Click(objectsender,System.EventArgse)

{

Help.ShowHelpIndex(this,@".\calc.chm")

}

(5)保存项目,并“生成解决方案”。

(6)将C:\WINDOWS\Help目录下的calc.chm复制到该项目的子目录\bin\Debug下。

(7)运行项目。2.HelpProvider组件

通过使用HelpProvider组件,可以将“帮助”文件(它为HTML或HTMLHelp1.x或更高版本的格式)内的“帮助”主题附加到Windows窗体上的特定控件。

使用HelpProvider组件提供帮助的操作步骤是:

(1)将HelpProvider组件从“工具箱”拖到窗体上。该组件将位于Windows窗体设计器底部的栏中。

(2)在“属性”窗口中,将HelpNamespace属性设置为.chm、.col或.htm帮助文件。

(3)选择窗体上的另一个控件,在“属性”窗口中设置HelpKeyword属性。这是通过HelpProvider组件传递给帮助文件的字符串,用于请求相应的“帮助”主题。

(4)在“属性”窗口中,将HelpNavigator属性设置为HelpNavigator枚举的值。这将确定以何种方式将HelpKeyword属性传递给帮助系统。

表9-3显示了可能的设置及其说明。

在运行时,如果当已设置HelpKeyword和HelpNavigator属性的控件在获得焦点时按F1键,将打开与HelpProvider组件关联的帮助文件。表9-3可能的设置及其说明9.3.2程序打包

(1)

.NETFramework提供以下应用程序打包选项:

①作为单个程序集或者程序集集合。

如果选中该选项,则直接使用生成后的.dll或.exe文件。

②作为压缩(CAB)文件。

如果选中该选项,则将文件压缩为.cab文件,以缩短文件分发或下载的时间。

③作为MicrosoftWindowsInstaller2.0包或采用其他安装程序格式。

如果选中该选项,则可以创建用于WindowsInstaller的

.msi文件,或者打包用于其他安装程序的应用程序。

(2)

.NETFramework提供以下应用程序分发选项:

①使用XCOPY或FTP。

因为公共语言运行库应用程序是自描述的,并且不需要注册表项,所以可以使用XCOPY或FTP仅将应用程序复制到相应的目录中。然后,就可以从该目录运行应用程序。

②使用代码下载。

如果通过Internet或公司Intranet分发应用程序,则只要将代码下载到计算机上并在该计算机上运行应用程序即可。

③使用安装程序,如WindowsInstaller2.0。

WindowsInstaller2.0可以安装、修复或移除全局程序集缓存和私有目录中的Microsoft.NETFramework程序集。

9.3.3程序部署

VisualStudio为部署基于Windows的应用程序提供两种不同的策略:

●使用ClickOnce技术发布应用程序。

●使用WindowsInstaller技术通过传统安装来部署应用程序。

通过ClickOnce部署,可以将应用程序发布到中心位置,然后用户再从该位置安装或运行应用程序;通过WindowsInstaller部署,可将应用程序打包到setup.exe文件中,并将该文件分发给用户,用户可以运行setup.exe文件安装应用程序。

选择部署策略时有几个因素要考虑:应用程序类型、用户的类型和位置、应用程序更新的频率以及安装要求。

大多数情况下,ClickOnce部署为最终用户提供更好的安装体验,而要求开发人员花费的精力也少。但是,在某些情况下必须使用WindowsInstaller部署。

表9-4将ClickOnce部署的功能与WindowsInstaller部署的功能进行了比较。

提示:VisualStudio中的部署工具旨在处理典型的企业部署需求,这些工具未涵盖所有可能的部署方案。对于更高级的部署方案,可能需要考虑使用第三方部署工具或软件分发工具,如SystemsManagementServer(SMS)。表9-4ClickOnce部署的功能与WindowsInstaller部署的功能比较表

1.通过ClickOnce部署

简单来说,ClickOnce应用程序就是任何使用ClickOnce技术发布的Windows窗体或控制台应用程序。可以采用三种不同的方法发布ClickOnce应用程序:从网页发布、从网络文件共享发布以及从媒体(如CD-ROM)发布。ClickOnce应用程序既可以安装在最终用户的计算机上并在本地运行(即使当计算机脱机时也可以运行),也可以仅以联机模式运行,而不在最终用户的计算机上永久安装任何内容。

ClickOnce应用程序可以自行更新;这些应用程序可以在较新版本变为可用时检查较新版本,并自动替换所有更新的文件。开发人员可以指定更新行为;网络管理员也可以控制更新策略如将更新标记为强制性的。最终用户或管理员还可以对更新进行回滚,使应用程序恢复到早期的版本。

因为ClickOnce应用程序在本质上是被隔离的,所以安装或运行ClickOnce应用程序不会干扰现有的应用程序。ClickOnce应用程序是完全独立的;每个ClickOnce应用程序都安装到一个安全的基于每个用户、每个应用程序的缓存中,并从该缓存运行。默认情况下,ClickOnce应用程序运行在Internet或Intranet安全区域中。如果有必要,应用程序可以请求提升的安全权限。

下面讲述如何发布ClickOnce应用程序。

1)发布到Web

(1)在“解决方案资源管理器”中,选择应用程序项目。

(2)右击项目节点,然后选择“发布”,将出现“发布向导”。

(3)在“您要在哪里发布该应用程序?”页上,输入一个有效的URL,然后单击“下一步”。

(4)在“该应用程序可以脱机使用吗?”页中,单击适当的选项:

①如果要使应用程序在用户与网络断开连接时也可以运行,则单击“是,该应用程序可以联机或脱机使用”。“开始”菜单上将创建应用程序的快捷方式。

②如果要从发布位置直接运行应用程序,则单击“否,该应用程序只能联机使用”。“开始”菜单上不创建快捷方式。单击“下一步”继续。

(5)单击“完成”以发布应用程序。

发布状态显示在任务栏的状态通知区域中。

2)发布到文件共享

(1)在“解决方案资源管理器”中,选择应用程序项目。

(2)在“生成”菜单上,单击“发布Projectname”,将出现“发布向导”。

(3)在“您要在哪里发布该应用程序?”页上,使用格式“\\机器名\应用程序名”输入一个有效的文件路径,然后单击“下一步”。

(4)在“用户如何安装应用程序?”页中,选择用户安装应用程序的位置:

①如果用户从网站安装,则单击“从网站”,并输入与上一步中输入的文件路径相对应的URL,然后单击“下一步”(此选项通常在将FTP地址指定为发布位置时使用。从FTP的直接下载不受支持,因此需要在此处输入URL)。

②如果用户从文件共享直接安装应用程序,则单击“从UNC路径或文件共享”,然后单击“下一步”(此选项用于形式为c:\deploy\myapp或\\server\myapp的发布位置)。

③如果用户从可移动媒体安装,则单击“从CD-ROM或DVD-ROM”,然后单击“下一步”。

(5)在“该应用程序可以脱机使用吗?”页中,单击适当的选项:

①如果要使应用程序在用户与网络断开连接时也可以运行,则单击“是,该应用程序可以联机或脱机使用”。“开始”菜单上将创建应用程序的快捷方式。

②如果要从发布位置直接运行应用程序,则单击“否,该应用程序只能联机使用”。“开始”菜单上不创建快捷方式。单击“下一步”继续。

(6)单击“完成”以发布应用程序。发布状态显示在任务栏的状态通知区域中。

3)发布到CD-ROM或DVD=ROM

(1)在“解决方案资源管理器”中,右击应用程序项目并选择“属性”,将出现“项目设计器”。

(2)单击“发布”选项卡,在“项目设计器”中打开“发布”页,然后单击【发布向导】按钮,出现“发布向导”。

(3)在“您要在哪里发布该应用程序?”页中,输入发布应用程序的文件路径或FTP位置(如d:\deploy)。然后单击“下一步”继续。

(4)在“用户如何安装应用程序?”页中,单击“从CD-ROM或DVD-ROM”,然后单击“下一步”继续。

(5)如果在CD-ROM上发布应用程序,可能会希望从网站提供更新。在“应用程序将到哪里检查更新?”页中,选择更新选项:

①如果应用程序将检查更新,则单击“该应用程序将从下列位置检查更新”,然后输入发布更新的位置。输入的位置可以是文件位置、网站或FTP服务器。

②如果应用程序不检查更新,则单击“该应用程序将不检查更新”。

单击“下一步”继续。

(6)单击“完成”以发布应用程序。

发布状态将显示在任务栏的状态通知区域中。

注意:

完成发布后,需要使用CD刻录机或DVD刻录机从步骤(3)中指定的位置将文件复制到CD-ROM或DVD-ROM媒体。

【例9-4】使用ClickOnce部署VS2005中的WinForm应用程序。

(1)新建项目“Demo9-4”。重新命名窗体为frmIE_Load,向窗体中添加如表

9-5

所示的控件。

双击btnLink,在btnLink_Click事件中输入代码:

privatevoidbtnLink_Click(objectsender,EventArgse)

{

webBrowser1.Url=newUri(txtAddress.Text.Trim());

webBrowser1.Update();

}

运行程序,运行结果如图9-26所示。表9-5窗体frmIE_Load中添加的控件图9-26程序运行结果

(2)发布项目。在项目上点右键选择“属性”,会看到该项目的属性列表。左边的目录中选择“发布”,可以看到关于发布的属性,如图9-27所示。设置发布相关的属性,发行者名称为“广东科学技术职业学院”,产品名称为“clickOnce测试”,其他全部用默认。单击【立即发布】按钮,发布成功后自动打开发布页,如图9-28所示。

(3)安装。在本机或其他任意一台可以访问到发布网页的机器上打开IE,访问发布页http://localhost/Demo9-4/publish.htm,点击安装。安装成功后,程序会自动启动。而开始菜单的目录中会出现一个快捷方式,指向该程序,如图9-29所示。图9-27项目发布图9-28发布页面图9-29发布页面

(4)更新版本,修改程序。向窗体Load_frmIE中添加如表9-6所示的控件。表9-6窗体frmIE_Load中添加的控件

增加引用:

usingSystem.Deployment.Application;

增加成员变量:

///<summary>///更新标志:0,未检测到更新;1,已检测到更新;

privatestringflagUpdate="0";增加方法:

privatevoidUpdateApplication(){if(ApplicationDeployment.IsNetworkDeployed==true){ApplicationDeploymentad=ApplicationDeployment.CurrentDeployment;Text="当前版本:"+ad.CurrentVersion;toolTipUpdate.SetToolTip(this,Text);UpdateCheckInfocheckInfo=ad.CheckForDetailedUpdate();if(checkInfo.UpdateAvailable==true){flagUpdate="1";toolTipUpdate.SetToolTip(this,"检测到新的版本:"+checkInfo.AvailableVersion);if(MessageBox.Show("检测到新的版本:"+checkInfo.AvailableVersion+",现在需要更新吗?\n您也可以稍后手工更新到最新版本!","",MessageBoxButtons.YesNo,MessageBoxIcon.Question)==DialogResult.Yes){ad.Update();MessageBox.Show("更新完毕,将要重新启动程序!");Application.Restart();}}}}

增加或修改事件:

privatevoidfrmIE_Load(objectsender,EventArgse){UpdateApplication();}privatevoidpicReflash_Click(objectsender,EventArgse){UpdateApplication();}privatevoidtimerUpdate_Tick(objectsender,EventArgse){if(timerUpdate.Enabled){if(flagUpdate=="0"){UpdateApplication();}}}

运行程序。

(5)二次发布。

(6)客户端更新。在客户端打开程序时,系统会先检测是否有更新的版本,如果有,则弹出页面询问是否下载,如图9-30所示。选择“确定”,则自动更新新版本。如图9-31所示。此时,若再有新的更新发布,程序可以自动检测到更新,并询问是否更新到新的版本,如图9-32所示。需要更新点击【是】则立即更新,更新完后程序会重新启动。还可以点击【否】暂时不更新,之后程序直到关闭都不再自动提醒,需要手工点击刷新图标更新程序。图9-30发布页面图9-31发布页面

图9-32发布页面

2.通过WindowsInstaller部署

通过WindowsInstaller部署,可将应用程序打包到setup.exe文件中,并将该文件分发给用户,用户可以运行setup.exe文件安装应用程序。

在安装过程中,还可以设置快捷方式和文件关联、添加注册表项、显示自定义对话框以及检查InternetExplorer的版本等。

注意:创建自己的安装程序时,并非需要执行上面的所有步骤。

1)创建或添加部署项目

部署应用系统时,首先要将部署项目添加到解决方案。部署项目可以指定在开发时和开发后解决方案的部署位置以及部署方式。一个解决方案可包含多个部署项目,而部署项目可能与配置相关。

与WinForms相关的安装项目有两种:

●安装项目:用于部署可执行的应用程序。

●合并模块项目:部署不以独立应用程序的形式存在且不能直接部署的控件或组件。它是一个可重新分发的程序包,可以与现有安装项目合并。

创建新部署项目的步骤如下:

(1)在“文件”菜单上指向“添加”,然后单击“新建项目”。

(2)在随后出现的“添加新项目”对话框的“项目类型”窗格中,打开“其他项目类型”节点,选择“安装和部署”,如图9-33所示。图9-33新建部署项目

向解决方案中添加现有的部署项目的步骤如下:

(1)在“文件”菜单上指向“添加”,然后单击“现有项目”。

(2)在随后出现的“添加现有项目”对话框中,浏览到部署项目所在的位置,然后单击“打开”。

2)设置部署项目属性

部署项目具有两类属性,分别为常规项目属性和配置相关属性。常规属性在“属性”窗口中设置,此类属性应用于所有项目配置。若要设置配置相关属性,请使用“部署属性”对话框。配置相关属性应用于特定项目配置。

设置配置相关属性的步骤如下:

(1)在“解决方案资源管理器”中,选择安装项目节点。

(2)在“视图”菜单上选择“属性页”,如图

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论