《Visual C# NET程序設(shè)計(jì)基礎(chǔ)》課件009_第1頁
《Visual C# NET程序設(shè)計(jì)基礎(chǔ)》課件009_第2頁
《Visual C# NET程序設(shè)計(jì)基礎(chǔ)》課件009_第3頁
《Visual C# NET程序設(shè)計(jì)基礎(chǔ)》課件009_第4頁
《Visual C# NET程序設(shè)計(jì)基礎(chǔ)》課件009_第5頁
已閱讀5頁,還剩180頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第9章調(diào)試、測試與程序的打包、部署9.1調(diào)試簡介 9.2測試簡介 9.3程序的打包和部署

9.4綜合案例:簡易計(jì)算器制作、測試、打包和部署

本章小結(jié)

練習(xí)與作業(yè)

上機(jī)部分(九)

學(xué)習(xí)目標(biāo)●理解如何調(diào)試應(yīng)用程序和排除錯(cuò)誤●掌握如何測試C#應(yīng)用程序●了解測試和調(diào)試的區(qū)別●掌握Help類及其使用方法●掌握HelpProvider控件的使用方法●掌握各種部署應(yīng)用程序的方法9.1調(diào)試簡介

每當(dāng)提及我們?yōu)樘岣哕浖|(zhì)量做了多少工作時(shí),開發(fā)人員總會拍胸脯保證沒有問題。然而,你要永遠(yuǎn)記住一個(gè)不爭的事實(shí):程序中可能始終存在缺陷,代碼中存在錯(cuò)誤也是難免的。畢竟,程序是人設(shè)計(jì)的,無論程序員有多么優(yōu)秀,程序可能總有一些問題。因此,調(diào)試、修復(fù)缺陷成為系統(tǒng)開發(fā)最耗時(shí)、最昂貴的過程,尤其是在大型軟件開發(fā)過程中。我們將搜索和消除錯(cuò)誤的過程稱為調(diào)試。

調(diào)試是軟件開發(fā)過程中最艱巨的腦力勞動。調(diào)試開始時(shí),軟件開發(fā)者僅僅面對著錯(cuò)誤的征兆,然而在問題的外部現(xiàn)象和內(nèi)在原因之間往往并沒有明顯的聯(lián)系,在組成程序的密密麻麻的元素中,每一個(gè)都可能是錯(cuò)誤的根源。如何能在浩如煙海的程序元素中找到有錯(cuò)誤的那個(gè)(或幾個(gè))元素,這是調(diào)試過程中最關(guān)鍵的技術(shù)問題。9.1.1調(diào)試的必要性

什么是缺陷呢?如果你的應(yīng)用程序安裝在任何機(jī)器上都會崩潰,你就會知道程序肯定有缺陷。發(fā)布后的系統(tǒng)有無缺陷呢?你可能聽說過,應(yīng)用程序的用戶抱怨說程序沒有正常工作時(shí),這就發(fā)生了比較微妙的錯(cuò)誤。例如,在一個(gè)大型電費(fèi)管理信息系統(tǒng)的運(yùn)行中,操作員月末統(tǒng)計(jì)出的多張報(bào)表,發(fā)現(xiàn)相互矛盾的數(shù)據(jù);當(dāng)去圖書館借書,發(fā)現(xiàn)需要的圖書已全部被別人借走時(shí),你希望圖書館管理人員幫助你“預(yù)約借書”,可她操作后,計(jì)算機(jī)系統(tǒng)卻顯示“預(yù)約不成功”,然后終止應(yīng)用程序。

實(shí)際上,我們把許多不同類型的問題都稱為缺陷。數(shù)據(jù)被破壞是其中級別最高的,但是應(yīng)用程序由于設(shè)計(jì)缺陷或者甚至界面設(shè)計(jì)混亂也會導(dǎo)致用戶操作上的一些不方便(即不符合用戶的習(xí)慣或不符合約定俗成)。例如:你在MicrosoftOutlook中使用快捷鍵Ctrl+F,彈出的可能不是預(yù)期的查找窗口,而是轉(zhuǎn)發(fā)窗口(在幾乎所有的應(yīng)用程序中,快捷鍵Ctrl+F都會調(diào)出查找窗口)。

軟件系統(tǒng)的開發(fā)包括一系列生產(chǎn)活動,其中由人帶來的錯(cuò)誤因素非常多。程序代碼編寫完成后,可能你的程序不能正常執(zhí)行;程序執(zhí)行后,可能還存在不影響應(yīng)用程序執(zhí)行的小問題,例如按鈕的拼寫錯(cuò)誤等,它們也可能是導(dǎo)致應(yīng)用程序完全失敗的大錯(cuò)誤(通常稱為致命錯(cuò)誤),致命錯(cuò)誤包括妨礙代碼編譯的簡單錯(cuò)誤(語法錯(cuò)誤),但更多的錯(cuò)誤比較棘手,它們只在運(yùn)行期間發(fā)生。另外,錯(cuò)誤可能會更微妙。如果遺漏了一個(gè)請求的字段,應(yīng)用程序就不能給數(shù)據(jù)庫添加一個(gè)記錄;或者在其他有限制的環(huán)境中把錯(cuò)誤的數(shù)據(jù)添加到記錄中,應(yīng)用程序邏輯在某些方面有瑕疵時(shí),就會產(chǎn)生這樣的錯(cuò)誤,這類錯(cuò)誤稱為語義錯(cuò)誤(也稱為邏輯錯(cuò)誤)。此時(shí)需要跟蹤代碼,試著確定發(fā)生了什么問題,應(yīng)如何修改代碼,使之按希望的那樣去做。

程序產(chǎn)生的錯(cuò)誤分為以下三種:

(1)語法錯(cuò)誤。因程序設(shè)計(jì)人員對程序設(shè)計(jì)語言的理解不夠,或程序設(shè)計(jì)基本功不扎實(shí)造成的錯(cuò)誤。程序員在編碼時(shí)不遵循語法規(guī)則時(shí),就產(chǎn)生語法錯(cuò)誤,發(fā)生語法錯(cuò)誤后編譯不能通過。比如,在C#要求每行代碼的行末必須加分號,漏掉分號被視為語法錯(cuò)誤。

(2)運(yùn)行時(shí)錯(cuò)誤。當(dāng)應(yīng)用系統(tǒng)運(yùn)行時(shí),操作員試圖執(zhí)行無法實(shí)施的錯(cuò)誤時(shí),會產(chǎn)生運(yùn)行時(shí)錯(cuò)誤。比如,在程序運(yùn)行過程中用0作除數(shù),這種情況就會產(chǎn)生運(yùn)行時(shí)錯(cuò)誤。

(3)邏輯錯(cuò)誤。是指那些雖然不違反系統(tǒng)規(guī)則,但是卻不合邏輯或不合題目語義的錯(cuò)誤。這些錯(cuò)誤系統(tǒng)一般很難自行檢測出來,比如統(tǒng)計(jì)報(bào)表數(shù)據(jù)出錯(cuò)等。表9-1列出了不同錯(cuò)誤類型的對比。

表9-1不同錯(cuò)誤類型的對比9.1.2調(diào)試過程

在調(diào)試模式下運(yùn)行程序時(shí),并不僅僅是運(yùn)行編寫好的代碼。調(diào)試程序包含了應(yīng)用程序的符號信息,這些信息包含在.pdb文件中,這些文件位于計(jì)算機(jī)的Debug目錄下。它們可以執(zhí)行許多有用的操作,包括(但不限于這些操作):

●給VS調(diào)試信息;

●在執(zhí)行應(yīng)用程序的過程中,查看(并編輯)變量的值;

