專利名稱:在應用主機環(huán)境中執(zhí)行單元測試的方法和裝置的制作方法
技術領域:
本發(fā)明大體涉及軟件開發(fā),尤其涉及測試軟件組件。
背景技術:
在軟件的開發(fā)、修改或優(yōu)化中通常都希望測試軟件。可將軟件作為一個“黑盒子”進行測試,這意味著應用輸入來激勵該軟件,觀察響應生成的輸出并將其與對正確功能軟件的預期響應相比較。這樣的測試通常依靠使用與該軟件相接的現(xiàn)存外部接口添加輸入和輸出——所述接口即操作時用于與該軟件交換數(shù)據(jù)的接口。
圖1A示出了這一測試方法。使用了開發(fā)環(huán)境110和主機環(huán)境120。在開發(fā)環(huán)境110內準備測試。需要測試的程序在主機環(huán)境120內操作。主機環(huán)境120包括接口122和124。
開發(fā)環(huán)境通常是建立在開發(fā)人員編寫或測試程序的計算機上的進程。開發(fā)環(huán)境可以具有多種組件,諸如提供工具以幫助開發(fā)人員編寫程序或測試的一組件以及為執(zhí)行測試提供一測試環(huán)境的另一組件。主機環(huán)境通常是在相同或其他計算機上的進程。主機環(huán)境是由人類用戶或由開發(fā)環(huán)境啟動用于測試的主機應用程序時由操作系統(tǒng)創(chuàng)建的。
開發(fā)環(huán)境110包括代理程序112。代理程序112是控制各個測試的定時和順序的軟件程序。代理程序112也可以將那些測試的結果與期望結果相比較并且可以處理那些測試的結果或將其報告給開發(fā)人員或系統(tǒng)的某些其他部分。代理程序112調用測試,諸如114A、114B和114C。在示出的實施例中,代理程序112通過測試適配器113調用了一個測試。要執(zhí)行的每個測試都具有其自身的測試適配器用于為代理程序112提供對所有測試的標準接口。每個測試都施加輸入并觀察來自在主機環(huán)境120中運行的測試程序的輸出。
可由能夠通過可擴展接口接受內插附件程序的應用程序來創(chuàng)建主機環(huán)境120。例如在MicrosoftOffice應用程序套件里的應用程序,諸如Word字處理應用程序或Excel電子表格應用程序都接受內插附件程序。內插附件程序可以是由用戶編寫的或者是來自某些其他來源。內插附件程序可有一個或多個單元形成。此外,主機環(huán)境可包括也可被測試的一個或多個單元。在圖1A中,要被測試的主機環(huán)境120中的單元一般是由諸如126A、126B和126C的單元示出的。
可以使用黑盒子測試來測試這些單元。對于黑盒子測試,可以通過諸如接口122和124的外部接口訪問待測程序。例如,圖1A中示出了測試114A到114C通過接口122施加輸入并通過接口124獲取結果。通過將實際結果與期望結果比較,就可驗證待測程序的性能。
將軟件作為黑盒子測試的一個缺點是它需要多次輸入或輸入組合以完全實現(xiàn)所有的單元。此外,如果因為未觀察到響應一組特定輸入的期望輸出而檢測到錯誤很難識別需要修改的指定代碼單元以糾正該錯誤。
圖1B中示出了測試應用程序的另一種方法。在圖1B中,將諸如單元126A的測試中的單元載入到測試環(huán)境130。有時被稱為“.測試設備”的代理程序112可類似地控制對要執(zhí)行測試的選擇和定序,諸如通過調用測試154。盡管在圖1B的實例中是在單個測試中的單元上和在開發(fā)環(huán)境或測試環(huán)境中執(zhí)行測試的。
開發(fā)環(huán)境130包括幫助開發(fā)人員編寫測試的工具。例如MicrosoftVisualStudio開發(fā)環(huán)境包含允許開發(fā)人員設計測試、控制這些測試的執(zhí)行并分析其結果的工具。MicrosoftVisual Studio開發(fā)環(huán)境中所含工具的一大特性稱為智能感知(Intellisense)。智能感知特性對代碼編輯器的用戶提供了上下文敏感的幫助。例如在用戶編寫訪問一程序內一變量的代碼時,智能感知特性就可為該用戶提供該程序內的變量列表,允許用戶快速選擇正確的變量使用,或在用戶開始輸入指令時,使代碼編輯器正確地完成這些指令。
如果含有待測碼的主機環(huán)境內的計劃是參考了含有測試程序的開發(fā)環(huán)境內的計劃,則使用Visual Studio開發(fā)環(huán)境的測試開發(fā)人員就能夠使用智能感知特性創(chuàng)建用于圖1A中示出的測試配置結構的測試。然而僅僅是一個計劃的公共接口可在參考它的另一計劃中使用。因此,智能感知特性在訪問測試中的單元的非公共部分時是不可用的。
希望具有一種測試軟件單元的改進方法。
發(fā)明內容
本發(fā)明涉及一種對軟件單元執(zhí)行測試的方法,該方法允許該測試在主機環(huán)境內運行。在主機環(huán)境內的測試確保該主機環(huán)境能夠正確地初始化測試中的單元并允許由主機應用程序提供的上下文信息在測試期間可用。從而能夠實現(xiàn)更為完全和精確的測試。在另一方面,在開發(fā)環(huán)境和主機環(huán)境之間的接口可由如下方法提供,即待測軟件的方法、性質和其他參數(shù)即使不是公共的也能夠為開發(fā)環(huán)境所用。該特性使得動態(tài)示例程序測試的生成成為可能。這也使得為準備用于特定單元的測試程序的開發(fā)人員提供上下文敏感信息成為可能。
在一個方面,本發(fā)明涉及測試在第一環(huán)境中操作的程序的方法。這一方法在用于測試具有多個單元并有至少一個單元待測的程序尤為有效。本方法包括在第二環(huán)境中執(zhí)行測試代理程序。該測試代理程序指定將執(zhí)行用于測試測試中的單元的測試。響應于執(zhí)行該測試代理程序,就在所述第一環(huán)境中執(zhí)行指定的測試。該測試生成了表示測試中的單元性能的測試結果。來自第一環(huán)境中操作的指定測試的測試結果被通信至在第二環(huán)境中操作的測試應用程序。
在另一個方面,本發(fā)明涉及測試在第一環(huán)境中操作的程序的方法。該方法對測試具有多個單元并其中至少有一個單元是測試中的單元的程序尤為有效。本方法包括在第一環(huán)境中載入該程序并展現(xiàn)在所述第一環(huán)境中一對象的接口。該對象響應由所述端口提供的信息而用于載入測試適配器。該測試適配器執(zhí)行測試中的單元的測試。
在又一個方面,本發(fā)明涉及具有執(zhí)行各步驟以實現(xiàn)提供了一開發(fā)環(huán)境的軟件系統(tǒng)的計算機可執(zhí)行指令的計算機可讀介質,其中測試程序可以為測試在多個主機環(huán)境中的一個內操作的程序的單元而開發(fā),所述計算機可執(zhí)行指令執(zhí)行的步驟包括創(chuàng)建測試代理程序;并且創(chuàng)建多個主機適配器中的一個,配置成要由所述測試代理程序使用的每個主機適配器都調用在多個主機環(huán)境之一內執(zhí)行的測試程序。
附圖并未按比例畫出。附圖中,由類似的序號表示在各圖中示出的每一相等或接近相等的組件。為了簡明起見,并未在每張附圖中標出每一組件。在附圖中
圖1A是示出了現(xiàn)有技術中黑盒子測試的示意圖;圖1B是示出了現(xiàn)有技術中單元測試的示意圖;圖2A是示出了根據(jù)本發(fā)明一個實施例的單元測試的示意圖;圖2B是示出了根據(jù)本發(fā)明另一個實施例的單元測試的示意圖;圖3是示出了根據(jù)本發(fā)明又一個實施例的單元測試的示意圖;圖4是示出了根據(jù)本發(fā)明再一個實施例的單元測試的示意圖;圖5是示出了根據(jù)本發(fā)明一個實施例的用戶界面的示意圖;具體實施方式
圖1B中示出的測試方法的一個缺點是測試中的單元126A是在開發(fā)環(huán)境130內執(zhí)行的。如果測試中的單元126A請求來自主機環(huán)境120的上下文信息,則該信息在測試期間不可得到。對測試中的單元126A中訪問或依靠來自主機環(huán)境120的上下文信息的部分實行測試的任何測試中的單元126A的測試都很可能失敗。測試的失敗是因為測試中的單元返回了一個不正確的結果或者是因為在沒有上下文信息的情況下測試中的單元不能夠操作。
此外,圖1B的方法也不能在運行時間建立待測碼的情況下使用。例如ASP.NET是允許在運行時間定義被創(chuàng)建代碼的條件的編程環(huán)境。對于此代碼,直到定義所述代碼之前不能建立測試設施。
圖2A示出了用于測試執(zhí)行的期望結構。在開發(fā)環(huán)境110中運行的代理程序112調用測試214。測試214訪問在主機環(huán)境120中運行的測試中的單元226。依據(jù)對其進行編程的特定應用和語言,測試中的單元226可以是在主機環(huán)境120中的函數(shù)、進程、方法、對象或在內插附件程序或應用程序中的其他構造中的一個或組合。
圖2B示出了一個另外的實施例。在圖2B的實施例中,測試214是在主機環(huán)境120中執(zhí)行的,并且與開發(fā)環(huán)境110中的代理程序112通信。在此實施例中,測試214也可以直接訪問來自主機環(huán)境120的上下文信息。
在圖2A和2B中示出的配置允許測試中的單元226在其主機環(huán)境內被測試。如果測試中的單元226依靠主機環(huán)境120內的任何屬性、變量或其他參數(shù),則在其被測試時將訪問這些屬性、變量或其他參數(shù)。同樣地,如果測試中的單元226的操作依靠主機環(huán)境120內執(zhí)行的任何初始化,則在測試之前就會初始化主機環(huán)境內的測試中的單元226。與現(xiàn)有測試結構相比較,由圖2A或2B結構指導的測試會更為精確地表示實際的操作狀態(tài)并且在其努力實行測試中的單元226內依賴主機環(huán)境120的某些參數(shù)的部分代碼時更不容易失敗或產(chǎn)生異常狀態(tài)。
在某些環(huán)境中可以增強在圖2A或2B中示出的結構,諸如當測試中的單元226包括非公共接口時。在此使用的術語“非公共”接口意味著從在使用編程語言的標準特性定義接口的程序區(qū)域之外的代碼的編程語言標準特性無法訪問的接口。這些“非公共”接口的實例是稱為“內部的”、“受保護的”或“專用的”那些接口。例如在某些編程語言中在“項目”中創(chuàng)建的接口。參考在另一項目中的一個項目允許一個項目中的公共接口用于另一項目,但是非公共接口僅在它們被定義的項目中可用。
當動態(tài)地示例、編譯測試中的單元226時或者發(fā)起在編譯或生成測試214時該測試中的單元226不可用的情況下,希望有另外的組件。在這些情況下的增強允許開發(fā)環(huán)境110內諸如那些包括了智能感知特性的工具正確地顯示涉及測試所需的上下文敏感信息,而所述測試將實行測試中的單元226即使它們不能直接訪問關于測試中的單元226的變量、方法或其他測試的信息。
圖3示出了即使在無法直接訪問測試中的單元226的情況下仍允許在其主機環(huán)境120內測試該測試中的單元226的測試體系結構的一個可選實施例。圖3的實施例還證明了在商業(yè)開發(fā)環(huán)境中可能是需要的封裝。例如,封裝允許開發(fā)環(huán)境結合多個主機環(huán)境并結合僅有一個相當小數(shù)量的附加軟件組件的多個測試使用來與每個新的主機環(huán)境或每一新的測試相接。
在圖3的實例中,代理程序312在開發(fā)環(huán)境310中運行。作為現(xiàn)有技術中的代理程序312是協(xié)調測試執(zhí)行,接收測試結果并且與用戶接口或者報告或使用測試結果的程序。在此實施例中,代理程序312是用C#編程語言編寫的函數(shù),但是也可使用任何合適的編程結構來實現(xiàn)代理程序。
在示出的實施例中,代理程序312與測試執(zhí)行填補(shim)314交互。測試執(zhí)行填補314代替由現(xiàn)有技術中由代理程序調用的諸如測試適配器113的測試適配器。在測試執(zhí)行填補314的接口與測試適配器113的接口相同的情況下,能夠以現(xiàn)有技術或以任何其他合適的方式構造測試代理程序312。
測試執(zhí)行填補314封裝針對主機環(huán)境320的任何接口。在商業(yè)開發(fā)環(huán)境中,開發(fā)系統(tǒng)可以認出設置用于反映主機環(huán)境320類型的主機類型屬性。多個主機適配器是可用的,以允許使用相同的開發(fā)環(huán)境來準備用于多個主機環(huán)境的測試。例如可以使用相同的開發(fā)環(huán)境來開發(fā)為MicrosoftWord字處理應用程序或MicrosoftExcel電子表格應用程序準備的內插附件程序的測試。在此所述的實施例中,每一主機類型可具有一測試執(zhí)行填補。在此實例中,每一測試執(zhí)行填補都是一組Visual Basic函數(shù),但是也可使用任何合適的編程構造來實現(xiàn)一測試執(zhí)行填補。
測試執(zhí)行填補314為接口的一側提供在主機環(huán)境中操作的程序。此時該接口的相對側則由主機環(huán)境320內的主機適配器322提供。在圖3中示出的通信是經(jīng)過接口122的。更一般的情況是在測試執(zhí)行填補314和主機適配器322之間的通信可以通過任何合適的通信信道。依據(jù)開發(fā)環(huán)境310和主機環(huán)境320的指定實現(xiàn),合適的通信信道的實例包括共享的存儲器空間、命名管線、RPC接口或COM接口。作為另一個實例,可以使用在商業(yè)上可得到的.NET主機環(huán)境中的“遠程”構造來創(chuàng)建通信信道。
在操作期間,主機環(huán)境320(或某些內插附件程序)認出主機環(huán)境以測試模式操作,并且初始化主機適配器322。作為初始化主機適配器322的一部分,到主機適配器322的接口對于在開發(fā)環(huán)境中運行的程序變得可用。即使是在測試模式下操作,主機環(huán)境320仍載入并初始化測試中的單元226使得測試中的單元226將存在于所述主機環(huán)境中。依據(jù)具體的主機環(huán)境和具體的測試中的單元,主機環(huán)境320可以初始化也可以不初始化測試模式下的測試中的單元226的執(zhí)行。同樣依據(jù)具體的實現(xiàn),可由正被執(zhí)行的測試或以任何其他合適的方式調用測試中的單元的執(zhí)行。
主機環(huán)境和開發(fā)環(huán)境之間的通信信道允許開發(fā)環(huán)境內的代理程序312初始化和控制主機環(huán)境內測試330的執(zhí)行,并且接收來自測試330的執(zhí)行結果。
主機適配器322的具體實現(xiàn)將依賴于主機環(huán)境320。作為一實例,在主機環(huán)境是MicrosoftOffice應用程序的情況下,主機適配器322可以是一組VisualBasic函數(shù)。給予主機適配器一個實例的偽碼可包括在附加在此的計算機程序列表中。
在測試模式中放置主機環(huán)境的機制還將依賴于開發(fā)環(huán)境的實現(xiàn)。在ASP.NET主機環(huán)境的一個實例中,測試的執(zhí)行涉及HTTP模塊的使用。測試執(zhí)行填補314能夠觸發(fā)對包括指定了要進入的測試模式的首部的一HTTP請求的發(fā)送。該請求還可以表示要測試的單元。不考慮用于初始化測試模式的具體機制,仍在主機環(huán)境320中初始化測試中的單元226。
主機適配器322調用特定的測試330。為了進一步的抽象,主機適配器322可以通過測試適配器(圖3中未示出)訪問特定的測試方法。每個測試都具有其自身的測試適配器,而所有的測試適配器都表示了連接至主機適配器322的一個公共接口。以此方式,對一個主機環(huán)境僅請求單個主機適配器322,但是可在主機環(huán)境內可調用任何數(shù)量的測試。諸如在測試執(zhí)行時提供給該測試的參數(shù)數(shù)量和類型的每一測試的具體要求可以封裝在所述測試適配器內。
一旦被調用,測試330就與測試中的單元226交互以激勵該測試中的單元并且觀察其對激勵的響應。依據(jù)特定的測試中的單元結構和功能以及被執(zhí)行測試的特性而對測試中的單元226提供各種形式的激勵是可能的。例如,測試可以通過調用該單元的方法并且提供作為方法調用內自變量的預定值來為測試中的單元提供激勵。
在圖3的實施例中,測試330通過存取程序(accessor)訪問測試中的單元226。存取程序是使用反映來確定一單元的方法、屬性、類或其他參數(shù)的程序??赏ㄟ^將存取程序類稍后綁定到測試中的單元226來創(chuàng)建存取程序。在使用存取程序類時,測試開發(fā)人員可以編寫測試中的單元諸如參考所述存取程序類的測試330的測試程序而不必知道所述測試中的單元細節(jié)。
通過稍后綁定有存取程序類來創(chuàng)建存取程序的一種方法是通過“反映”的使用。“反映”是允許單元讀取保持關于其方法、屬性、類或其他參數(shù)的信息的數(shù)據(jù)結構的許多編程語言的一種特征。可以使用反映信息來示例存取程序332以使其能夠訪問作為測試目標的特定測試中的單元226。
在動態(tài)地示例測試中的單元226處通過稍后綁定存取程序332特別有用測試中的單元。因為即使在示例測試中的單元226之前存取程序332就可用,所以訪問測試中的單元226所需的信息在開發(fā)環(huán)境310內可用,就使得諸如智能感知的特性可以具有對具有開發(fā)測試或測試中的單元226的程序的上下文敏感信息所需的信息。以此方式,可以使用通常設計代碼可用的全部工具來準備測試330。
沒有必要使用分開的存取程序來接收由測試中的單元226反映的信息。作為一個可選實施例的實例,可將相同的功能并入測試330。
在測試330生成結果時,這些結果可被返回給代理程序312。該結果可以通過主機適配器322返回。另外也可將該結果直接傳送給開發(fā)環(huán)境。例如,代理程序312或測試執(zhí)行填補314可以包括公共接口。因為是在代理程序312或測試執(zhí)行填補314之后在開發(fā)環(huán)境內準備測試330,所以代理程序312或測試執(zhí)行填補314的接口對于測試330可用。
圖3是響應于由開發(fā)環(huán)境310內的代理程序執(zhí)行的命令而在主機環(huán)境320內初始化和運行的測試中的單元226的一般表示。該一般表示包括即使在不知道或對該測試在編譯時間不可用的待測的具體代碼時仍舊允許在一開發(fā)環(huán)境中開發(fā)測試的特性??梢杂门c所述開發(fā)環(huán)境和主機環(huán)境相兼容的任何合適的方式來實現(xiàn)這一測試體系結構。
圖4是一過程圖解,通過該過程可在表示為ASP.NET環(huán)境的主機環(huán)境中執(zhí)行在開發(fā)環(huán)境中準備的測試。以此方式進行的測試可以驗證實現(xiàn)一網(wǎng)站的應用程序的操作。在所述的實施例中,開發(fā)環(huán)境可以訪問用于待測網(wǎng)站的web.config文件以方便所述的接口。
在設計了一個或多個測試之后,用戶可以通過開發(fā)環(huán)境310中的命令行界面調用一測試。在圖4的實例中,運行一測試引發(fā)代理程序410在開發(fā)環(huán)境310內的運行并且控制該測試的執(zhí)行。在此實施例中,代理程序410可以是由C#語言編寫的程序。它可以在用于創(chuàng)建被執(zhí)行測試的相同開發(fā)環(huán)境中運行或者可以在一個完全分開的開發(fā)環(huán)境內運行,甚至可以在一臺不同的計算機上運行。
為了測試在特定主機環(huán)境內的單元,代理程序410示例一個適于與該主機環(huán)境接口的測試執(zhí)行填補412。在此實例中,測試執(zhí)行填補412包括與ASP.NET主機環(huán)境的接口。開發(fā)環(huán)境可以包括用于每個待執(zhí)行測試的多個測試執(zhí)行填補。每個測試執(zhí)行填補都可作為不同主機環(huán)境的主機適配器。
在所述的實施例中,所述測試執(zhí)行填補不必考慮與其交互的具體主機環(huán)境,就能夠具有預定格式的一接口432。以此方式,代理程序410可與任何測試執(zhí)行填補通信。每個測試都具有分開的測試執(zhí)行填補412以致于可以為代理程序410提供一接口,通過該接口就能夠訪問任何期望的測試。測試執(zhí)行填補412發(fā)送訪問包含有測試中的單元的主機環(huán)境320中的應用程序的命令。在主機環(huán)境是ASP.NET環(huán)境的示出實施例中,通過發(fā)出HTTP請求做出訪問。HTTP請求指定將被測試的程序或程序對象。在此實例中,該程序對象是由URL識別的頁面。HTTP請求指明了在測試模式下應被調用的主機環(huán)境以及作為該測試目標的指定的URL。
主機環(huán)境320響應由測試執(zhí)行填補412發(fā)送的請求。響應于一請求,就調用HTTP模塊450。由模塊450表示的具體的HTTP模塊可以響應于來自測試執(zhí)行填補412的請求被具體地創(chuàng)建。如果先前響應于一請求被調用的模塊已損壞,就可使用一新模塊。然而要是未使用的模塊沒有損壞,那么也可以使用該模塊處理所述請求。在ASP.NET主機環(huán)境中能夠重新使用HTTP模塊是因為ASP.NET的無狀態(tài)特性。其他主機環(huán)境的操作可能有所不同。HTTP模塊450的具體格式和創(chuàng)建方法依靠主機環(huán)境320的實現(xiàn)并且可以使用響應于測試請求的任何合適的方式。
響應于來自測試執(zhí)行填補412的請求,HTTP模塊450根據(jù)主機環(huán)境內的正常處理來初始化目標頁面。以此方式就可由主機環(huán)境正確地初始化該測試中的單元并使其準備好接收測試。在此實例中,目標頁面示出作為測試中的單元460。此外。HTTP模塊450載入主機適配器454并且使用測試執(zhí)行填補412對其進行注冊,從而將送入主機適配器454的接口展現(xiàn)給測試執(zhí)行填補412。
主機適配器454提供到主機環(huán)境310的接口。在圖4的實例中,主機適配器454是以C#函數(shù)來實現(xiàn)的。
主機適配器454具有可由在開發(fā)環(huán)境中執(zhí)行的程序來訪問的接口480。在主機環(huán)境320是由ASP.NET提供的所示實施例中,可以通過允許一個程序用另一個程序注冊的.NET遠程構造來展現(xiàn)接入旨在由其他環(huán)境內程序訪問的一個軟件程序的接口。在此,請求與主機適配器454接口的信息能夠使用.NET注冊命令的接口436而對測試執(zhí)行填補412可用。
一旦接口480用測試執(zhí)行填補412注冊,測試執(zhí)行填補412就可通過接口480與主機適配器454通信。通過接口480,測試執(zhí)行填補412可以請求關于用于執(zhí)行指定測試的主機適配器454的信息。可以使用任何合適的命令來獲取信息,但在此實例中使用的是接口480上的方法。由此測試執(zhí)行填補412可以獲得對測試適配器456的接口482的訪問權。在此實施例中,測試適配器456是為在主機環(huán)境內執(zhí)行的所有測試提供一致接口的包裝。測試適配器456可以作為C#函數(shù)或者以任何其他合適的方式實現(xiàn)。
測試適配器456創(chuàng)建一個單元測試適配器458的范例,其中所述單元測試適配器458是針對在測試中的單元460上執(zhí)行的具體測試416。單元測試適配器458可以作為C#函數(shù)或者以任何其他合適的方式實現(xiàn)。測試適配器456可被認為是用于單元測試適配器458的存取程序。單元測試適配器458可以通過調用在運行時間內確定的具體測試416而稍后綁定到具體的測試中的單元。稍后綁定所需的信息可從測試416通過反映或其他任何合適的方式導出。
單元測試適配器458包括接口484,通過該接口能夠與測試適配器456通信。因為在開發(fā)環(huán)境310中執(zhí)行的程序能夠通過展現(xiàn)接口482通信,所有無需在開發(fā)環(huán)境310中展現(xiàn)接口484。
單元測試適配器458調用測試416,允許測試416在主機環(huán)境320內執(zhí)行。作為替代,可將測試功能直接并入單元測試適配器458。
一旦被載入并恰當配置,就可執(zhí)行測試416。測試416可以是在能由單元測試適配器458載入并運行的DLL模塊內,但是也可使用任何合適的形式??梢酝ㄟ^在開發(fā)環(huán)境310和主機環(huán)境320之間被建立的接口來提供具體的命令和上下文數(shù)據(jù)。所得結果可以通過接口430送回代理程序410。
在開發(fā)環(huán)境和主機環(huán)境內的測試中的單元之間提供接口的具體方法可依賴于該主機環(huán)境的細節(jié)而變化。例如當主機環(huán)境是MicrosoftOffice應用程序套件內的應用程序時,不是指定一網(wǎng)頁作為測試目標,而是在開發(fā)環(huán)境內由測試適配器發(fā)送的測試請求可以指定包括了所述測試中的單元的特定文檔。
執(zhí)行單個測試的步驟以其出現(xiàn)在一個實例中的次序用數(shù)字1,2……9編號。步驟1表示代理程序410與測試執(zhí)行填補412通信。步驟2表示測試執(zhí)行填補412發(fā)送測試請求給主機環(huán)境320。步驟3表示HTTP模塊450注冊主機適配器454的接口。步驟4示出了在測試執(zhí)行填補412和主機適配器454之間的信息交換以允許測試執(zhí)行填補412提供接口482與測試適配器456通信。步驟5表示在測試執(zhí)行填補412和測試適配器456之間通信執(zhí)行一測試所必需的信息。步驟6表示了在運行測試的過程中在測試適配器456和單元測試適配器458之間的通信。步驟7表示了在單元測試適配器458和測試416之間的通信。測試416可以包括關于其應該如何被配置的數(shù)據(jù)。此外在執(zhí)行測試的過程期間能夠交換數(shù)據(jù)。步驟8表示了由單元測試適配器458從測試中的單元460中獲取的為配置測試目標測試中的單元460所必需的信息。步驟9示出了在開發(fā)環(huán)境內把測試結果發(fā)送回代理程序410。將各步驟編號以提供在單個測試執(zhí)行期間數(shù)據(jù)和控制的流程的實例。在實際實現(xiàn)中,這些步驟無需以示出的次序實現(xiàn)。此外,每一步驟不必只出現(xiàn)一次。例如測試適配器414可以在多個實例中發(fā)送命令或數(shù)據(jù)給測試適配器456。
圖4示出了單個測試416的執(zhí)行。在測試實際的應用程序中,也可在一測試運行內執(zhí)行多個測試。代理程序410同樣能夠在測試運行內控制多個測試的調用。在測試運行內的每個測試都可利用其本身的測試執(zhí)行填補412??梢栽诖沓绦?10內提供可應用于整個測試運行的屬性或其他設置??梢酝ㄟ^測試執(zhí)行填補412或者通過單元測試適配器458或者提供測試416來應用適用于單個測試的屬性或其他設置。
例如,無需為每個測試指定用于測試的一個完整的URL。而可在測試環(huán)境中一次指定諸如指定特定機器的部分的URL的某個部分。對URL的所有后續(xù)參考都可指該機器。例如可以為要執(zhí)行的每個單元測試指定一個機器無關的片段,諸如指定特定頁面的那部分。
圖5示出了使用上述軟件配置可能得到的開發(fā)環(huán)境的附加方面。圖5示出了接入到諸如可由程序員用于在開發(fā)環(huán)境310中開發(fā)測試的測試編輯器的界面500。界面500在程序員編寫測試程序時顯示諸如語句510的程序語句。
界面500還包括在此作為彈出窗口示出的輔助顯示區(qū)512。輔助顯示區(qū)可用于顯示與用戶編寫測試程序時相關的信息。在此實例中,輔助顯示區(qū)512顯示了關于用于訪問作為該測試程序目標的測試中的單元的存取程序的信息。
即使在編寫測試時沒有定義測試中的單元,訪問它所需的信息也能如圖5所示通過存取程序得到。由此也可在開發(fā)環(huán)境中操作諸如智能感知的特性。
在示出的實施例中,顯示的具體信息依賴于上下文。在圖5中描繪的實例里,用戶已輸入了指令510的一部分。指令510包括對用于訪問的測試中的單元的代碼存取程序內一變量的部分參考。指令的該部分足以識別已輸入的哪些需要通過在代碼存取程序內定義的變量名來完成。因此彈出窗口512包括在代碼存取程序內定義的變量名列表。代替輸入完整的變量名,用戶可以從彈出窗口512中選擇所需變量。從列表中選擇條目比要求用戶鍵入該條目的完整標識符更為簡單并且更不容易出錯。
本方法不限于簡單地顯示變量名。每當與其他上下文信息相結合的部分指令提供了識別該組選擇的足夠信息時可以呈現(xiàn)一組選擇列表??梢詫δ軌蛟诔绦蛑惺褂玫暮瘮?shù)、界面或其他結構使用本方法。可以如現(xiàn)有技術那樣執(zhí)行該選擇的組的識別和顯示。在主機環(huán)境中執(zhí)行測試中的單元的方法與存取程序的使用兼容以使得為創(chuàng)建圖5中顯示類型信息所必需的信息可用。
已經(jīng)討論了本發(fā)明至少一個實施例的若干方面,應該認識到本領域普通技術人員能夠輕易獲取各種改變、修改和改進。
例如,以上討論的軟件體系結構無需依賴其中執(zhí)行主機環(huán)境和開發(fā)環(huán)境的具體硬件體系結構。主機環(huán)境和開發(fā)環(huán)境能夠在同一單處理器或多處理器系統(tǒng)上執(zhí)行?!斑h程”可以位于通過在一臺計算機上運行的不同主機應用程序所創(chuàng)建的不同環(huán)境之間并且無需是在分開物理位置內的計算機、服務器或其他處理器上執(zhí)行的進程之間。
而且,諸如圖2到圖4的附圖示出了在開發(fā)環(huán)境或主機環(huán)境內執(zhí)行的軟件組件。如果一個測試具有在該主機環(huán)境內可用的方法、屬性或其他上下文信息的訪問就可認為在該環(huán)境中執(zhí)行了該測試。用于創(chuàng)建或調用一程序的應用程序無需支配該程序執(zhí)行的環(huán)境。
此外,其上執(zhí)行一程序的硬件無需決定其執(zhí)行環(huán)境。作為一個具體的實例,當希望測試用于諸如PDA或靈巧電話機的便攜電子設備的應用程序時,可以希望將主機環(huán)境看做是一個分開的遠程平臺,在其中在主機和開發(fā)環(huán)境之間的所有交互都是通過.NET遠程進行的。另外還希望將所有或部分的代理程序或測試程序載入便攜電子設備用于執(zhí)行。
在此使用時,希望通常在測試中的單元內非公開的方法和變量能夠通過存取程序得到反映。更一般地,可以反映測試中的單元的任何參數(shù)。通過存取程序反映出的參數(shù)性質或類型可以基于其中準備的特定測試中的單元或編程語言而變化。
對測試結果作出的使用并不是對本發(fā)明的限制。測試結果可以提供關于測試中的單元的性能的某些方面的數(shù)據(jù)。性能信息的具體類型將依賴于具體的測試程序。性能信息能夠指示該單元是否提供了期望的操作結果。另外它還能夠提供關于單元的執(zhí)行時間或者在測試執(zhí)行期間使用的處理源的信息。
作為另一個實例,也可改變訪問測試中的單元的具體方法。不要求使用抽象。另外還可使用更多的抽象級別。作為一實例,圖4示出了測試適配器456通過單元測試適配器458訪問測試416。還能夠提供附加的抽象級別,諸如通過提供環(huán)繞測試416的包裝。另外還可以使用更少的抽象級別,諸如通過讓測試適配器456直接訪問測試416。
通常,在圖中示出的含有分開模塊的程序為簡單起見是以此方式示出的。由多個塊示出的函數(shù)可以組合成為單個函數(shù)、網(wǎng)頁或其他程序元素。另外示出在單個塊內執(zhí)行的函數(shù)能夠在多個程序元素中實現(xiàn)。在上述一個塊的函數(shù)在多個程序元素中實現(xiàn)的情況下,這些程序元素能夠聚集看成單個功能塊而被查看。相反地,當一個程序元素實現(xiàn)了示出作為多個塊的功能時,就可認為該模塊是任何或所有功能塊的實現(xiàn)。
這些改變、修改和改進旨在成為本公開的一部分,并且位于本發(fā)明的精神和范圍之內。因此在前的描述和附圖僅出于實例的目的。
能夠以任意多種方式實現(xiàn)本發(fā)明的上述實施例。例如可以使用硬件、軟件或它們的組合來實現(xiàn)這些實施例。當以軟件實現(xiàn)時,可以在單個計算機內提供的或是在多個計算機中分布的任何合適的處理器或處理器集合上執(zhí)行軟件代碼。
同樣在此概述的各種方法或過程也可編碼成在使用各種操作系統(tǒng)或平臺中的任何一種的一個或多個處理器上可執(zhí)行的軟件。此外,可以使用若干合適的編程語言和/或傳統(tǒng)的編程或腳本工具的任一種來編寫該軟件,并可將該軟件編譯成可執(zhí)行機器語言代碼。
在此方面,本發(fā)明的一個實施例針對帶有一個或多個編碼程序的計算機可讀介質(或多個計算機可讀介質)(例如計算機存儲器、一個或多個軟盤、致密盤、光盤、磁帶等),當這些程序在一個或多個計算機或其他處理器上執(zhí)行時,就可執(zhí)行實現(xiàn)了上述本發(fā)明各實施例的方法。計算機可讀介質可以是便攜的,以使得存儲其上的程序可被載入一個或多個不同的計算機或其他處理器,以如上討論地本發(fā)明實現(xiàn)的各個方面。
在此使用的術語“程序”在一般意義上指的是可用于編程計算機或其他處理器以實現(xiàn)上述本發(fā)明各個方面的任何類型的計算機代碼或指令集。此外還應認識到,根據(jù)此實施例的一個方面,在執(zhí)行時用于實現(xiàn)本發(fā)明方法的一個或多個計算機程序不必位于單個計算機或處理器上,而是能夠以模塊化的形式分布在多個不同的計算機或處理器中以實現(xiàn)本發(fā)明的各個方面。
也是以其通常的意義來使用諸如“參數(shù)”、“對象”和“方法”的術語。雖然某些編程語言定義“參數(shù)”與將值送入函數(shù)相關,但在此使用的術語更一般地指任何信息片段。同樣地,某些編程語言使用諸如“對象”和“方法”的術語來指特定的編程構造。除非明確指出,否則在此使用的這些術語不僅限于這些構造。
可以單獨、組合地或以未在前述實施例中特別討論的各種排列來使用本發(fā)明的各個方面,因此本發(fā)明各方面的應用就不限于在前的描述或示出的附圖中所闡述的組件的細節(jié)和排列。例如,在一個實施例中描述的各個方面能夠與在其他實施例中描述的各個方面以任何方式組合。
在權利要求中使用諸如“第一”、“第二”、“第三”等等的序數(shù)術語來修飾的聲明要素本身并不意味著任何優(yōu)先權、優(yōu)越性,也不意味著一個聲明要素的次序先于另一個,或者在執(zhí)行一方法中諸動作的時間上的次序,而僅僅是標記用于區(qū)別具有一指定名的聲明要素和具有相同名(但用序數(shù)術語)的另一個要素,從而辨別聲明的要素。
同樣地,在此使用的措辭和術語僅出于描述的目的并且不應被認為具有任何限制的意義。“包括”、“包含”或者“具有”、“含有”、“帶有”以及它們在此的變化的使用意味著包括了其后列出的項和其等效物以及附加的項。
計算機程序列表如下是配置成在ASP.NET上運行的測試樣本。
[HostType(“ASP.NET”)][WebServerType(WebServerType.WebDev)][UrlToTest(“http//localhost/website/default.aspx”)][PathToWeb(@”c\websites\website”)] public void Test(){System.Web.UI.Page page=TestContext.RequestedPage;Assert.IsNotNull(page,“RequestedPage should not be null.”);PageAccessor accessor=new PageAccessor(page);int result=accessor.Add(1,1);Assert.AreEqual(2,result,“1+1 should equal 2”);}如下是用于實現(xiàn)主機適配器的偽代碼實例。void RunTest(ITest test,IResults results){//Get the target process-specific contextITestContext testContext=GetTargetProcessContext();//Load the appropriate test execution adapterITestAdapter testAdapter=LoadTestAdapter(test);//Execute the testtestAdapter.Run(test,testContext);//Feed results back to the test execution shimresults.AddResults(testAdapter.Results);}測試執(zhí)行填補可以通過如下形式的接口與該主機適配器通信interface ITestExecution{void Initialize();void Run(ITest test);void CleanUp();}如下是在該類稍后綁定到所述測試中的單元時用于創(chuàng)建存取程序的簡單存取程序類定義的實例public class CodeAccessor{public CodeAccessor(PrivateObject privateObject){m_privateObject=privateObject;}public int Add(int x,int y){object[]args=new object[]{x,y};int ret=((int)(m_privateObject.Invoke(″Add″,new System.Type[]{typeof(int),typeof(int)},args)));return ret;}}
權利要求
1.一種測試在第一環(huán)境內運行的程序的方法,所述程序具有多個單元,包括至少一個測試中的單元,所述方法包括a)在第二環(huán)境內執(zhí)行測試代理程序,所述測試代理程序指定要被執(zhí)行來測試至少一個測試中的單元的測試;b)響應于執(zhí)行所述測試代理程序,在所述第一環(huán)境內執(zhí)行一指定測試,所述測試生成表示所述測試中的單元的性能特征的測試結果。
2.如權利要求1所述的方法,其特征在于,還包括把來自在所述第一環(huán)境內執(zhí)行的所述指定測試的測試結果傳遞至在所述第二環(huán)境中執(zhí)行的所述測試代理程序。
3.如權利要求2所述的方法,其特征在于,在所述第一環(huán)境中執(zhí)行一指定測試包括在所述第一環(huán)境內創(chuàng)建一對象并且向所述第二環(huán)境內的一對象注冊所述對象。
4.如權利要求3所述的方法,其特征在于,執(zhí)行一指定測試還包括a)在所述第一環(huán)境中執(zhí)行一測試對象;以及b)通過在所述第一環(huán)境內的所述對象而在所述第二環(huán)境內的所述對象和所述測試對象之間通信。
5.如權利要求2所述的方法,其特征在于,執(zhí)行一指定測試包括在所述第一環(huán)境內執(zhí)行一測試適配器,并且使用所述測試適配器調用所述指定測試。
6.如權利要求5所述的方法,其特征在于,執(zhí)行一指定測試還包括用所述測試適配器接收一表示了所述指定測試的參數(shù)并且調用響應于該參數(shù)選擇的測試。
7.如權利要求5所述的方法,其特征在于,所述第一環(huán)境包括一可擴展接口,并且執(zhí)行一測試適配器包括響應于通過該可擴展接口提供的命令而在所述第一環(huán)境內執(zhí)行一測試適配器。
8.如權利要求1所述的方法,其特征在于,所述測試中的單元具有一非公共接口,并且執(zhí)行一指定測試包括通過它的非公共接口實行所述測試中的單元。
9.一種測試在第一環(huán)境內運行的程序的方法,所述程序具有多個單元,至少一個所述單元是測試中的單元,所述方法包括a)在所述第一環(huán)境內載入所述程序;b)展現(xiàn)所述第一環(huán)境內的一對象的接口;c)響應于通過所述接口提供的信息而使用所述對象載入一測試適配器;以及d)使用所述測試適配器來執(zhí)行至少一個測試中的單元的測試。
10.如權利要求9所述的方法,其特征在于,還包括響應于在第二環(huán)境中執(zhí)行的測試代理程序的執(zhí)行通過所述接口提供信息。
11.如權利要求10所述的方法,其特征在于,響應于在第二環(huán)境中測試代理程序的執(zhí)行提供信息包括在開發(fā)環(huán)境內執(zhí)行所述測試代理程序。
12.如權利要求10所述的方法,其特征在于,響應于在第二環(huán)境中執(zhí)行的測試代理程序的執(zhí)行通過所述接口提供信息包括基于所述第一環(huán)境的屬性選擇一測試執(zhí)行填補,并且通過該測試執(zhí)行填補訪問所述接口。
13.如權利要求9所述的方法,其特征在于,還包括將所述第一環(huán)境置于測試模式下。
14.如權利要求9所述的方法,其特征在于,在所述第一環(huán)境中載入所述程序包括使用一應用程序載入一內插附件程序。
15.如權利要求10所述的方法,其特征在于,所述第一環(huán)境是在第一進程中創(chuàng)建的,而所述第二環(huán)境是在第二進程中創(chuàng)建。
16.如權利要求9所述的方法,其特征在于,還包括a)反映所述第一環(huán)境中一單元的參數(shù);以及b)使用所反映的參數(shù)來配置所述測試適配器。
17.一種具有用于執(zhí)行實現(xiàn)一軟件系統(tǒng)的各個步驟的計算機可執(zhí)行指令的計算機可讀介質,所述軟件系統(tǒng)提供一開發(fā)環(huán)境,在其中能夠開發(fā)測試程序用于測試在多個主機環(huán)境之一內運行的程序單元,所述計算機可執(zhí)行指令執(zhí)行如下步驟a)創(chuàng)建一測試代理程序;以及b)創(chuàng)建多個主機適配器中的一個,每個主機適配器被配置成由所述測試代理程序用來調用在所述多個主機環(huán)境之一內的測試程序的執(zhí)行。
18.如權利要求17所述的計算機可讀介質,其特征在于,所述軟件系統(tǒng)還包括用于執(zhí)行如下步驟的計算機可執(zhí)行指令a)接收來自用戶的指定了測試程序中部分指令的輸入;以及b)響應于來自用戶的所述輸入選擇性地顯示關于參數(shù)的上下文敏感信息,所述參數(shù)可在所述測試程序的指令中使用以訪問所述程序的單元。
19.如權利要求18所述的計算機可讀介質,其特征在于,所述軟件系統(tǒng)還包括用于實現(xiàn)接收參數(shù)的各步驟的計算機可執(zhí)行指令,其中所述參數(shù)涉及從所述單元中反映出的所述程序單元。
20.如權利要求17所述的計算機可讀介質,其特征在于,所述軟件系統(tǒng)還包括用于創(chuàng)建一對象的計算機可執(zhí)行指令,其中所述對象基于關于從所述單元中反映的所述程序單元的信息來配置一測試程序。
全文摘要
一種在其中準備了單元測試的開發(fā)環(huán)境。所述單元測試在主機環(huán)境中運行以實現(xiàn)更為完全和精確的程序單元測試。開發(fā)環(huán)境使用一測試執(zhí)行填補來訪問在主機環(huán)境內運行的適配器。該主機適配器可以調用運行指定測試的其他程序對象。這些對象可以稍后綁定至所述測試中的單元。存取程序類能夠促進對指定測試中的單元的稍后綁定同時允許在開發(fā)環(huán)境內編寫測試,以使用訪問測試中的單元所需的上下文敏感信息。
文檔編號G06F11/36GK1838089SQ200610009309
公開日2006年9月27日 申請日期2006年2月23日 優(yōu)先權日2005年3月23日
發(fā)明者B·R·克勞福德 申請人:微軟公司