專利名稱:進程內組件對象的創建方法和系統的制作方法
技術領域:
本發明涉及計算機程序編碼和測試領域,更具體地,涉及一種進程內組件的創建方法和系統。
背景技術:
隨著人們對軟件需求的不斷增加,軟件的功能、可操作性、智能化程度等也迅速發展,從而使軟件變得更加復雜、更加龐大,開發的難度也越來越大,開發的周期越來越長,參與開發人數越來越多。為了減少重復勞動,降低被開發軟件出錯的概率,軟件復用技術也就應運而生。在過去的幾十年里,軟件復用得到了越來越廣泛的應用。組件技術是上世紀90年代初出現的一種新技術,它是在結構化設計和面向對象技術的基礎上發展起來的,是面向對象技術之后的軟件開發的標準方法體系,是面向對象的開發技術的延伸。在組件規范化的過程中,許多公司和組織都做出了許多模型,常見的組件模型有 CORBA (公共對象請求代理體系結構)、C0M(組件對象模型),EJB組件和.Net組件。下面,“組件”以微軟公司的COM為例進行說明。COM的使用非常廣泛,許多桌面應用都采用了 COM技術,包括自動化技術(OLE自動化),ActiveX控件技術等。根據C0M/DC0M中客戶應用程序和組件程序的交互關系,可以將組件分為進程內組件和進程外組件兩種。所謂進程內組件是指客戶應用程序和組件程序在同一個進程地址空間內;進程外組件指客戶應用程序和組件程序分別處在不同的進程空間地址中。進程內組件是通過將組件作為動態鏈接庫(DLL)來實現的,客戶應用程序將組件程序加載到自己的進程地址空間后再調用組件程序的函數。對于這兩種不同的組件,客戶應用程序和組件程序交互的內在方式是完全不同的。但是對于功能相同的進程內和進程外組件,從程序編寫的角度看,客戶應用程序是以同樣的方法來使用組件程序的,客戶應用程序不需要做任何的修改。獲取和驅動組件有兩個重要作用。對于新開發的組件,可以通過獲取和驅動組件, 來進行自動測試;對于已經開發出來的組件,在進行應用程序遷移時,通過獲取和驅動組件,可以重復利用已經開發出來的組件而不用重新編寫。對于進程內組件,如果在另外一個進程中能夠獲取組件對象的接口,那么驅動組件對象并獲取組件對象的數據都非常方便。但是,采用通用方法在另外一個進程中獲取進程內組件對象接口較難。現有的可以獲取和驅動進程內組件的方法主要包括以下兩種1)分析應用程序的內存。在該方法中,在應用程序啟動并加載了進程內組件之后, 在應用程序的內存中訪問該組件,然后通過分析內存中的數據,來獲取組件的數據。該方法針對應用程序中相同組件的不同對象以及不同應用程序的相同組件對象都需要分別進行分析和處理,因此非常復雜;以及2)通過組件句柄得到組件對象。在該方法中,通過應用程序中的組件句柄來訪問組件對象,然后通過調用組件對象的函數和方法來獲取和驅動組件。這種方法依賴于目標應用程序所使用的開發語言。比如用VB開發的程序和VC開發的程序,獲取組件對象的方法都不一樣。參考文獻[1]給出了一種測試應用程序的方法,其中,將一個測試代理模塊嵌入到被測應用程序中,用以完成測試用例中各測試步驟的執行。測試代理按照測試步驟,獲取和驅動被測應用程序中的組件,以完成測試。圖1是示出了參考文獻[1]的測試應用程序的系統的各個單元的示意框圖。各個單元描述如下 測試客戶端主控樽塊101 作為測試客戶端應用稈序的主控樽塊,負靑加載泖I 試用例到共享數據存儲單元300中,并管理測試流程。 測試啟動單元102 用于捭索測試代理窗口單元203,向搜索到的測試代理窗口單元203發送測試用例的ID集合以及測試指令。 被測應用稈序主控樽塊201 作為被測應用程序的主控模塊,用于加載其他模塊和/或單元,比如講稈內組件單元202和測試代理窗口單元203。 講稈內組件單元202 是被測應用程序的進程內組件,比如.dll或.OCX文件。 進程內組件單元202作為客戶端運行在被測應用程序的進程中,是被測應用程序的進程的一部分。 嵌入的測試代理窗口單元203 作為測試代理樽塊。嵌入的測試代理窗口單元 203是一個隨被測應用程序一起啟動的對用戶而言隱藏(不可見)的單元。嵌入的測試代理窗口單元203從測試啟動單元102接收測試指令,以開始測試,并從共享數據存儲單元中讀取測試客戶端主控模塊101加載的測試用例,按照測試用例的測試步驟,在需要時驅動進程內組件單元202,得到測試結果,并將測試結果寫入共享數據存儲單元中。 共享數據存儲單元300 存儲測試用例以及測試結果。被測應用程序中嵌入的測試代理窗口單元203和測試客戶端的主控模塊101均能讀寫此共享數據存儲單元。圖2是示出了參考文獻[1]的測試應用程序的方法的流程圖。在該測試方法開始后,測試客戶端主控模塊101將測試用例加載到共享數據存儲單元300中(步驟S201)。然后,測試客戶端主控模塊101觸發測試啟動單元102以搜索測試代理窗口單元203,并將測試用例ID集合以及測試指令發送給搜索到的測試代理窗口單元203(步驟S202)。測試代理窗口單元203接收到測試指令后,開始測試。測試代理窗口單元203根據接收到的測試用例ID集合,從共享數據存儲單元300中讀取測試用例,并依次處理每一個測試用例(步驟S203)。測試代理窗口單元203按照測試用例的測試步驟, 驅動進程內組件單元202,并獲得進程內組件單元的數據(S204)。然后,測試代理窗口單元 203確定測試結果,并將測試結果寫入共享數據存儲單元300 620 。由此,測試客戶端主控模塊101可從共享數據存儲單元中300中獲取測試結果(S206)。圖3是示出了根據參考文獻[1]的測試應用程序的方法的一個示例的示意圖。圖3所示的示例以Microsoft Office的spreadsheet ActiveX作為要測試的應用程序的進程內組件為例。在圖3中,各個模塊之間的連接線上標注的數字表示該示例方法的執行順序。這種解決方案的缺點在于,測試客戶端并不能獲取進程內組件對象的接口,對進程內組件的獲取和驅動受限制,必須通過共享數據存儲進行數據交換,而不能直接在測試客戶端驅動進程內組件對象并獲取數據。因此,需要一種創建進程內組件的對象的方法,以便能夠直接在測試客戶端獲取所創建的進程內組件對象的接口從而驅動進程內組件的對象并獲取其數據。[參考文獻]1.中國發明專利申請,申請號=CN 200410079042. 5,發明名稱“一種應用程序的
自動測試方法”.
發明內容
鑒于現有技術的上述缺點,本發明提出了一種創建程內組件的對象的方法,其中, 在目標應用程序中嵌入一進程外組件,所述進程外組件具有創建所述進程內組件的對象并記錄所創建的進程內組件的對象的接口的功能,在所述目標應用程序發出定位所述進程內組件的請求以創建進程內組件對象時,將請求定向到進程外組件,以創建進程外組件的對象,該進程外組件的對象將創建所述進程內組件的對象并記錄所創建的進程內組件的對象的接口。因此,在不同于所述應用程序的應用程序中,可以查詢所創建的進程外組件的對象的接口并獲取其所記錄的進程內組件的對象的接口,進而直接驅動進程內組件的對象。根據本發明的第一方面,提出一種創建進程內組件的對象的方法,包括以下步驟 在一應用程序中嵌入一進程外組件,所述進程外組件具有創建所述進程內組件的對象并記錄所創建的進程內組件的對象的接口的功能;啟動所述應用程序;在所述應用程序發出定位所述進程內組件的請求以創建進程內組件的對象時,將所述請求定向到所述進程外組件,以創建所述進程外組件的對象;以及所述進程外組件的對象創建所述進程內組件的對象,并記錄所創建的進程內組件的對象的接口。優選地,所述方法還包括步驟在接收到所述請求的進程外組件處,分析所述請求,獲得所述進程內組件的信息,以確定要創建對象的進程內組件。優選地,將所述請求定向到所述進程外組件的步驟包括攔截所述應用程序發出的定位所述進程內組件的請求;獲得所述進程外組件的地址信息;定位所述進程外組件; 以及將所述請求定向到所定位的所述進程外組件。優選地,在不同于所述應用程序的應用程序處,能夠通過查詢而獲取所述進程外組件的對象的接口,并通過所述進程外組件的對象的接口,獲取所述進程外組件的對象所記錄的進程內組件的對象的接口。優選地,在不同于所述應用程序的應用程序處,通過所獲取的所述進程內組件的對象的接口,能夠驅動所述進程內組件的對象。優選地,所述應用程序是基于Windows窗口的應用程序。根據本發明的第二方面,提出了一種創建進程內組件的對象的系統,包括進程外組件嵌入單元,用于在一應用程序中嵌入一進程外組件,所述進程外組件具有創建進程內組件的對象并記錄所創建的進程內組件的對象的接口的功能;主控單元,用于啟動所述應用程序;組件重定向單元,用于在所述應用程序發出定位所述進程內組件的請求以創建進程內組件的對象時,將所述請求定向到所述進程外組件,以創建所述進程外組件的對象;其中,所創建的進程外組件的對象將創建所述進程內組件的對象,并記錄所創建的進程內組件的對象的接口。優選地,所述進程外組件包括信息分析單元,用于分析所述請求,獲得所述進程內組件的信息,以確定要創建對象的進程內組件。優選地,所述組件重定向單元還包括請求攔截單元,用于攔截所述應用程序發出的定位所述進程內組件的請求;以及定位單元,用于獲得所述進程外組件的地址信息,并定位所述進程外組件,以便將所述請求定向到所定位的所述進程外組件。與最相近的現有技術,即參考文獻[1]相比,本發明的有益效果至少包括今通過進程外組件,可以獲取進程內組件對象的接口,從而可以直接驅動進程內組件對象;令由于通過進程外組件而創建進程內組件的對象,而不需要針對同一個進程內組件的不同對象進行逐個分析和處理,簡化了編程的復雜度。
結合附圖,根據下面對本發明的非限制性實施例的詳細描述,本發明的上述及其他目的、特征和優點將變得更加清楚,附圖中圖1是示出了參考文獻[1]的測試應用程序的系統的各個單元的示意框圖;圖2是示出了參考文獻[1]的測試應用程序的方法的流程圖;圖3是示出了根據參考文獻[1]的測試應用程序的方法的一個示例的示意圖;圖4是示出了根據本發明實施例的創建進程內組件的對象的系統的示意框圖;圖5是示出了根據本發明實施例的創建進程內組件的對象的方法的流程圖;以及圖6是示出了根據本發明實施例的創建進程內組件的對象的方法的一個示例的示意圖。附圖中,用相同的附圖標記表示相關的單元,以示出它們之間的相關性。以加粗的實線表示主要反映了本發明的發明思想的那些單元。
具體實施例方式下面,根據附圖描述本發明。在以下描述中,一些具體實施例僅用于描述目的,而不應該理解為對本發明有任何限制,而只是本發明的示例。在可能導致對本發明的理解造成混淆時,將省略常規結構或構造。圖4是示出了根據本發明實施例的創建進程內組件的對象的系統的示意框圖。各個單元描述如下 測試客戶端主控樽塊101 作為測試客戶端應用稈序的主控樽塊,負靑管理泖I 試流程。 進程外組件對象接口杳詢單元103 用于查詢進程外組件對象接口的單元。 進程內組件對象接口獲取單元104 用于通過進程外組件對象接口杳詢單元 103所查詢到的進程外組件對象的接口,訪問進程外組件所提供的服務,以獲取進程內組件對象的接口。 進程內組件驅動和數據獲取單元105 是業務邏輯處理單元。通過進程內組件對象接口獲取單元104所獲取的進程內組件對象的接口,可以自由且方便地驅動進程內組件,并獲取進程內組件的數據。 被測應用稈序主控樽塊201 作為被測應用程序的主控模塊,用于啟動被測應用程序,以及加載其他模塊和/或單元,比如組件重定向單元204和講稈外組件單元205。 講稈內組件單元202 是被測應用程序的進程內組件單元,比如.dll或.0CX文件。進程內組件單元202作為客戶端運行在被測應用程序的進程中,是被測應用程序的進程的一部分。 組件重定向單元204 用于在被測應用程序發送定位進程內組件單元202的請求以創建進程內組件的對象時,將請求定向到進程外組件單元205。 講稈外組件單元205 用于提供創建進程內組件對象、并記錄下所創建的進程內組件對象的接口的功能。并且,進程外組件單元205對外提供獲取所記錄的進程內組件對象接口的服務。其它應用程序通過查詢進程外組件單元205的接口,可以訪問進程外組件單元205,通過其提供的服務,獲取所記錄的進程內組件對象的接口。 講稈外組件嵌入單元206 用于在(被測)應用程序中嵌入進程外組件單元。如圖4所示,組件重定向單元204可包括請求攔截單元2041和定位單元2042。請求攔截單元2041監控被測應用程序,在被測應用程序發出定位進程內組件單元202以創建進程內組件對象時攔截該請求。定位單元2042用于獲得進程外組件單元205的地址信息, 并定位該進程外組件單元205,以便可以將請求定向到所定位的進程外組件單元205。此外,如圖4所示,進程外組件單元205可包括信息分析單元2051,用于分析接收到的請求,獲得所述進程內組件的信息,以確定要創建對象的進程內組件。圖5是示出了根據本發明實施例的創建進程內組件的對象的方法的流程圖。如圖5所示,在該方法開始后,首先啟動被測應用程序(步驟S501)。與此同時, 啟動組件重定向單元204(步驟S5(^)。組件重定向單元204用于將定位進程內組件單元 202的請求重定向到進程外組件單元205。在被測應用程序向操作系統查詢進程內組件單元202的相關信息以定位進程內組件單元并創建(加載)進程內組件單元202時,該請求被定向到進程外組件單元205(步驟S503)。如圖4所示,也可以在組件重定向單元204中設置請求攔截單元2041和定位單元 2042。在被測應用程序向操作系統發送定位進程內組件單元202的請求時,請求攔截單元 2041攔截該請求,定位單元202用于獲得與請求的進程內組件單元相關聯的進程外組件單元的地址信息,定位該進程外組件單元,以便組件重定向單元將該請求定向到所定位的進程外組件單元。響應于該請求,進程外組件單元205創建進程外組件對象。然后,所創建的進程外組件對象將創建被測應用程序所請求的進程內組件的對象,并在所創建的進程外組件對象中記錄所創建的進程內組件對象的接口(步驟S504)。至此,被測應用程序的啟動完成(步驟 S505)。測試客戶端應用程序要驅動進程內組件對象并獲取數據時,測試客戶端應用程序的進程外組件對象接口查詢單元103查詢進程外組件對象的接口。進程內組件對象接口獲取單元104通過查詢到的接口,訪問進程外組件對象,獲取進程外組件對象所記錄的進程內組件對象的接口(步驟S506)。然后,測試客戶端應用程序的進程內組件驅動和數據獲取單元105通過進程內組件對象接口獲取單元104所獲取的進程內組件對象的接口,可以方便地、直接地驅動進程內組件對象,并獲取進程內組件對象的數據(步驟S507)。圖6是示出了根據本發明實施例的創建進程內組件的對象的方法的一個示例的示意圖。與圖3所示的示例一樣,圖6所示的示例以MicrosoftOffice的spreadsheet ActiveX作為要驅動的進程內組件為例。在圖6中,各個模塊之間的連接線上標注的數字表示該示例方法的執行順序。在圖6所示的示例中,首先啟動被測應用程序和組件重定向單元。在被測應用程序向組件重定向單元請求創建進程內組件的對象時(步驟Si),組件重定向單元將該請求重定向到進程外組件(步驟S2)。在另一示例中,修改注冊表,將注冊表中注冊的進程內組件的動態鏈接庫DLL修改為指向進程外組件。被測應用程序要創建進程內組件時,要訪問注冊表以獲得進程內組件的DLL。在該示例中,被測應用程序將被導向進程外組件。因而,在被測應用程序向進程內組件單元請求創建對象時,該請求被定向到進程外組件單元,實現了重定向的功能。在另一個示例中,在被測應用程序中嵌入了請求攔截單元。如圖4所示,請求攔截單元也可以被集成在組件重定向單元中。在該示例中,請求攔截單元將監控被測應用程序對操作系統的動作,并在監測到被測應用程序向操作系統發送查詢以定位進程內組件的請求時,攔截該請求并由組件重定向單元將該請求定向到進程外組件。在圖6所示的示例中,進程外組件是封裝有進程內組件spreadsheetActiveX的 COM。因此,將創建COM對象。COM對象將創建進程內組件spreadsheet ActiveX的對象,并返回被測應用程序(步驟S3)。如果被測應用程序還需要創建/加載其它進程內組件,則重復步驟S1-S3。在創建了所有需要的進程內組件(和對應的進程外組件)對象之后,被測應用程序的啟動完成。測試客戶端使用Windows API "CoCreatelnstance",查詢COM對象的接口(步驟 S4)。然后,訪問COM對象,以獲取spreadsheet ActiveX對象的接口(步驟S5)。通過所獲取的spreadsheet ActiveX對象的接口,可以驅動spreadsheet ActiveX對象并獲取數據 (步驟S6)。在該示例中,可以通過如下調用方法來驅動spreadsheet ActiveX對象并獲取其數據spreadsheet. SetCellDatad, 1,20);spreadsheet. SetCellDatad, 2, 30);spreadsheet. SetCellData(l, 3, "= (A1+B1),,);spreadsheet. ShowAbout ().從圖6所示的示例可見,根據本發明實施例的創建進程內組件的對象的方法,通過將創建進程內組件對象的請求重定向到一個進程外組件,該進程外組件提供創建進程內組件對象、并記錄所創建的進程內組件對象的功能,測試客戶端通過調用進程外組件對象的服務可以獲取所創建的進程內組件對象的接口,從而可以在與被測應用程序不同的另一個進程中,容易且方便地驅動進程內組件。因此,可以提高編寫自動測試用例的效率。在圖6所示的示例中,進程外組件封裝有進程內組件,因此對于每個進程內組件, 需要在被測應用程序中嵌入一個對應的進程外組件,用于創建該進程內組件的對象并對外提供所創建的進程內組件對象的接口。因此,不需要針對相同進程內組件的不同對象進行逐個分析和處理,提高了編寫測試程序的效率。在圖6所示的示例中,以應用程序是基于Windows窗口的應用程序為例進行了說明。當然,本領域技術人員可以認識到,本發明同樣適應于其它應用程序。在其它示例中,可以在被測應用程序中嵌入對于所有進程內組件公共的進程外組件。此時,在將請求重定向到公共的進程外組件時,進程外組件分析請求,獲得進程內組件的信息,以確定要創建對象的進程內組件。然后,進程外組件可以創建所確定的進程內組件的對象,并記錄所創建的進程內組件的對象的接口。在這種情況下,不需要針對每個需要驅動的進程內組件而嵌入一個進程外組件。因此,可以進一步提高編寫測試程序的效率。這里所公開的本發明實施例的其他設置包括執行在先概述并隨后詳述的方法實施例的步驟和操作的軟件程序。更具體地,計算機程序產品是如下的一種實施例具有計算機可讀介質,計算機可讀介質上編碼有計算機程序邏輯,當在計算設備上執行時,計算機程序邏輯提供相關的操作,從而提供上述單向代理轉密方案。當在計算系統的至少一個處理器上執行時,計算機程序邏輯使得處理器執行本發明實施例所述的操作(方法)。本發明的這種設置典型地提供為設置或編碼在例如光介質(例如CD-ROM)、軟盤或硬盤等的計算機可讀介質上的軟件、代碼和/或其他數據結構、或者諸如一個或多個ROM或RAM或PROM芯片上的固件或微代碼的其他介質、或專用集成電路(ASIC)、或一個或多個模塊中的可下載的軟件圖像、共享數據庫等。軟件或固件或這種配置可安裝在計算設備上,以使得計算設備中的一個或多個處理器執行本發明實施例所述的技術。結合諸如一組數據通信設備或其他實體中的計算設備進行操作的軟件過程也可以提供根據本發明的系統。根據本發明的系統也可以分布在多個數據通信設備上的多個軟件過程、或者在一組小型專用計算機上運行的所有軟件過程、或者單個計算機上運行的所有軟件過程之間。應該理解,嚴格地講,本發明的實施例可以實現為計算機設備上的軟件程序、軟件和硬件、或者單獨的軟件和/或單獨的電路。以上描述僅給出了本發明的優選實施例,而并不是要以任何方式限制本發明。因此,本發明的范圍應涵蓋在本發明精神和原理內進行的任何修改、替換、改進等。
9
權利要求
1.一種創建進程內組件的對象的方法,包括以下步驟在一應用程序中嵌入一進程外組件,所述進程外組件具有創建所述進程內組件的對象并記錄所創建的進程內組件的對象的接口的功能; 啟動所述應用程序;在所述應用程序發出定位所述進程內組件的請求以創建進程內組件的對象時,將所述請求定向到所述進程外組件,以創建所述進程外組件的對象;以及所述進程外組件的對象創建所述進程內組件的對象,并記錄所創建的進程內組件的對象的接口。
2.根據權利要求1所述的方法,還包括步驟在接收到所述請求的進程外組件處,分析所述請求,獲得所述進程內組件的信息,以確定要創建對象的進程內組件。
3.根據權利要求1所述的方法,其中,將所述請求定向到所述進程外組件的步驟包括 攔截所述應用程序發出的定位所述進程內組件的請求;獲得所述進程外組件的地址信息;定位所述進程外組件;以及將所述請求定向到所定位的所述進程外組件。
4.根據權利要求1所述的方法,其中,在不同于所述應用程序的另一應用程序處,能夠通過查詢而獲取所述進程外組件的對象的接口,并通過所述進程外組件的對象的接口,獲取所述進程外組件的對象所記錄的進程內組件的對象的接口。
5.根據權利要求4所述的方法,其中,在不同于所述應用程序的所述另一應用程序處,通過所獲取的所述進程內組件的對象的接口,能夠驅動所述進程內組件的對象。
6.根據權利要求1所述的方法,其中,所述應用程序是基于Windows窗口的應用程序。
7.一種創建進程內組件的對象的系統,包括進程外組件嵌入單元,用于在一應用程序中嵌入一進程外組件,所述進程外組件具有創建進程內組件的對象并記錄所創建的進程內組件的對象的接口的功能; 主控單元,用于啟動所述應用程序;以及組件重定向單元,用于在所述應用程序發出定位所述進程內組件的請求以創建進程內組件的對象時,將所述請求定向到所述進程外組件,以創建所述進程外組件的對象;其中,所創建的進程外組件的對象將創建所述進程內組件的對象,并記錄所創建的進程內組件的對象的接口。
8.根據權利要求7所述的系統,其中,所述進程外組件包括信息分析單元,用于分析所述請求,獲得所述進程內組件的信息,以確定要創建對象的進程內組件。
9.根據權利要求7所述的系統,其中,所述組件重定向單元包括請求攔截單元,用于攔截所述應用程序發出的定位所述進程內組件的請求;以及定位單元,用于獲得所述進程外組件的地址信息,并定位所述進程外組件,以便將所述請求定向到所定位的所述進程外組件。
全文摘要
本發明提出了一種創建進程內組件的對象的方法,包括以下步驟在一應用程序中嵌入一進程外組件,所述進程外組件具有創建所述進程內組件的對象并記錄所創建的進程內組件的對象的接口的功能;啟動所述應用程序;在所述應用程序發出定位所述進程內組件的請求以創建進程內組件的對象時,將所述請求定向到所述進程外組件,以創建所述進程外組件的對象;所述進程外組件的對象創建所述進程內組件的對象,并記錄所創建的進程內組件的對象的接口。在不同于該應用程序的另一應用程序處,可以獲取進程外組件對象的接口并訪問進程外組件所提供的服務,以獲取進程內組件對象的接口,從而可以直接驅動進程內組件對象。此外,本發明還提出了一種創建進程內組件的對象的系統。
文檔編號G06F9/44GK102207856SQ20101013701
公開日2011年10月5日 申請日期2010年3月29日 優先權日2010年3月29日
發明者劉慧峰, 劉曉煒, 史敬威, 孟昕, 宋才良, 王煉 申請人:日電(中國)有限公司