●暫停程序、重新啟動程序;

●在代碼的某個(gè)位置自動暫停程序的執(zhí)行;

●一次執(zhí)行程序中的一行代碼;

●在應(yīng)用程序的執(zhí)行過程中,監(jiān)視變量內(nèi)容的修改;

●在運(yùn)行期間修改變量的內(nèi)容;

●測試函數(shù)的測試調(diào)用。

在VS中,應(yīng)用程序可以處于運(yùn)行狀態(tài),也可以處于中斷模式,即暫停正常的執(zhí)行。很多程序員常常調(diào)用輸出函數(shù)(如Console.WriteLine()等)來獲得操作的額外反饋消息。這是一種有效的調(diào)試技術(shù),但麻煩的是,一旦找到問題,必須從代碼中刪除這些輸出函數(shù)的調(diào)用,這是一個(gè)相當(dāng)繁瑣的工作。

為簡化此過程,VisualStudio提供了調(diào)試器。VisualStudio調(diào)試器是一個(gè)功能強(qiáng)大的工具,它使您可以觀察程序的運(yùn)行時(shí)行為并確定邏輯錯(cuò)誤的位置。該調(diào)試器可用于所有的VisualStudio編程語言及其關(guān)聯(lián)的庫。使用調(diào)試器,可以中斷(或掛起)程序的執(zhí)行以檢查代碼,計(jì)算和編輯程序中的變量,查看寄存器,查看從源代碼創(chuàng)建的指令,以及查看應(yīng)用程序所占用的內(nèi)存空間。VisualStudio還提供了新功能“編輯并繼續(xù)”,使用此功能您可以在調(diào)試時(shí)對代碼進(jìn)行更改,然后繼續(xù)執(zhí)行。

VisualStudio調(diào)試器提供了一個(gè)用于訪問調(diào)試器工具的“調(diào)試”菜單。調(diào)試器的窗口和對話框顯示有關(guān)您的程序的信息,并允許您輸入附加的信息。您可以通過按F1鍵獲得關(guān)于任何窗口或?qū)υ捒虻膸椭??!罢{(diào)試”菜單如圖9-1所示。

圖9-1“調(diào)試”菜單

使用調(diào)試器,我們可以在源代碼行或函數(shù)上設(shè)置斷點(diǎn),斷點(diǎn)通知調(diào)試器應(yīng)在某點(diǎn)上中斷應(yīng)用程序并暫停執(zhí)行。這時(shí)程序員可以做一些檢查,比如檢查變量的值,如需要還可以修改變量的值,也可以檢查其他情況。當(dāng)程序調(diào)試時(shí),從菜單中選擇“調(diào)試”→“啟動調(diào)試”。這樣就在調(diào)試器中啟動了程序,并因而激活了斷點(diǎn)。一旦程序遇到斷點(diǎn),調(diào)試器便會接收程序的控制。這時(shí)會有一個(gè)箭頭指向當(dāng)前執(zhí)行的行。要單步調(diào)試一行代碼,可以選擇“調(diào)試”→“逐語句”,并觀察光標(biāo)是否移到下一行?!罢{(diào)試”→“逐過程”命令允許您單步執(zhí)行將要調(diào)用的函數(shù)。

提示:F5是啟動調(diào)試的快捷鍵。

在VisualStudio2005中設(shè)置簡單斷點(diǎn)可通過快捷菜單和通過“調(diào)試”菜單兩種方法進(jìn)行。

1.通過快捷菜單設(shè)置簡單斷點(diǎn)

(1)在源代碼窗口中,單擊要設(shè)置斷點(diǎn)的那行可執(zhí)行代碼。

(2)在快捷菜單中,轉(zhuǎn)到“斷點(diǎn)”,然后選擇“插入斷點(diǎn)”,如圖9-2所示。程序運(yùn)行遇到斷點(diǎn)時(shí),會在設(shè)置斷點(diǎn)所在的代碼行暫停運(yùn)行,如圖9-3所示。

提示:F9是插入斷點(diǎn)的快捷鍵。圖9-2通過快捷菜單設(shè)置簡單斷點(diǎn)圖9-3程序在斷點(diǎn)處暫停運(yùn)行2.通過“調(diào)試”菜單設(shè)置簡單斷點(diǎn)

(1)在源窗口中,單擊要設(shè)置斷點(diǎn)的那行可執(zhí)行代碼。

(2)從“調(diào)試”菜單中選擇“切換斷點(diǎn)”。如圖9-4所示。普通斷點(diǎn)標(biāo)志符號說明如下::實(shí)心標(biāo)志符號指示斷點(diǎn)已啟用;空心標(biāo)志符號指示斷點(diǎn)已禁用。圖9-4通過“調(diào)試”菜單設(shè)置簡單斷點(diǎn)9.1.3VisualStudio.NET中的調(diào)試工具

調(diào)試器提供了很多變量窗口,這些窗口用于顯示、計(jì)算和編輯變量與表達(dá)式。每個(gè)變量窗口都是網(wǎng)格窗口,其中包含三列:“名稱”、“值”和“類型”?!懊Q”列包含變量名稱或表達(dá)式?!爸怠焙汀邦愋汀绷酗@示變量或表達(dá)式的值和數(shù)據(jù)類型??稍谡{(diào)試過程使用的變量窗口包括:“局部變量”窗口、“自動”窗口、“監(jiān)視”窗口、“快速監(jiān)視”窗口和“即時(shí)”窗口。

調(diào)試程序時(shí),從菜單中選擇“調(diào)試”→“窗體”→“監(jiān)視(W)”→“監(jiān)視1”,即可顯示“監(jiān)視1”窗口,如圖9-5所示。類似地,可顯示其他變量窗口。圖9-5顯示變量窗口

下面分別說明這幾個(gè)窗口。

1.“局部變量”窗口顯示對于當(dāng)前上下文或范圍來說位于當(dāng)前作用域的變量。通常,這是當(dāng)前正在執(zhí)行的過程或函數(shù)。調(diào)試器自動填充此窗口。在VisualC#中,如果禁用了異常助手,一旦出現(xiàn)活動異常,則“局部變量”窗口還會顯示偽變量$exception,用以查看異常的詳細(xì)信息。圖9-6所示為“局部變量”窗口。當(dāng)程序執(zhí)行從一個(gè)方法轉(zhuǎn)向另一個(gè)方法時(shí),“局部變量”窗口中顯示的變量也會改變,只顯示局部變量??梢孕薷淖址蛿?shù)值變量的值,當(dāng)值被改變后,新值顯示為紅色,應(yīng)用程序?qū)⑹褂眯轮道^續(xù)執(zhí)行。圖9-6“局部變量”窗口

2.“自動”窗口

顯示在當(dāng)前代碼行和上一代碼行中使用的變量。對于本機(jī)C++,“自動”窗口還顯示函數(shù)返回值。與“局部變量”窗口類似,“自動”窗口是由調(diào)試器自動填充的。圖9-7所示為“自動”窗口。

3.“監(jiān)視”窗口

在“監(jiān)視”窗口中可以添加被監(jiān)視值的變量。此外,還可以添加變量以外的其他內(nèi)容。您可以添加調(diào)試器所能識別的任何有效表達(dá)式。VisualStudio2005有多個(gè)“監(jiān)視”窗口,其編號為Watch1到Watch4。

執(zhí)行程序時(shí),“監(jiān)視”窗口會自動跟蹤變量的值,如果被監(jiān)視的變量不在當(dāng)前執(zhí)行的方法內(nèi),將會顯示“操作符超出范圍”的錯(cuò)誤。圖9-8所示為“監(jiān)視”窗口。圖9-7自動窗口圖9-8“監(jiān)視”窗口

4.“快速監(jiān)視”窗口

“快速監(jiān)視”在概念上類似于“監(jiān)視”窗口,但是“快速監(jiān)視”每次只能顯示一個(gè)變量或表達(dá)式。如果需要快速查看變量或表達(dá)式而不想打開“監(jiān)視”窗口,則可以使用“快速監(jiān)視”。但是,很多用戶會發(fā)現(xiàn)新的增強(qiáng)的數(shù)據(jù)提示功能強(qiáng)大,以至于他們越來越少地使用到“快速監(jiān)視”。圖9-9所示為“快速監(jiān)視”窗口。

雖然“快速監(jiān)視”是對話框,但其工作方式很像其他變量窗口。除了特別指出的不同之處以外,這一節(jié)所描述的過程適用于“快速變量”對話框以及其他變量窗口。圖9-9“快速監(jiān)視”窗口

5.“即時(shí)”窗口

“即時(shí)”窗口可用于檢查變量的值、給變量賦值以及運(yùn)行一行代碼。要查找變量的值,需要在變量前添加問號“?”,如圖9-10所示。要想改變變量的值,在此窗口鍵入賦值代碼,然后按下Enter鍵。調(diào)試器具有許多其他工具的功能。例如,可以使用“寄存器”窗口顯示寄存器的內(nèi)容,還可以獲得內(nèi)存轉(zhuǎn)儲和關(guān)于進(jìn)程中線程的信息。下面介紹VisualStudio2005中編譯調(diào)試新功能“可視化調(diào)試器”。圖9-10“即時(shí)”窗口6.可視化調(diào)試器(DebuggingVisualizers)

在調(diào)試的時(shí)候,我們常會遇到的較麻煩的問題,就是有的時(shí)候很難看到某些參數(shù)的值。比如,你設(shè)置了一個(gè)斷點(diǎn)去監(jiān)測一個(gè)DataSet,并且想看DataSet里的每個(gè)DataTable的數(shù)據(jù),這在VisualStudio2003中是十分麻煩的,必須在“自動/局部變量”的監(jiān)視窗口中,一層層地展開去看其值。在VisualStudio2005中,為解決這個(gè)問題,新增加了“可視化調(diào)試器”的功能,該功能可以在調(diào)試狀態(tài)時(shí),很容易方便地以各類形式查看各種參數(shù)。

在各類監(jiān)視窗口中,比如在“局部變量”窗口、“自動”窗口、“監(jiān)視”窗口、“快速監(jiān)視”窗口中,都可以調(diào)用可視化調(diào)試器,方法是在某個(gè)需要監(jiān)視的參數(shù)旁邊,點(diǎn)擊放大鏡圖標(biāo),就可以在打開的可視化調(diào)試器中看到該參數(shù)的詳細(xì)情況,如圖9-11所示。

利用可視化調(diào)試器,就可以很方便地查看諸如DataSet類型的數(shù)據(jù)。圖9-11“可視化調(diào)試器”窗口9.1.4實(shí)例1:在VS.NET2005中調(diào)試程序

使用VS.NET2005的“編輯并繼續(xù)”功能,可以一邊進(jìn)行調(diào)試一邊在中斷模式下更改代碼。不必停止并重新啟動調(diào)試會話,即可應(yīng)用更改。

(1)使用C#建立一個(gè)WinForms的應(yīng)用程序,命名為Debug。

(2)為窗體添加如表9-2所示的控件。程序主界面如圖9-12所示。我們要實(shí)現(xiàn)的功能是,在文本框輸入一些信息后,點(diǎn)按鈕,會彈出一個(gè)消息框,顯示的是剛才輸入的信息。表9-2窗體的控件列表圖9-12程序主界面

(3)編寫的代碼如下所示,假設(shè)我們出現(xiàn)了一個(gè)小錯(cuò)誤,把textbox1.text的內(nèi)容當(dāng)作字符串的一部分了,所以顯示不出用戶輸入的信息。

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

現(xiàn)在,如果我們在調(diào)試時(shí)遇到了這個(gè)錯(cuò)誤,則可以使用“編輯并繼續(xù)”功能來進(jìn)行改正。

(4)按F7鍵切換到代碼視圖,在MessageBox.Show這一行設(shè)置斷點(diǎn)。

(5)按F5鍵運(yùn)行程序,當(dāng)在文本框輸入字符串時(shí),由于設(shè)置了中斷,光標(biāo)停留在MessageBox.Show這一行上。

(6)修改代碼:

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

按F5鍵繼續(xù)運(yùn)行。將顯示正確的結(jié)果,而不需要使用以往的“停止調(diào)試”的功能,即先停止調(diào)試,再修改程序。

9.2測試簡介

測試是檢查應(yīng)用程序以確保它滿足設(shè)計(jì)要求并滿足質(zhì)量期望值的過程。

測試可以完成許多事,但最重要的是可以衡量正在開發(fā)的軟件的質(zhì)量。這種觀點(diǎn)預(yù)先假定軟件中存在等待被發(fā)現(xiàn)的缺陷,并且這種觀點(diǎn)很少被反駁,甚至也不存在爭議。

開發(fā)周期中,越早使測試成為投入的一部分越好。規(guī)劃對于成功的測試投入至關(guān)重要,部分是因?yàn)樗谠O(shè)置預(yù)期值方面需要做大量的工作。在測試計(jì)劃中考慮預(yù)算、日程和性能可以增加測試確實(shí)發(fā)生的可能性,并且高效實(shí)惠。規(guī)劃還確保不會忘記或重復(fù)測試,除非重復(fù)測試對于回歸測試是必要的。

VisualStudioTeamEditionforTesters中提供了一套與MicrosoftVisualStudio2005緊密集成的測試工具。這些工具不僅能在自身的測試框架中工作,還可在軟件生命周期工具的更大框架中發(fā)揮作用。

TeamEditionforTesters使您能夠創(chuàng)建、管理、編輯和運(yùn)行測試,還可以獲取和存儲測試結(jié)果。除代碼覆蓋率度量外,VisualStudio中還集成了幾種測試類型,其中包括:

●單元測試:單元測試調(diào)用類的方法(傳遞參數(shù)),并驗(yàn)證返回值是否為期望的值。既可以手動編寫單元測試,也可以自動生成它們。

Web測試:Web測試由您使用MicrosoftInternetExplorer在一個(gè)瀏覽器會話中記錄的一系列有序的HTTP請求組成。也可以創(chuàng)建一個(gè)編碼Web測試,并在其中添加更多高級功能,例如流控制??梢宰寽y試報(bào)告有關(guān)它所請求的頁或站點(diǎn)的特定細(xì)節(jié),例如某個(gè)特定的頁是否包含指定的字符串。

●在記錄Web測試之后,可以對它進(jìn)行編輯以分配一些屬性,例如思考時(shí)間和數(shù)據(jù)源(用于存儲要發(fā)送到Web服務(wù)器的數(shù)據(jù))。Web測試在用作負(fù)載測試的一部分時(shí)功能會變得更為強(qiáng)大。

●負(fù)載測試:可以使用負(fù)載測試來封裝非手動測試(即,單元測試、Web測試、一般測試和順序測試),然后使用虛擬用戶同時(shí)運(yùn)行它們。在負(fù)載下運(yùn)行這些測試將生成測試結(jié)果,包括用表格和圖形方式顯示的性能計(jì)數(shù)器和其他計(jì)數(shù)器。

例如,通過將Web測試添加到負(fù)載測試,可以模擬數(shù)百個(gè)用戶與某個(gè)特定的Web應(yīng)用程序同時(shí)進(jìn)行交互的情形。這可以讓您在部署Web應(yīng)用程序之前,測試其在峰值使用情況下的行為,以便找出應(yīng)用程序的錯(cuò)誤或瓶頸。

●手動測試:手動測試可用于逐句通過任務(wù),通常適用于那些很難或無法自動運(yùn)行的測試,例如計(jì)算機(jī)與其電源之間的連接已中斷的測試。當(dāng)需要由測試工程師而非自動腳本來完成測試任務(wù)時(shí),應(yīng)使用此測試類型。

可以使用VisualStudioIDE運(yùn)行測試。此外,還可以從命令行運(yùn)行手動測試之外的測試組或任何單項(xiàng)測試。

因?yàn)闇y試工具與VisualStudioTeamSystem的其他部分集成在一起,所以可以將結(jié)果發(fā)布到數(shù)據(jù)庫,生成趨勢和歷史記錄報(bào)告,對比不同種類的數(shù)據(jù),查看通過測試發(fā)現(xiàn)了多少bug(指軟件中存在的錯(cuò)誤)及具體都有哪些錯(cuò)誤。

下面介紹TeamSystemtestingtools的一些基本內(nèi)容,包括如何創(chuàng)建和使用測試,可用的測試類型以及如何配置測試工具等。

1.先決條件

如果你是測試人員,可以通過選擇測試人員配置文件設(shè)置啟動VisualStudio。方法如下:

(1)首次啟動VisualStudio2005時(shí),將出現(xiàn)“選擇默認(rèn)環(huán)境設(shè)置”對話框,如圖9-15所示。

(2)單擊“TeamTest設(shè)置”。

(3)單擊“啟動VisualStudio”。(4)

啟動后將顯示“測試管理器”,如圖9-13所示。

注意:如果啟動VisualStudio時(shí)沒有出現(xiàn)圖9-13所示對話框,請打開運(yùn)行命令“開始”→“運(yùn)行”,鍵入devenv/resetuserdata,再按回車(如圖9-14所示)。然后再次啟動VisualStudio,即可出現(xiàn)“選擇默認(rèn)環(huán)境設(shè)置”對話框(如圖9-15所示)。圖9-13選擇“TeamTest設(shè)置”后的VS界面圖9-14“運(yùn)行”窗口圖9-15“選擇默認(rèn)環(huán)境設(shè)置”窗口

這樣使用測試人員配置文件啟動VisualStudio之后,將移除某些特定于編程的菜單和窗口,使測試員可以集中精力執(zhí)行以下任務(wù):創(chuàng)建非編程測試,管理現(xiàn)有測試及運(yùn)行測試。

下面講述進(jìn)行測試的一般步驟:

(1)創(chuàng)建測試項(xiàng)目。

(2)創(chuàng)建新測試,進(jìn)行測試環(huán)境的設(shè)置。選擇測試類型,比如單元測試、Web測試、負(fù)載測試。

(3)打開測試進(jìn)行編輯測試。

(4)運(yùn)行測試。

(5)測試運(yùn)行之后,需要記錄測試結(jié)果。

對于單元測試,在第(3)步時(shí),需要“創(chuàng)作單元測試”;對于Web測試,第(3)步時(shí)需要“記錄Web測試”。

2.創(chuàng)建測試項(xiàng)目

創(chuàng)建測試項(xiàng)目的常用方法有以下三種:

●添加測試時(shí)創(chuàng)建測試項(xiàng)目。新建測試時(shí),可以新建一個(gè)要向其中添加測試的測試項(xiàng)目,也可以將測試添加到現(xiàn)有的測試項(xiàng)目中。

●在生成單元測試時(shí)創(chuàng)建測試項(xiàng)目。生成單元測試時(shí),可以新建一個(gè)要向其中添加測試的測試項(xiàng)目,也可以將測試添加到現(xiàn)有的測試項(xiàng)目中。

●使用“添加新項(xiàng)目”對話框。使用此方法,可以選擇測試項(xiàng)目的編程語言,如果計(jì)劃編寫測試代碼(如在單元測試或編碼Web測試中),則編程語言的選擇就可能很重要。1)添加測試時(shí)創(chuàng)建測試項(xiàng)目

(1)單擊“測試”→“新建測試”。隨即出現(xiàn)“添加新測試”對話框。如圖9-16所示。

(2)在“添加到測試項(xiàng)目”下,選擇用于創(chuàng)建新測試項(xiàng)目的選項(xiàng)之一。例如,單擊“創(chuàng)建新VisualC#測試項(xiàng)目”。如圖9-17所示。

(3)在“模板”窗格中,選擇要添加的測試類型,單擊“確定”。

(4)隨即出現(xiàn)“新建測試項(xiàng)目”對話框。輸入新測試項(xiàng)目的名稱或接受默認(rèn)名稱,然后單擊“創(chuàng)建”,如圖9-18所示。測試項(xiàng)目及其包含的測試將添加到解決方案中。圖9-16“新建測試”菜單圖9-17“添加新測試”窗口圖9-18“新建測試項(xiàng)目”對話框2)在生成單元測試時(shí)創(chuàng)建測試項(xiàng)目

(1)打開一個(gè)源代碼文件。

(2)右擊某命名空間、類或方法,在彈出菜單中單擊“創(chuàng)建單元測試”,如圖9-19所示。

(3)隨即出現(xiàn)“創(chuàng)建單元測試”對話框??梢愿囊獮槠渖蓡卧獪y試的選定成員。在“輸出項(xiàng)目”下,選擇用于創(chuàng)建新測試項(xiàng)目的選項(xiàng)之一。例如,單擊“創(chuàng)建新的VisualC#?測試項(xiàng)目”,如圖9-20所示。

(4)單擊“生成”。隨即出現(xiàn)“新建測試項(xiàng)目”對話框。

(5)輸入新測試項(xiàng)目的名稱或接受默認(rèn)名稱,然后單擊“創(chuàng)建”。該測試項(xiàng)目以及新單元測試將添加到解決方案中。圖9-19“創(chuàng)建單元測試”菜單圖9-20“創(chuàng)建單元測試”對話框3)使用“添加新項(xiàng)目”對話框創(chuàng)建測試項(xiàng)目

(1)在“解決方案資源管理器”中右擊解決方案,指向“添加”,然后單擊“新建項(xiàng)目”。

(2)出現(xiàn)“添加新項(xiàng)目”對話框?!绊?xiàng)目類型”窗格包含一個(gè)“測試項(xiàng)目節(jié)點(diǎn)”和多個(gè)特定編程語言節(jié)點(diǎn)。如果希望新測試項(xiàng)目使用特定編程語言,請展開該語言的節(jié)點(diǎn);否則,展開“測試項(xiàng)目”。如果展開了一個(gè)語言節(jié)點(diǎn),則單擊“測試”;如果展開了“測試項(xiàng)目”節(jié)點(diǎn),則單擊“測試文檔”,如圖9-21所示。

(3)在“模板”之下單擊“測試項(xiàng)目”。

(4)單擊“確定”。測試項(xiàng)目將添加到解決方案中。圖9-21“添加新項(xiàng)目”對話框

3.生成單元測試

在生成單元測試時(shí),為在“創(chuàng)建單元測試”對話框中選擇的每個(gè)碼方法創(chuàng)建一個(gè)單元測試方法。生成的每個(gè)單元測試調(diào)用Inconclusive方法,由于測試未實(shí)現(xiàn),這將使測試失敗。下一步是添加有意義的代碼以檢測所測試的方法是否正確運(yùn)行,從而實(shí)現(xiàn)測試。

下面介紹生成單元測試的步驟:

(1)有四種方法可以生成單元測試。

●在解決方案資源管理器中右擊某個(gè)測試項(xiàng)目,指向“添加”,再單擊“單元測試”。

●在解決方案資源管理器中右擊某個(gè)測試項(xiàng)目,指向“添加”,再單擊“新建測試”。在“添加新測試”對話框中單擊“單元測試向?qū)А保賳螕簟按_定”。

●在“測試管理器”窗口或“測試視圖”窗口中右擊窗口圖面,再單擊“新建測試”。在“添加新測試”對話框中單擊“單元測試向?qū)А?,再單擊“確定”。

●在VisualStudio代碼編輯器中,右擊要測試的命名空間、類或方法并選擇“創(chuàng)建單元測試”(如圖9-19所示)。

(2)將顯示“創(chuàng)建單元測試”對話框(如圖9-20所示)。為選定的所有成員或類生成單元測試,并可以選擇要在其中放置生成的單元測試的項(xiàng)目。

(3)

(可選)單擊“篩選器”可更改顯示的類和成員層次結(jié)構(gòu)的內(nèi)容。

(4)

(可選)通過選中其復(fù)選框選擇其他代碼元素。

(5)

(可選)單擊“設(shè)置”可更改此測試的生成配置設(shè)置。例如,可以為要生成的測試文件、類和方法更改默認(rèn)的命名選項(xiàng)。

(6)單擊“確定”。

4.編輯單元測試

編輯單元測試的原因有兩個(gè):您正在手動創(chuàng)作一個(gè)單元測試;或者正在編輯一個(gè)新生成的單元測試。雖然您可以運(yùn)行新生成的單元測試,但是由于它們是使用默認(rèn)內(nèi)容創(chuàng)建的,為了使測試能夠產(chǎn)生有意義的結(jié)果,必須使用適當(dāng)?shù)闹祵δJ(rèn)內(nèi)容進(jìn)行初始化。

在生成的單元測試中,通常需要自定義變量的賦值以及一個(gè)或多個(gè)Assert語句。

(1)在單元測試中使用Assert語句。

默認(rèn)情況下,每個(gè)生成的單元測試都調(diào)用Inconclusive方法,這會導(dǎo)致測試失敗,因?yàn)闇y試實(shí)際上仍未實(shí)現(xiàn)。下一步是添加有意義的代碼,以檢查所測試的方法的操作是否正確。實(shí)現(xiàn)該目的的典型方法是生成一個(gè)值,然后使用Assert.AreEqual語句將該值與預(yù)期值進(jìn)行比較。

不包含Assert語句的單元測試只要不超時(shí),并且不引發(fā)意外的異常,就會自動通過。這是單元測試框架不包含Assert.Pass語句的原因。

(2)編輯現(xiàn)有單元測試。

●在解決方案資源管理器中的測試項(xiàng)目中,找到并打開包含該單元測試的文件,然后找到要編輯的單元測試方法,如圖9-22所示。圖9-22單元測試文件

●在方法中找到變量賦值部分,為每個(gè)變量賦給相應(yīng)的值。

對于新生成的測試,將使用“To-Do”語句標(biāo)記變量賦值部分,旨在提醒您需要自定義這些賦值語句。例如,以下便是需要編輯的一個(gè)典型的賦值語句:

stringtarget.owner=null;//TODO:Initializetoanappropriatevalue

若要了解什么樣的值才是適當(dāng)?shù)?,?yīng)考慮以下幾個(gè)方面:在調(diào)用方法之前這些變量可能被初始化為的值;在調(diào)用方法時(shí)這些變量值可能發(fā)生的更改以及期望的結(jié)果。

(3)在方法中查找并編輯Assert語句。如果需要,添加其他Assert語句。

Assert.AreEqual(期望值,實(shí)際運(yùn)行結(jié)果,錯(cuò)誤信息);

5.運(yùn)行單元測試

(1)在“測試視圖”中選擇需要測試的項(xiàng)目,單擊右鍵,在彈出的菜單中單擊“運(yùn)行選中的測試”;如圖9-23所示。

(2)在“測試結(jié)果”窗口的“結(jié)果”列中,當(dāng)測試運(yùn)行時(shí),測試狀態(tài)將顯示為“正在運(yùn)行”。測試運(yùn)行完成后,測試的結(jié)果將更改為“通過”,如圖9-24所示。

(3)如測試“未通過”,可在“測試結(jié)果”窗口中雙擊表示測試的行,將打開“測試結(jié)果詳細(xì)信息”頁,其中顯示以下錯(cuò)誤消息:“Assert.AreEqual失敗。期望值:<...>,實(shí)際值:<...>”。

此時(shí)需要檢查被測試的方法。圖9-23運(yùn)行選中的測試圖9-24“測試結(jié)果”窗口【例9-1】使用VS2005進(jìn)行銀行項(xiàng)目的單元測試。

(1)使用C#建立一個(gè)“類庫”,命名為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;}}//借:取款;模擬編碼人員邏輯錯(cuò)誤

publicvoidDebit(doubleamount){if(amount<0){thrownewArgumentOutOfRangeException("amount");}m_balance+=amount;}//貸:存款;模擬編碼人員邏輯錯(cuò)誤

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);}}}

下面我們來進(jìn)行借、貸兩個(gè)方法的單元測試:

(3)在Class1.cs文件的“BankAccount”類中,滾動到“Debit()”方法。右擊“Debit()”方法,并選擇“創(chuàng)建單元測試”(如圖9-19所示)。

(4)這時(shí)將顯示“創(chuàng)建單元測試”對話框。在程序集的類和成員層次結(jié)構(gòu)樹中,選擇“Debit()”方法。并選擇“Credit()”方法(如圖9-20所示)。

對于“輸出項(xiàng)目”,單擊“創(chuàng)建新的VisualC#測試項(xiàng)目”。然后在“生成單元測試”對話框中單擊“確定”。

(5)

在“新建測試項(xiàng)目”對話框中接受默認(rèn)名稱,然后單擊“創(chuàng)建”(如圖9-21所示)。這時(shí)將創(chuàng)建一個(gè)名為TestProject1的項(xiàng)目,該項(xiàng)目將顯示在解決方案資源管理器中。(6)

選中Class1Tests.cs中,為要測試的變量指定值。然后滾動到“DebitTest”方法。在此可以看到指示要設(shè)置的變量(即“customerName”、“balance”和“amount”)的三個(gè)//TODO行。復(fù)制代碼:

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

doublebalance=11.99;//帳戶余額

doubleamount=11.22;

//新建立一個(gè)帳戶:戶名,帳戶金額11.99BankAccounttarget=newBankAccount(customerName,balance);//取款11.22target.Debit(amount);Assert.Inconclusive("無法驗(yàn)證不返回值的方法。");}

應(yīng)使用什么值?若要回答此問題,必須知道應(yīng)用程序運(yùn)行時(shí)要使用的值。

上述代碼首先新建立一個(gè)帳戶:戶名"Mr.BryanWalton",帳戶金額11.99;取款11.22后,帳戶金額應(yīng)為0.77。(7)

修改“Assert”語句的測試方法。替換代碼:

publicvoidDebitTest()

{

…//修改前

//Assert.Inconclusive("無法驗(yàn)證不返回值的方法。");//修改后

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

此語句將預(yù)期結(jié)果(0.77)

與調(diào)用“BankAccount”類的“Balance”方法所產(chǎn)生的實(shí)際結(jié)果進(jìn)行比較。如果兩個(gè)值不相等,則“Assert”返回“False”,從而使測試失敗。

注意:此“Assert”語句還包括第三個(gè)參數(shù)“delta”,其值為0.05。在“Assert.AreEqual”方法的此重載中需要該delta參數(shù);它可以補(bǔ)償“Doubles”等浮點(diǎn)型所固有的舍入錯(cuò)誤。

(8)運(yùn)行和自定義單元測試。使用“測試管理器”窗口或“測試視圖”窗口運(yùn)行DebitTest單元測試。

在“測試結(jié)果”窗口的“結(jié)果”列中,測試狀態(tài)將顯示為“正在運(yùn)行”,如圖9-25所示。測試結(jié)束后,顯示CreditTest單元測試“通過”;DebitTest單元測試“失敗”;需要對DebitTest方法進(jìn)行調(diào)試、修改。圖9-25測試結(jié)果9.3

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

完善用戶幫助系統(tǒng)可以增加軟件的易用性,以便用戶更快、更方便、更容易使用幫助系統(tǒng)進(jìn)行自我學(xué)習(xí)或排除疑惑。

只有包含幫助文件,應(yīng)用系統(tǒng)才能稱得上是完整的系統(tǒng)。

VisualStudio提供了對兩種不同幫助系統(tǒng)的支持:

●傳統(tǒng)的Windows幫助系統(tǒng)(WinHelp);

HTML幫助(CHM幫助)。

目前chm格式的幫助文件已經(jīng)成為主流。

可以使用HTMLHelpWorkshop提供的工具創(chuàng)建HTMLHelp聯(lián)機(jī)幫助系統(tǒng)。另外,也可使用第三方工具對HTMLHelp文件進(jìn)行編輯和編譯。

1.Help類

應(yīng)用程序可使用Help對象,以HTML幫助的格式顯示已編譯的幫助文件(.chm)或HTML文件。

無法創(chuàng)建Help類的新實(shí)例。若要為應(yīng)用程序提供“幫助”,請調(diào)用靜態(tài)ShowHelp和ShowHelpIndex方法。

ShowHelp方法用于顯示指定URL處的幫助文件的“目錄”選項(xiàng)卡,其語法如下:

Help.ShowHelp(Controlparent,Stringurl)

其中,parent參數(shù)標(biāo)識要顯示的幫助文件的父級控件;url參數(shù)為幫助文件的路徑和名稱。url可以是文件URL(如d:\appHelp.htm),也可以是HTTPURL(如http://appHelp.htm)?!纠?-2】顯示幫助文件。

(1)新建一個(gè)Windows應(yīng)用程序,將其名稱設(shè)置為Demo9-2。

(2)將默認(rèn)創(chuàng)建的窗體名稱設(shè)置為frm9_2,將窗體的標(biāo)題設(shè)置為“范例9-2”。

(3)在主窗口中添加一個(gè)Button控件。將Button控件的Name屬性設(shè)置為“showHelp”,Text屬性設(shè)置為“幫助信息”。

(4)在showHelp控件的Click事件中編寫下列代碼:

privatevoidshowHelp_Click(objectsender,System.EventArgse)

{

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

保存項(xiàng)目,并“生成解決方案”。

(6)將C:\WINDOWS\Help目錄下的calc.chm復(fù)制到該項(xiàng)目的子目錄\bin\Debug下。

(7)運(yùn)行項(xiàng)目。

ShowHelpIndex方法“顯示幫助索引”用于顯示幫助文件的“索引”選項(xiàng)卡,其語法如下:

publicstaticvoidShowHelpIndex(Controlparent,stringurl)

其調(diào)用方法與ShowHelp相似。

【例9-3】

顯示幫助文件的“索引”選項(xiàng)卡。

(1)新建一個(gè)Windows應(yīng)用程序,將其名稱設(shè)置為Demo9-3。

(2)將默認(rèn)創(chuàng)建的窗體名稱設(shè)置為frm9_3,將窗體的標(biāo)題設(shè)置為“范例9-3”。

(3)在主窗口中添加一個(gè)Button控件。將Button控件的Name屬性設(shè)置為“showHelp”,Text屬性設(shè)置為“幫助信息”。

(4)在showHelp控件的Click事件中編寫下列代碼:

privatevoidshowIndex_Click(objectsender,System.EventArgse)

{

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

}

(5)保存項(xiàng)目,并“生成解決方案”。

(6)將C:\WINDOWS\Help目錄下的calc.chm復(fù)制到該項(xiàng)目的子目錄\bin\Debug下。

(7)運(yùn)行項(xiàng)目。2.HelpProvider組件

通過使用HelpProvider組件,可以將“幫助”文件(它為HTML或HTMLHelp1.x或更高版本的格式)內(nèi)的“幫助”主題附加到Windows窗體上的特定控件。

使用HelpProvider組件提供幫助的操作步驟是:

(1)將HelpProvider組件從“工具箱”拖到窗體上。該組件將位于Windows窗體設(shè)計(jì)器底部的欄中。

(2)在“屬性”窗口中,將HelpNamespace屬性設(shè)置為.chm、.col或.htm幫助文件。

(3)選擇窗體上的另一個(gè)控件,在“屬性”窗口中設(shè)置HelpKeyword屬性。這是通過HelpProvider組件傳遞給幫助文件的字符串,用于請求相應(yīng)的“幫助”主題。

(4)在“屬性”窗口中,將HelpNavigator屬性設(shè)置為HelpNavigator枚舉的值。這將確定以何種方式將HelpKeyword屬性傳遞給幫助系統(tǒng)。

表9-3顯示了可能的設(shè)置及其說明。

在運(yùn)行時(shí),如果當(dāng)已設(shè)置HelpKeyword和HelpNavigator屬性的控件在獲得焦點(diǎn)時(shí)按F1鍵,將打開與HelpProvider組件關(guān)聯(lián)的幫助文件。表9-3可能的設(shè)置及其說明9.3.2程序打包

(1)

.NETFramework提供以下應(yīng)用程序打包選項(xiàng):

①作為單個(gè)程序集或者程序集集合。

如果選中該選項(xiàng),則直接使用生成后的.dll或.exe文件。

②作為壓縮(CAB)文件。

如果選中該選項(xiàng),則將文件壓縮為.cab文件,以縮短文件分發(fā)或下載的時(shí)間。

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

如果選中該選項(xiàng),則可以創(chuàng)建用于WindowsInstaller的

.msi文件,或者打包用于其他安裝程序的應(yīng)用程序。

(2)

.NETFramework提供以下應(yīng)用程序分發(fā)選項(xiàng):

①使用XCOPY或FTP。

因?yàn)楣舱Z言運(yùn)行庫應(yīng)用程序是自描述的,并且不需要注冊表項(xiàng),所以可以使用XCOPY或FTP僅將應(yīng)用程序復(fù)制到相應(yīng)的目錄中。然后,就可以從該目錄運(yùn)行應(yīng)用程序。

②使用代碼下載。

如果通過Internet或公司Intranet分發(fā)應(yīng)用程序,則只要將代碼下載到計(jì)算機(jī)上并在該計(jì)算機(jī)上運(yùn)行應(yīng)用程序即可。

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

WindowsInstaller2.0可以安裝、修復(fù)或移除全局程序集緩存和私有目錄中的Microsoft.NETFramework程序集。

9.3.3程序部署

VisualStudio為部署基于Windows的應(yīng)用程序提供兩種不同的策略:

●使用ClickOnce技術(shù)發(fā)布應(yīng)用程序。

●使用WindowsInstaller技術(shù)通過傳統(tǒng)安裝來部署應(yīng)用程序。

通過ClickOnce部署,可以將應(yīng)用程序發(fā)布到中心位置,然后用戶再從該位置安裝或運(yùn)行應(yīng)用程序;通過WindowsInstaller部署,可將應(yīng)用程序打包到setup.exe文件中,并將該文件分發(fā)給用戶,用戶可以運(yùn)行setup.exe文件安裝應(yīng)用程序。

選擇部署策略時(shí)有幾個(gè)因素要考慮:應(yīng)用程序類型、用戶的類型和位置、應(yīng)用程序更新的頻率以及安裝要求。

大多數(shù)情況下,ClickOnce部署為最終用戶提供更好的安裝體驗(yàn),而要求開發(fā)人員花費(fèi)的精力也少。但是,在某些情況下必須使用WindowsInstaller部署。

表9-4將ClickOnce部署的功能與WindowsInstaller部署的功能進(jìn)行了比較。

提示:VisualStudio中的部署工具旨在處理典型的企業(yè)部署需求,這些工具未涵蓋所有可能的部署方案。對于更高級的部署方案,可能需要考慮使用第三方部署工具或軟件分發(fā)工具,如SystemsManagementServer(SMS)。表9-4ClickOnce部署的功能與WindowsInstaller部署的功能比較表

1.通過ClickOnce部署

簡單來說,ClickOnce應(yīng)用程序就是任何使用ClickOnce技術(shù)發(fā)布的Windows窗體或控制臺應(yīng)用程序??梢圆捎萌N不同的方法發(fā)布ClickOnce應(yīng)用程序:從網(wǎng)頁發(fā)布、從網(wǎng)絡(luò)文件共享發(fā)布以及從媒體(如CD-ROM)發(fā)布。ClickOnce應(yīng)用程序既可以安裝在最終用戶的計(jì)算機(jī)上并在本地運(yùn)行(即使當(dāng)計(jì)算機(jī)脫機(jī)時(shí)也可以運(yùn)行),也可以僅以聯(lián)機(jī)模式運(yùn)行,而不在最終用戶的計(jì)算機(jī)上永久安裝任何內(nèi)容。

ClickOnce應(yīng)用程序可以自行更新;這些應(yīng)用程序可以在較新版本變?yōu)榭捎脮r(shí)檢查較新版本,并自動替換所有更新的文件。開發(fā)人員可以指定更新行為;網(wǎng)絡(luò)管理員也可以控制更新策略如將更新標(biāo)記為強(qiáng)制性的。最終用戶或管理員還可以對更新進(jìn)行回滾,使應(yīng)用程序恢復(fù)到早期的版本。

因?yàn)镃lickOnce應(yīng)用程序在本質(zhì)上是被隔離的,所以安裝或運(yùn)行ClickOnce應(yīng)用程序不會干擾現(xiàn)有的應(yīng)用程序。ClickOnce應(yīng)用程序是完全獨(dú)立的;每個(gè)ClickOnce應(yīng)用程序都安裝到一個(gè)安全的基于每個(gè)用戶、每個(gè)應(yīng)用程序的緩存中,并從該緩存運(yùn)行。默認(rèn)情況下,ClickOnce應(yīng)用程序運(yùn)行在Internet或Intranet安全區(qū)域中。如果有必要,應(yīng)用程序可以請求提升的安全權(quán)限。

下面講述如何發(fā)布ClickOnce應(yīng)用程序。

1)發(fā)布到Web

(1)在“解決方案資源管理器”中,選擇應(yīng)用程序項(xiàng)目。

(2)右擊項(xiàng)目節(jié)點(diǎn),然后選擇“發(fā)布”,將出現(xiàn)“發(fā)布向?qū)А薄?/p>

(3)在“您要在哪里發(fā)布該應(yīng)用程序?”頁上,輸入一個(gè)有效的URL,然后單擊“下一步”。

(4)在“該應(yīng)用程序可以脫機(jī)使用嗎?”頁中,單擊適當(dāng)?shù)倪x項(xiàng):

①如果要使應(yīng)用程序在用戶與網(wǎng)絡(luò)斷開連接時(shí)也可以運(yùn)行,則單擊“是,該應(yīng)用程序可以聯(lián)機(jī)或脫機(jī)使用”?!伴_始”菜單上將創(chuàng)建應(yīng)用程序的快捷方式。

②如果要從發(fā)布位置直接運(yùn)行應(yīng)用程序,則單擊“否,該應(yīng)用程序只能聯(lián)機(jī)使用”?!伴_始”菜單上不創(chuàng)建快捷方式。單擊“下一步”繼續(xù)。

(5)單擊“完成”以發(fā)布應(yīng)用程序。

發(fā)布狀態(tài)顯示在任務(wù)欄的狀態(tài)通知區(qū)域中。

2)發(fā)布到文件共享

(1)在“解決方案資源管理器”中,選擇應(yīng)用程序項(xiàng)目。

(2)在“生成”菜單上,單擊“發(fā)布Projectname”,將出現(xiàn)“發(fā)布向?qū)А薄?/p>

(3)在“您要在哪里發(fā)布該應(yīng)用程序?”頁上,使用格式“\\機(jī)器名\應(yīng)用程序名”輸入一個(gè)有效的文件路徑,然后單擊“下一步”。

(4)在“用戶如何安裝應(yīng)用程序?”頁中,選擇用戶安裝應(yīng)用程序的位置:

①如果用戶從網(wǎng)站安裝,則單擊“從網(wǎng)站”,并輸入與上一步中輸入的文件路徑相對應(yīng)的URL,然后單擊“下一步”(此選項(xiàng)通常在將FTP地址指定為發(fā)布位置時(shí)使用。從FTP的直接下載不受支持,因此需要在此處輸入U(xiǎn)RL)。

②如果用戶從文件共享直接安裝應(yīng)用程序,則單擊“從UNC路徑或文件共享”,然后單擊“下一步”(此選項(xiàng)用于形式為c:\deploy\myapp或\\server\myapp的發(fā)布位置)。

③如果用戶從可移動媒體安裝,則單擊“從CD-ROM或DVD-ROM”,然后單擊“下一步”。

(5)在“該應(yīng)用程序可以脫機(jī)使用嗎?”頁中,單擊適當(dāng)?shù)倪x項(xiàng):

①如果要使應(yīng)用程序在用戶與網(wǎng)絡(luò)斷開連接時(shí)也可以運(yùn)行,則單擊“是,該應(yīng)用程序可以聯(lián)機(jī)或脫機(jī)使用”。“開始”菜單上將創(chuàng)建應(yīng)用程序的快捷方式。

②如果要從發(fā)布位置直接運(yùn)行應(yīng)用程序,則單擊“否,該應(yīng)用程序只能聯(lián)機(jī)使用”?!伴_始”菜單上不創(chuàng)建快捷方式。單擊“下一步”繼續(xù)。

(6)單擊“完成”以發(fā)布應(yīng)用程序。發(fā)布狀態(tài)顯示在任務(wù)欄的狀態(tài)通知區(qū)域中。

3)發(fā)布到CD-ROM或DVD=ROM

(1)在“解決方案資源管理器”中,右擊應(yīng)用程序項(xiàng)目并選擇“屬性”,將出現(xiàn)“項(xiàng)目設(shè)計(jì)器”。

(2)單擊“發(fā)布”選項(xiàng)卡,在“項(xiàng)目設(shè)計(jì)器”中打開“發(fā)布”頁,然后單擊【發(fā)布向?qū)А堪粹o,出現(xiàn)“發(fā)布向?qū)А薄?/p>

(3)在“您要在哪里發(fā)布該應(yīng)用程序?”頁中,輸入發(fā)布應(yīng)用程序的文件路徑或FTP位置(如d:\deploy)。然后單擊“下一步”繼續(xù)。

(4)在“用戶如何安裝應(yīng)用程序?”頁中,單擊“從CD-ROM或DVD-ROM”,然后單擊“下一步”繼續(xù)。

(5)如果在CD-ROM上發(fā)布應(yīng)用程序,可能會希望從網(wǎng)站提供更新。在“應(yīng)用程序?qū)⒌侥睦餀z查更新?”頁中,選擇更新選項(xiàng):

①如果應(yīng)用程序?qū)z查更新,則單擊“該應(yīng)用程序?qū)南铝形恢脵z查更新”,然后輸入發(fā)布更新的位置。輸入的位置可以是文件位置、網(wǎng)站或FTP服務(wù)器。

②如果應(yīng)用程序不檢查更新,則單擊“該應(yīng)用程序?qū)⒉粰z查更新”。

單擊“下一步”繼續(xù)。

(6)單擊“完成”以發(fā)布應(yīng)用程序。

發(fā)布狀態(tài)將顯示在任務(wù)欄的狀態(tài)通知區(qū)域中。

注意:

完成發(fā)布后,需要使用CD刻錄機(jī)或DVD刻錄機(jī)從步驟(3)中指定的位置將文件復(fù)制到CD-ROM或DVD-ROM媒體。

【例9-4】使用ClickOnce部署VS2005中的WinForm應(yīng)用程序。

(1)新建項(xiàng)目“Demo9-4”。重新命名窗體為frmIE_Load,向窗體中添加如表

9-5

所示的控件。

雙擊btnLink,在btnLink_Click事件中輸入代碼:

privatevoidbtnLink_Click(objectsender,EventArgse)

{

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

webBrowser1.Update();

}

運(yùn)行程序,運(yùn)行結(jié)果如圖9-26所示。表9-5窗體frmIE_Load中添加的控件圖9-26程序運(yùn)行結(jié)果

(2)發(fā)布項(xiàng)目。在項(xiàng)目上點(diǎn)右鍵選擇“屬性”,會看到該項(xiàng)目的屬性列表。左邊的目錄中選擇“發(fā)布”,可以看到關(guān)于發(fā)布的屬性,如圖9-27所示。設(shè)置發(fā)布相關(guān)的屬性,發(fā)行者名稱為“廣東科學(xué)技術(shù)職業(yè)學(xué)院”,產(chǎn)品名稱為“clickOnce測試”,其他全部用默認(rèn)。單擊【立即發(fā)布】按鈕,發(fā)布成功后自動打開發(fā)布頁,如圖9-28所示。

(3)安裝。在本機(jī)或其他任意一臺可以訪問到發(fā)布網(wǎng)頁的機(jī)器上打開IE,訪問發(fā)布頁http://localhost/Demo9-4/publish.htm,點(diǎn)擊安裝。安裝成功后,程序會自動啟動。而開始菜單的目錄中會出現(xiàn)一個(gè)快捷方式,指向該程序,如圖9-29所示。圖9-27項(xiàng)目發(fā)布圖9-28發(fā)布頁面圖9-29發(fā)布頁面

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

增加引用:

usingSystem.Deployment.Application;

增加成員變量:

///<summary>///更新標(biāo)志:0,未檢測到更新;1,已檢測到更新;

privatestringflagUpdate="0";增加方法:

privatevoidUpdateApplication(){if(ApplicationDeployment.IsNetworkDeployed==true){ApplicationDeploymentad=ApplicationDeployment.CurrentDeployment;Text="當(dāng)前版本:"+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+",現(xiàn)在需要更新嗎?\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();}}}

運(yùn)行程序。

(5)二次發(fā)布。

(6)客戶端更新。在客戶端打開程序時(shí),系統(tǒng)會先檢測是否有更新的版本,如果有,則彈出頁面詢問是否下載,如圖9-30所示。選擇“確定”,則自動更新新版本。如圖9-31所示。此時(shí),若再有新的更新發(fā)布,程序可以自動檢測到更新,并詢問是否更新到新的版本,如圖9-32所示。需要更新點(diǎn)擊【是】則立即更新,更新完后程序會重新啟動。還可以點(diǎn)擊【否】暫時(shí)不更新,之后程序直到關(guān)閉都不再自動提醒,需要手工點(diǎn)擊刷新圖標(biāo)更新程序。圖9-30發(fā)布頁面圖9-31發(fā)布頁面

圖9-32發(fā)布頁面

2.通過WindowsInstaller部署

通過WindowsInstaller部署,可將應(yīng)用程序打包到setup.exe文件中,并將該文件分發(fā)給用戶,用戶可以運(yùn)行setup.exe文件安裝應(yīng)用程序。

在安裝過程中,還可以設(shè)置快捷方式和文件關(guān)聯(lián)、添加注冊表項(xiàng)、顯示自定義對話框以及檢查InternetExplorer的版本等。

注意:創(chuàng)建自己的安裝程序時(shí),并非需要執(zhí)行上面的所有步驟。

1)創(chuàng)建或添加部署項(xiàng)目

部署應(yīng)用系統(tǒng)時(shí),首先要將部署項(xiàng)目添加到解決方案。部署項(xiàng)目可以指定在開發(fā)時(shí)和開發(fā)后解決方案的部署位置以及部署方式。一個(gè)解決方案可包含多個(gè)部署項(xiàng)目,而部署項(xiàng)目可能與配置相關(guān)。

與WinForms相關(guān)的安裝項(xiàng)目有兩種:

●安裝項(xiàng)目:用于部署可執(zhí)行的應(yīng)用程序。

●合并模塊項(xiàng)目:部署不以獨(dú)立應(yīng)用程序的形式存在且不能直接部署的控件或組件。它是一個(gè)可重新分發(fā)的程序包,可以與現(xiàn)有安裝項(xiàng)目合并。

創(chuàng)建新部署項(xiàng)目的步驟如下:

(1)在“文件”菜單上指向“添加”,然后單擊“新建項(xiàng)目”。

(2)在隨后出現(xiàn)的“添加新項(xiàng)目”對話框的“項(xiàng)目類型”窗格中,打開“其他項(xiàng)目類型”節(jié)點(diǎn),選擇“安裝和部署”,如圖9-33所示。圖9-33新建部署項(xiàng)目

向解決方案中添加現(xiàn)有的部署項(xiàng)目的步驟如下:

(1)在“文件”菜單上指向“添加”,然后單擊“現(xiàn)有項(xiàng)目”。

(2)在隨后出現(xiàn)的“添加現(xiàn)有項(xiàng)目”對話框中,瀏覽到部署項(xiàng)目所在的位置,然后單擊“打開”。

2)設(shè)置部署項(xiàng)目屬性

部署項(xiàng)目具有兩類屬性,分別為常規(guī)項(xiàng)目屬性和配置相關(guān)屬性。常規(guī)屬性在“屬性”窗口中設(shè)置,此類屬性應(yīng)用于所有項(xiàng)目配置。若要設(shè)置配置相關(guān)屬性,請使用“部署屬性”對話框。配置相關(guān)屬性應(yīng)用于特定項(xiàng)目配置。

設(shè)置配置相關(guān)屬性的步驟如下:

(1)在“解決方案資源管理器”中,選擇安裝項(xiàng)目節(jié)點(diǎn)。

(2)在“視圖”菜單上選擇“屬性頁”,如圖

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論