国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      軟件構(gòu)件中無效調(diào)用序列的自動測定的制作方法

      文檔序號:6398406閱讀:199來源:國知局
      專利名稱:軟件構(gòu)件中無效調(diào)用序列的自動測定的制作方法
      技術(shù)領(lǐng)域
      本發(fā)明涉及軟件開發(fā)技術(shù)。更具體的說,本發(fā)明涉及用于測試對象以鑒別導(dǎo)致投擲異常(thrown exceptions)的調(diào)用序列的機制。
      背景技術(shù)
      計算機已經(jīng)引起了我們工作和娛樂方式的變革。有許許多多的功能和應(yīng)用可以通過響應(yīng)軟件應(yīng)用程序的執(zhí)行而由通用計算系統(tǒng)來實現(xiàn)。然而,計算系統(tǒng)的效用和功能性確實依賴于源代碼的正確編碼,該源代碼被編譯或解釋為實際由處理器執(zhí)行的二進制指令。若存在代碼錯誤,則這通常會導(dǎo)致與期望功能性的偏差。
      目前,人們做了非常大的努力,在軟件應(yīng)用程序發(fā)送到市場的前后適當?shù)販p少許多軟件程序中未期望功能性偏差的數(shù)量。然而,軟件程序設(shè)計員和設(shè)計者的創(chuàng)造力已經(jīng)產(chǎn)生了更為復(fù)雜和強大的軟件應(yīng)用程序。隨著軟件應(yīng)用程序復(fù)雜性的增加,通常也增加了需要來產(chǎn)生該軟件應(yīng)用程序的源代碼行的數(shù)量。
      以更有組織的方式來起草源代碼的一個方法是使用面向?qū)ο蟮某绦蛟O(shè)計,以促使在存儲器中產(chǎn)生運行時間對象。這些對象具有與它們相關(guān)聯(lián)的方法。例如,被稱作“文件”的特定類對象可具有許多與之相關(guān)聯(lián)的方法,它允許文件上的操作。例如,有關(guān)類“文件”對象的適當操作可為打開、讀、寫、關(guān)閉或檢查文件的狀態(tài)。每個這些方法可具有零個或更多與之相關(guān)聯(lián)的允許參數(shù)。例如,“讀”方法可包括這樣的參數(shù),其表達有多少文件字節(jié)要讀和/或從哪里開始讀,以及類似的事件。具有特定參數(shù)的方法通常被稱為“操作”。同樣的,具有零參數(shù)的方法即使沒有參數(shù),其通常也被稱為“操作”。對象通常也具有相關(guān)聯(lián)的數(shù)據(jù)。在上面介紹的文件對象范例中,該文件本身(加上潛在的通常被稱為“元數(shù)據(jù)”的某些相關(guān)聯(lián)的數(shù)據(jù))可為該對象數(shù)據(jù)。
      盡管面向?qū)ο蟮某绦蛟O(shè)計已經(jīng)提供了對程序設(shè)計任務(wù)的有效組織,但是不可避免的人為誤差會被引入到源代碼的至少早期版本中。為了減少軟件應(yīng)用程序的性能偏差,我們通常對該軟件應(yīng)用程序進行測試以鑒別任何性能偏差。特別對面向?qū)ο蟮某绦蛟O(shè)計而言,我們也可對單獨對象的適當操作進行測試。
      即使在對象的正常和適當操作期間,該對象還是可能意外遇到其不能處理的情形。特定的操作序列(也稱作“調(diào)用序列”)可導(dǎo)致這樣的情形。例如,假設(shè)在構(gòu)造文件對象之后,某人以偽代碼形式表達的這樣的順序來調(diào)用下面的調(diào)用序列打開(文件名)、關(guān)閉(文件名)、寫(文件名)……該文件對象將不能夠?qū)崿F(xiàn)該寫操作,這是由于為了寫到該文件,該文件需要為打開狀態(tài),而且由于在前一個操作中剛剛關(guān)閉該文件。導(dǎo)致不能實現(xiàn)調(diào)用序列操作的調(diào)用序列在這里被稱作“無效調(diào)用序列”。
      當由于無效調(diào)用序列而產(chǎn)生這樣的錯誤時,對象“投擲異?!?。這意味著該對象通知運行時間環(huán)境已經(jīng)出現(xiàn)錯誤,而且關(guān)于未來參考顯示和/或注意該異常。通常關(guān)于不同的探測錯誤有不同的異常。特定的異常類型可相應(yīng)于特定的一個或多個對象方法。
      例如,文件對象的打開方法可具有“文件未被發(fā)現(xiàn)”異常,以說明由于該文件未被發(fā)現(xiàn)故不能打開該文件。文件對象的讀(或?qū)?方法可具有“文件讀”(“file read”)(或“文件寫”(“file write”))錯誤,以指出盡管該文件已經(jīng)打開,某些關(guān)于讀(或?qū)?的操作還是已經(jīng)失敗了。文件對象的讀(或?qū)?方法也可具有“文件已經(jīng)關(guān)閉”(“file closed already”)錯誤,以指出該文件已經(jīng)關(guān)閉,這樣不能讀(或?qū)懙?該文件。文件對象的關(guān)閉方法可具有“文件已經(jīng)關(guān)閉”錯誤,以指出該文件已經(jīng)關(guān)閉了,而且這樣其不能被再次關(guān)閉。文件對象的檢查狀態(tài)方法可具有“文件未打開”(“file not open”)異常,以指出由于該文件未打開故不能訪問該文件狀態(tài)。
      適當異常的投擲允許程序設(shè)計員決定為什么未獲得適當?shù)牟僮鳌H粼谶m當?shù)臅r間未投擲異常,則在投擲對最初問題的代表性較小的未期望異常之前,對象可繼續(xù)進行關(guān)于一個或多個進一步操作的操作。因此,對象通過響應(yīng)相應(yīng)的探測錯誤而投擲適當?shù)漠惓J侵匾?。測試軟件應(yīng)用程序的一個方面是確定對象通過響應(yīng)無效調(diào)用序列而投擲正確的異常(right exception)。
      實行這個的一個傳統(tǒng)方法是使人員測試者手動產(chǎn)生無效調(diào)用序列,對該對象執(zhí)行該調(diào)用序列,校驗投擲正確的異常,然后關(guān)于其它的無效調(diào)用序列重復(fù)該過程。由于這依賴于測試者的想象力和努力以提出潛在的無效調(diào)用序列,所以這個可能是非常耗費時間的。另外,盡管測試者進行了勇敢的努力,但是該測試者提出的無效調(diào)用序列集合還是可能是不完整的。因此,可能有利的是用于對象的測試以便通過自動化程度更高的方式來探測無效調(diào)用序列的機制。

      發(fā)明內(nèi)容
      通過本發(fā)明的原理克服具有本領(lǐng)域優(yōu)先狀態(tài)的前述問題,該本發(fā)明的原理是旨在用于自動測試對象以鑒別一個或多個導(dǎo)致異常的調(diào)用序列的機制的。產(chǎn)生可由該對象執(zhí)行的一組可能的操作。每個對象包括一個或多個方法。每個方法包括與之相關(guān)聯(lián)的零個或更多參數(shù)類型。若方法包括零參數(shù),則該方法可被直接包括在可由對象執(zhí)行的該組操作中。若該方法包括一個或多個參數(shù)類型,則產(chǎn)生相應(yīng)每個參數(shù)類型的一組有趣參數(shù)。該產(chǎn)生的參數(shù)被用來填寫該方法中的適當參數(shù)類型,以從而產(chǎn)生可由對象執(zhí)行的更多操作。
      該關(guān)于給定參數(shù)類型產(chǎn)生的參數(shù)被設(shè)計用來促進要被投擲的異常。例如,若該方法要用相關(guān)聯(lián)的參數(shù)類型“讀”,該相關(guān)聯(lián)的參數(shù)類型是代表要讀的字節(jié)數(shù)的整數(shù)。減1的該整數(shù)(如“-1”)可被用作有趣參數(shù),其原因是由于讀取負信息量不具有邏輯意義,所以其應(yīng)該導(dǎo)致要被投擲的異常。
      使用這個可能操作池(pool),自動構(gòu)造調(diào)用序列。然后使用對象執(zhí)行調(diào)用序列。若異常被投擲,則可發(fā)布這樣的報表,其指定對評估該異常恰當與否有幫助的信息。這個信息可包括異常類型以及導(dǎo)致該投擲異常的調(diào)用序列。
      可選擇的是,可通過從調(diào)用序列移除一個或多個操作,然后決定相同的異常是否被投擲來最小化該調(diào)用序列。如果是那樣的話,也可報告該最小化的調(diào)用序列。通過最小化導(dǎo)致異常被投擲的調(diào)用序列,測試者可更直觀的評估該投擲異常的根本原因。
      這個過程同可能僅看見最終報表的測試者一起自動出現(xiàn)。因此,由于該方法不依靠人們所需要的實質(zhì)的時間和努力以產(chǎn)生無效調(diào)用序列,所以測試者的時間可更適合集中在評估投擲異常的適當性上,而不是產(chǎn)生并執(zhí)行該無效調(diào)用序列。
      本發(fā)明的附加特征和優(yōu)點將在下面的說明中闡明,而且從該說明中,部分本發(fā)明的附加特征和優(yōu)點會是明顯的,或者我們可通過本發(fā)明的實踐來弄清楚該特征和優(yōu)點??山柚谟绕湓诟郊訖?quán)利要求書中指出的工具和組合來了解和獲得本發(fā)明的特征和優(yōu)點。通過下面的說明和附加權(quán)利要求書,本發(fā)明的這些和其它特征會變得更完全的顯而易見,或者我們可通過在下文中闡明的本發(fā)明的實踐來弄清楚該特征。


      為了說明可獲得本發(fā)明的上述和其它優(yōu)點和特征的方式,將給出上面簡要描述的本發(fā)明更為特定的說明,這是通過參考在附圖中闡明的上面簡要描述的本發(fā)明更為特定說明的特定實施例的。應(yīng)當認識到這些附圖僅描述本發(fā)明的典型實施例,因此其并不被認為是對其范圍的限制,我們將結(jié)合附加的特征和詳細內(nèi)容,通過使用附圖來說明和解釋本發(fā)明,該附圖包含圖1依照本發(fā)明的原理,示意性的闡明執(zhí)行對象測試的計算機系統(tǒng)以及相關(guān)聯(lián)的模塊和數(shù)據(jù)結(jié)構(gòu);圖2依照本發(fā)明的原理闡明用于測試對象的方法的流程圖;圖3闡明用于自動產(chǎn)生參數(shù)的方法;以及圖4闡明可實現(xiàn)本發(fā)明原理的合適計算系統(tǒng)的更詳細的原理圖。
      具體實施例方式
      本發(fā)明涉及用于對象的測試,以鑒別導(dǎo)致異常的一個或多個調(diào)用序列的方法、系統(tǒng)和計算機程序產(chǎn)品。使用該方法和與該方法相關(guān)聯(lián)的參數(shù)類型來產(chǎn)生可由對象執(zhí)行的一組操作。參數(shù)發(fā)生器可向更有可能導(dǎo)致投擲異常的特定參數(shù)類型供給有趣參數(shù)值。使用在該組操作中作為序列中步驟的操作來自動構(gòu)造許多調(diào)用序列。然后使用新的對象實例(instance)來執(zhí)行每個調(diào)用序列。若異常被投擲,則可發(fā)布這樣的報表,其包含對評估該異常適當與否有幫助的信息。這個信息可包括異常類型以及導(dǎo)致該投擲異常的調(diào)用序列。
      本發(fā)明的實施例可包含包括不同計算機硬件和軟件的專用或通用計算機,我們在下面對此做了更詳細的討論。特別的,在本發(fā)明范圍內(nèi)的實施例包括計算機可讀媒體,該計算機可讀媒體用于運載或包含保存于計算機可執(zhí)行指令或數(shù)據(jù)結(jié)構(gòu)。這樣的計算機可讀媒體可為能夠由通用或?qū)S糜嬎銠C存取的任何可用媒體。作為例子,但非限制,這樣的計算機可讀媒體可包含RAM、ROM、EEPROM、CD-ROM或其它物理存儲媒體,這諸如光盤存儲器、磁盤存儲器或其它磁存儲裝置、或者可被用來運載或保存想得到的程序代碼方式的任何其它媒體,這是以計算機可執(zhí)行指令或數(shù)據(jù)結(jié)構(gòu)形式的,而且其可由通用或?qū)S糜嬎銠C存取。當在網(wǎng)絡(luò)或到計算機的另一個通信連接(或者是硬連線、無線,或者是硬連線或無線的組合)上傳遞或提供信息時,計算機適當?shù)牟榭醋鳛橛嬎銠C可讀媒體的連接。這樣,任何這樣的連接就適當?shù)谋环Q為計算機可讀媒體。上面的組合也應(yīng)被包括在計算機可讀媒體的范圍內(nèi)。計算機可執(zhí)行指令例如包含這樣的指令和數(shù)據(jù),其促使通用計算機、專用計算機或者諸如GPU這樣的專用處理裝置來執(zhí)行確定的功能或功能組。
      我們將在諸如由網(wǎng)絡(luò)環(huán)境中的計算機執(zhí)行的程序模塊這樣的計算機可執(zhí)行指令的通用上下文中來描述本發(fā)明,盡管這一點并不是必要的。一般,程序模塊包括例程、程序、對象、構(gòu)件、數(shù)據(jù)結(jié)構(gòu)等等,其執(zhí)行特定的任務(wù)或?qū)崿F(xiàn)特定的抽象數(shù)據(jù)類型。
      圖1依照本發(fā)明的原理,示意性的闡明計算系統(tǒng)100和相關(guān)聯(lián)的模塊和數(shù)據(jù)結(jié)構(gòu),其協(xié)作化互相作用,以執(zhí)行對象的自動化測試。該計算系統(tǒng)可為能夠面對軟件對象執(zhí)行操作的任何計算系統(tǒng)。下面關(guān)于圖4闡明并描述了這樣的計算系統(tǒng)的一個例子。然而,本領(lǐng)域熟練的技術(shù)人員在評審這個說明之后會認識到,任何計算系統(tǒng)可用合適的軟件和/或硬件來實現(xiàn)本發(fā)明的特征。
      計算系統(tǒng)100正在測試對象105,以自動鑒別無效調(diào)用序列。如前面提到的,在對象上執(zhí)行的無效調(diào)用序列促使該對象投擲異常。然后測試者可將他或她的注意力集中到適當?shù)漠惓J欠褚呀?jīng)被投擲這個問題上,而不是得擔心產(chǎn)生無效調(diào)用序列,并在該對象上執(zhí)行那些無效調(diào)用序列。
      對象105具有更突出的輪廓以表現(xiàn)出這個對象是被測試的項。計算系統(tǒng)100中的另一個矩形元素(如操作發(fā)生模塊101、參數(shù)發(fā)生模塊102、調(diào)用序列發(fā)生模塊103、執(zhí)行模塊104和最小化模塊106)代表可執(zhí)行模塊,其促進對象105的測試。卷形元素(scrolled elements)(如方法111、操作集合114以及調(diào)用序列115代表促進對象105測試的數(shù)據(jù)。如我們在面向?qū)ο蟮某绦蛟O(shè)計領(lǐng)域中按照慣例知道的,對象105包括一個或多個方法以及可選擇的數(shù)據(jù)。例如,對象105包括方法111和116。
      將進一步參考圖2來說明這些不同構(gòu)件的共同交互作用,其依照本發(fā)明的原理闡明用于測試對象以鑒別無效調(diào)用序列的方法200的流程圖。因此,將頻繁參考圖2來說明圖1。
      方法200包括鑒別一組關(guān)于對象的一個或多個期望異常的可選動作(動作201)。使用虛線框來闡明該動作201,以強調(diào)該動作的選擇性。例如,關(guān)于其中對象105是文件的上面的例子,期望異常可包括“文件未被發(fā)現(xiàn)”、“文件讀”、“文件寫”、“文件已經(jīng)關(guān)閉”以及“文件未打開”異常??赏ㄟ^簡單的相信有關(guān)與該對象相關(guān)聯(lián)異常的源而鑒別這些異常。例如,手冊、白皮書或其它文檔可鑒別異常。也可通過在測試中檢查關(guān)于對象的源代碼來手工的鑒別異常。也可使用檢查關(guān)于對象的或者源代碼、中間格式碼,或者二進制指令的軟件來自動鑒別關(guān)于對象的異常。用于檢查二進制指令的結(jié)構(gòu)以鑒別異常的方法在聯(lián)合擁有的共同待定的美國專利申請序列號10/413,254中被做說明,其申請于本專利申請的同一天,并被冠以標題“軟件組合裝置的非侵略性基于規(guī)則的二進制分析”(“Non-Invasive Rule-Based Binary Analysis ofSoftware Assemblies”),其專利申請作為參考全面合并于此。
      方法200也包括功能的、面向結(jié)果的步驟,其用于自動鑒別導(dǎo)致異常的無效調(diào)用序列(步驟202)。這個步驟可包括用于完成這個結(jié)果的任何相應(yīng)的動作。然而,在闡明的圖2實施例中,該步驟包括相應(yīng)動作203、204、205和206。
      明確的說,產(chǎn)生可由對象執(zhí)行的可能操作的集合或池(動作203)。參考圖1,這可通過操作發(fā)生模塊101來完成。由操作發(fā)生模塊101產(chǎn)生的操作高度依賴于測試中由對象提供的方法。因此,操作發(fā)生模塊101接收對象105的方法111作為輸入。可能有一個或多個由對象提供的方法。然而,在圖1中闡明的特定例子中,方法111包括方法111A、111B、111C,這包含在由垂直橢圓111D表示的潛在的其它方法當中。
      對不需要任何參數(shù)的任何方法而言,該方法可被直接包括在可能的操作114的集合中。然而,大多數(shù)方法需要一個或多個參數(shù),每個參數(shù)具有特定的參數(shù)類型。例如,參數(shù)類型可包括整(型)、浮點數(shù)(型)、數(shù)組(型)、串(型)、布爾值(型)以及對程序設(shè)計和測試領(lǐng)域中對那些非常熟悉的技術(shù)人員或普通的技術(shù)人員而言類似的類型。對任何給定的參數(shù)類型,參數(shù)發(fā)生模塊產(chǎn)生興趣參數(shù),其較該類型的隨機選擇的參數(shù)而言更有可能導(dǎo)致異常出現(xiàn)。
      例如,對整數(shù)參數(shù)類型而言,數(shù)值-1、+1、0和+20,000,000,000可能更有可能導(dǎo)致異常出現(xiàn)。例如,文件對象的讀方法可具有整數(shù)參數(shù)類型,以表達要讀的字節(jié)數(shù)。由于讀負一字節(jié)的信息不具邏輯意義,所以“-1”整數(shù)值應(yīng)導(dǎo)致異常。由于讀零字節(jié)的信息將會是無效動作,所以“0”整數(shù)值將最有可能導(dǎo)致異常?!?20,000,000,000”應(yīng)導(dǎo)致異常,這是在假定這個數(shù)值大于該文件大小的情況下出現(xiàn)的。若文件在進行讀操作時被關(guān)閉,則“+1”整數(shù)值(或關(guān)于該問題的任何其它的正整數(shù)值)可導(dǎo)致異常出現(xiàn)。
      圖3闡明用于產(chǎn)生參數(shù)值的方法300。該參數(shù)類型被提供為到方法300的輸入(動作301)。然后,產(chǎn)生最初有趣參數(shù)。例如,對整數(shù)參數(shù)值而言,“-1”、“+1”、“0”以及“+20,000,000,000”是有趣整數(shù)值類型。然后,最初產(chǎn)生的數(shù)值可被提供到修改器(modifier)(動作303),其可用操作來修改該參數(shù),以導(dǎo)至具有相同參數(shù)類型的一列參數(shù)。例如,適合整數(shù)參數(shù)類型的操作可包括加“+”、減“-”、除“/”和乘。例如,加法操作可導(dǎo)至這樣的數(shù)值,它們是-2(來自-1+-1)、0(來自-1++1)、-1(來自-1+0)、19,999,999,999(來自-1+20,000,000,000)、+2(來自+1++1)、+1(來自+1+0)、20,000,000,001(來自1+20,000,000,000)、0(來自0+0)、+20,000,000,000(來自0+20,000,000,000)以及40,000,000,000(來自20,000,000,000+20,000,000,000)。然后,副本被移除(動作304)。動作302、303和304可只被執(zhí)行一次,或按箭頭306表示的而被重復(fù),以形成“有趣”參數(shù)值(動作305)。
      最初產(chǎn)生參數(shù)值302的動作和修改參數(shù)值303的動作高度依賴于參數(shù)類型是什么??捎蓪κ裁纯赡墚a(chǎn)生異常有經(jīng)驗的技術(shù)人員來決定有趣參數(shù)值。例如,對串型而言,任意串(如“foo”)可能為一個參數(shù),過長串可為另一個串,控制字符可為另一個,等等。對具有特定維數(shù)的數(shù)組類型而言,可遞歸式產(chǎn)生比指定維數(shù)小的數(shù)組,可產(chǎn)生與特定維數(shù)大小相同的數(shù)組,以及可產(chǎn)生比指定維數(shù)大的數(shù)組。布爾值是更直截了當?shù)睦?,其中有趣布爾值可簡單的為“真”或“假”。對浮點數(shù)值而言,當對著1E1000執(zhí)行對象操作時,1E1000應(yīng)產(chǎn)生算術(shù)(或溢出/下溢)異常。1E-1000的情況應(yīng)相同。若該浮點要被視為該對象的分母,則1E-1000的情況可相同。
      可通過執(zhí)行導(dǎo)至相同參數(shù)類型數(shù)值的操作來修改數(shù)值。例如,對串而言,操作可能將使所有的大寫字母、小寫字體以及另一個操作倒轉(zhuǎn)。同樣,串可具有“得到所有后續(xù)事件”(“get all subsequences”)操作,其中接收串“abc”的操作將提供串“a”、“ab”以及“abc”。對數(shù)組而言,加、減、叉積、點積可為操作,對浮點數(shù)值而言,加、減、除和乘可為操作。
      產(chǎn)生更有可能產(chǎn)生異常的參數(shù)的過程是高度主觀的。產(chǎn)生這樣參數(shù)的任何方法符合本發(fā)明原理的范疇,甚至蠻力隨機(brute force)發(fā)生也會足夠。然而,將更有可能導(dǎo)致異常投擲的選擇參數(shù)通過增加產(chǎn)生的無效調(diào)用序列的百分比而提高效率。
      再次參考圖1,參數(shù)發(fā)生由操作發(fā)生模塊101以及參數(shù)發(fā)生模塊102表示,該操作發(fā)生模塊101將參數(shù)類型112供給到參數(shù)發(fā)生模塊102,該參數(shù)發(fā)生模塊102將相應(yīng)參數(shù)類型112的特定有趣參數(shù)113返回到操作發(fā)生模塊101。然后,操作發(fā)生模塊101將特定參數(shù)類型的特定數(shù)值置于方法中該特定參數(shù)類型所屬的位置。對方法中的每個參數(shù)進行此項工作,以產(chǎn)生操作。然后,該操作被包括在可由對象105執(zhí)行的可能操作114的池中。
      參考圖1,操作集合114包括,例如,操作114A,操作114B、操作114C、操作114D、操作114E、操作114F以及由垂直橢圓114G表示的潛在的許多其它操作,其中,操作114A包括聚集方法111A的參數(shù)113A,操作114B包括聚集方法111B的參數(shù)113B,操作114C包括聚集方法111C的參數(shù)113C,操作114D包括聚集方法111A的參數(shù)113D,操作114E包括聚集方法111B的參數(shù)113E,操作114F包括聚集方法111C的參數(shù)113F。該操作集合包括與3個不同方法111A、111B和111C相關(guān)聯(lián)的操作。然而,該發(fā)明的原理也適合具有單個方法的對象。如果是那樣的話,該差異將會是該操作集合將包括單個方法的操作,但具有潛在的不同參數(shù)。
      操作集合114被提供到調(diào)用序列發(fā)生模塊103,以允許方法200繼續(xù)進行從該操作集合自動構(gòu)造操作的調(diào)用序列的動作(動作204)。至少有3個用于產(chǎn)生給定長度調(diào)用序列的不同策略完全策略、隨機策略和成對策略。
      完全策略包括產(chǎn)生足夠的調(diào)用序列,使有相應(yīng)操作序列的每個可能排列的調(diào)用序列,其具有給定長度而且能得自屬于該操作集合的操作。這個完全策略對小的調(diào)用序列和對從中提取的小的操作集合來說是有效的。然而,對較長的調(diào)用序列和/或較大的操作集合來說,該完全策略變得在指數(shù)上處理程度更強。
      隨機策略包括通過從操作集合隨機的選擇操作來構(gòu)造有限數(shù)量的調(diào)用序列。這允許調(diào)用序列被測試,而不必擔心每個可能的調(diào)用序列被測試。然而,這個優(yōu)點也是這個策略的缺點。明確的說,并不是所有的調(diào)用序列都被測試,因此某些異常可能被遺漏。
      另一個策略包括調(diào)用序列的成對測試。明確的說,一旦已經(jīng)產(chǎn)生具有給定的鄰近操作對的調(diào)用序列,則不產(chǎn)生具有相同鄰近操作對的調(diào)用序列。相同的技術(shù)可被應(yīng)用到3個、4個等等這樣的鄰近對。在這個理論后,我們通常會思考,一般而言,具有相同鄰近操作對的調(diào)用序列與其它調(diào)用序列相比更有可能產(chǎn)生相同的異常,并且這樣在測試中具有較低效用。用于執(zhí)行這樣成對測試的方法在聯(lián)合擁有的共同未決的美國專利申請序列號10/385,255中被做說明,其申請于2003年3月10日,并被冠以標題“暴露軟件對象中輸出失效的輸入值的自動標識”(“Automatic Identification of Input Values that ExposeOutput Failures in a Software Object”),其專利申請作為參考全面合并于此。
      參考圖2,產(chǎn)生的調(diào)用序列由調(diào)用序列115表示,其包括,例如,調(diào)用序列115A、115B、115C、115D、115E和115F。調(diào)用序列115F被擴展以闡明3個操作長的調(diào)用序列的特定例子。調(diào)用序列115F中的操作包括操作114E、114B和114F。
      對產(chǎn)生的每個調(diào)用序列而言,然后方法200使用對象自動執(zhí)行操作的調(diào)用序列(動作205)。這可通過執(zhí)行模塊104來完成,該執(zhí)行模塊104接收調(diào)用序列、執(zhí)行對象105上的該調(diào)用序列,隨后檢測任何的異常。某些調(diào)用序列可能不導(dǎo)致異常。然而,對無效調(diào)用序列而言,然后方法200包括自動鑒別異常被投擲為執(zhí)行調(diào)用序列結(jié)果的動作(動作206)。例如,執(zhí)行模塊104接收來自對象105的異常。這個接收可直接出現(xiàn),或甚至通過運行時間環(huán)境的其它構(gòu)件來間接出現(xiàn)。
      可選擇的是,使用最小化模塊106來最小化調(diào)用序列,以鑒別也導(dǎo)致相同異常的長度減少的調(diào)用序列。這可通過測試調(diào)用序列中的每個操作子集并同時保持調(diào)用序列中的連續(xù)依存關(guān)系來完成。若調(diào)用序列的長度長的話,這可能證明處理加強任務(wù)。另一個選項是從產(chǎn)生異常的最初調(diào)用序列移除一個操作,以決定任何大小減少的調(diào)用序列是否也產(chǎn)生該異常。若沒有,則產(chǎn)生該異常的最初調(diào)用序列被認為是已經(jīng)被最小化了。否則,也產(chǎn)生該異常的一個或多個大小減少的調(diào)用序列也同樣的由一個等等沿著大小減少的調(diào)用序列樹減少,這種情況直到調(diào)用序列被發(fā)現(xiàn),當其被減少時,不管什么操作被移除,它也不導(dǎo)致異常時才停止。
      然后方法200包括報告異常出現(xiàn)以及導(dǎo)致該異常的調(diào)用序列的動作(動作207)。若該調(diào)用序列被最小化,則其可為被報告的最小化的調(diào)用序列,或者也許產(chǎn)生該異常的最初調(diào)用序列以及該最小化的調(diào)用序列均可被報告。若在動作201中鑒別期望異常,則其也可被報告該異常是否是其中一個鑒別的異常。
      為了減少操作集合中操作的數(shù)量,一旦使用一個或多個調(diào)用序列檢測到關(guān)于給定方法的所有期望異常,則基于該方法的操作可潛在的被從任何進一步的調(diào)用序列排除。若即使在檢測到該異常之后,該方法還是沒有準備好報告(如也許是當該方法要在報告之前最小化該調(diào)用序列時的情況下),若一個還沒有被構(gòu)造好并已經(jīng)一直在執(zhí)行該調(diào)用序列,則過程返回到構(gòu)造另一個調(diào)用序列的動作。另外,即使在報告該異常和調(diào)用序列之后,該過程也可重復(fù)??蛇x擇的是,該過程可通過重建可由對象執(zhí)行的操作集合而重復(fù),如在具有特定相關(guān)聯(lián)方法的操作被移除的時候,這是由于與該方法相關(guān)聯(lián)的操作已經(jīng)被全部檢測到了。
      因此,我們已經(jīng)說明了方法、系統(tǒng)和用于實現(xiàn)該方法的計算機程序產(chǎn)品,其中無效調(diào)用序列被自動鑒別,以幫助測試者當對象產(chǎn)生不適當?shù)漠惓r鑒別。本領(lǐng)域熟練的技術(shù)人員也將認識到本發(fā)明可在具有許多類型的計算機系統(tǒng)配置的網(wǎng)絡(luò)計算環(huán)境中應(yīng)用,該具有許多類型的計算機系統(tǒng)配置的網(wǎng)絡(luò)計算環(huán)境包括個人計算機、手提式裝置、多處理器系統(tǒng)、基于微處理器的或可編程消費者電子裝置、網(wǎng)絡(luò)PC、小型計算機、大型計算機以及類似的裝置。本發(fā)明也可應(yīng)用在分布式計算環(huán)境中,那里由通過通信網(wǎng)絡(luò)連接的(或者通過硬布線連接、無線連接,或者通過硬布線或無線連接的組合)本地和遠程處理裝置來執(zhí)行任務(wù)。在分布式計算環(huán)境中,程序模塊既可位于本地存儲器存儲裝置中,也可位于遠程存儲器存儲裝置中。
      圖4和下面的討論意指提供用于實現(xiàn)本發(fā)明確定元件的合適計算環(huán)境的簡要、概括性的說明。然而,應(yīng)當被強調(diào)的是本發(fā)明不必被限制在任何特定的計算機化系統(tǒng),其可應(yīng)用于廣泛領(lǐng)域的計算機化系統(tǒng)。
      依照一個實施例,本發(fā)明包括保存計算機可執(zhí)行指令的一個或多個計算機可讀媒體,這諸如可由計算裝置執(zhí)行的程序模塊。一般的,程序模塊包括例程、程序、對象、構(gòu)件、數(shù)據(jù)結(jié)構(gòu)等等,其執(zhí)行特定的任務(wù)或?qū)崿F(xiàn)特定的抽象數(shù)據(jù)類型。計算機可執(zhí)行指令、相關(guān)聯(lián)的數(shù)據(jù)結(jié)構(gòu)以及程序模塊代表用于執(zhí)行這里說明的方法步驟的程序代碼方法的例子。這樣的可執(zhí)行指令或相關(guān)聯(lián)數(shù)據(jù)結(jié)構(gòu)的特定序列代表用于實現(xiàn)在這樣的步驟中說明的功能的相應(yīng)動作的例子。
      本領(lǐng)域熟練的技術(shù)人員將認識到本發(fā)明可應(yīng)用在網(wǎng)絡(luò)計算環(huán)境中,除單獨計算裝置之外,該網(wǎng)絡(luò)計算環(huán)境具有許多類型的計算機系統(tǒng)配置,這包括個人計算機、手提式裝置、多處理器系統(tǒng)、基于微處理器的或可編程消費者電子裝置、網(wǎng)絡(luò)PC、小型計算機、大型計算機、其構(gòu)件,以及類似的裝置。本發(fā)明也可應(yīng)用在分布式計算環(huán)境中,那里由通過通信網(wǎng)絡(luò)連接的(或者通過硬布線連接、無線連接,或者通過硬布線或無線連接的組合)本地和遠程處理裝置來執(zhí)行任務(wù)。在分布式計算環(huán)境中,程序模塊既可位于本地存儲器存儲裝置中,也可位于遠程存儲器存儲裝置中。
      特別參考圖4,用于實現(xiàn)本發(fā)明確定元件的范例系統(tǒng)包括以傳統(tǒng)計算機420形式的通用計算系統(tǒng),這包括處理單元421、包含計算機可讀媒體的系統(tǒng)存儲器422以及將包括系統(tǒng)存儲器422的不同系統(tǒng)構(gòu)件聯(lián)結(jié)到處理單元421的系統(tǒng)總線423。系統(tǒng)總線423可為任何幾種類型的總線結(jié)構(gòu),這包括存儲器總線或存儲器控制器、外圍總線以及使用任何多種總線體系結(jié)構(gòu)的本地總線。系統(tǒng)存儲器包括只讀存儲器(ROM)424和隨機存取存儲器(RAM)425。基本輸入/輸出系統(tǒng)(BIOS)426包含諸如在啟動階段幫助在計算機420中的元件之間傳遞信息的基本例程,該基本輸入/輸出系統(tǒng)(BIOS)可被保存在ROM 424中。
      計算機420也可包括用于讀自和寫到硬磁盤439的硬磁盤驅(qū)動器427,用于讀自或?qū)懙娇梢瞥疟P429的硬磁盤驅(qū)動器428,以及用于讀自或?qū)懙街T如CD-ROM或其它光媒體這樣的可移除光盤431的光盤驅(qū)動器430。硬磁盤驅(qū)動器427、磁盤驅(qū)動器428和光盤驅(qū)動器430分別通過硬盤驅(qū)動器接口432、磁盤驅(qū)動器接口433以及光驅(qū)動器接口434與系統(tǒng)總線423相連。該驅(qū)動器和其相關(guān)聯(lián)的計算機可讀媒體提供計算機可執(zhí)行指令、數(shù)據(jù)結(jié)構(gòu)、程序模塊和關(guān)于計算機420其它數(shù)據(jù)的非易失性存儲。這些存儲媒體也可被用來保存將修正系數(shù)與伽馬數(shù)值(gamma values)相關(guān)聯(lián)的數(shù)據(jù)結(jié)構(gòu),這如上所述。盡管這里說明的范例環(huán)境使用硬磁盤439、可移除磁盤429以及可移除光盤431,用于保存數(shù)據(jù)的其它類型的計算機可讀媒體還是可以被使用,這包括盒式磁帶、閃速存儲器卡、數(shù)字多用途盤、伯努利編碼磁帶(Bernoulli cartridges)、RAM、ROM,以及類似的裝置。
      包含一個或多個程序模塊的程序代碼方法可被保存在硬盤439、磁盤429、光盤431、ROM 424或RAM 425上,這包括操作系統(tǒng)435、一個或多個應(yīng)用程序436、其它程序模塊437以及程序數(shù)據(jù)438。操作發(fā)生模塊101、參數(shù)發(fā)生模塊102、調(diào)用序列發(fā)生模塊103、執(zhí)行模塊104以及最小化模塊106代表其它程序模塊437的例子。另外,方法111、操作集合114以及調(diào)用序列115代表程序數(shù)據(jù)438的例子。
      用戶可通過鍵盤440、點擊設(shè)備442、或諸如傳聲器、操縱桿、游戲墊、圓盤式衛(wèi)星電視天線、掃描儀或類似裝置這樣的其它輸入裝置(未示出)將命令和信息輸入到計算機420中。這些和其它的輸入裝置一般通過與系統(tǒng)總線423聯(lián)結(jié)的串行端口接口446與處理單元421相連。作為選擇,該輸入裝置可通過諸如并行端口、游戲端口或通用串行總線架構(gòu)(USB)這樣的其它接口連接。監(jiān)視器447或另一個顯示裝置也與通過諸如視頻適配器448這樣的接口與系統(tǒng)總線423相連。在這個上下文中,視頻適配器448被認為包括如上述的GPU。除監(jiān)視器之外,個人計算機通常包括諸如揚聲器和打印機這樣的其它外圍輸出裝置(未示出)。
      計算機420可在使用到諸如遠程計算機449a和449b這樣的一個或多個遠程計算機邏輯連接的網(wǎng)絡(luò)化環(huán)境中工作。遠程計算機449a和449b每個可為另一個個人計算機、服務(wù)器、路由器、網(wǎng)絡(luò)PC、對等裝置或其它普通網(wǎng)絡(luò)節(jié)點,而且其通常包括許多或所有的上面相對于計算機420說明的元件,盡管僅有存儲器存儲裝置450a和450b以及其相關(guān)聯(lián)的應(yīng)用程序436a和436b已經(jīng)在圖4中被闡明。圖4中描述的邏輯連接包括本地網(wǎng)(LAN)451和廣域網(wǎng)(WAN)452,其在這里作為例子提出,并非限制。這樣的網(wǎng)絡(luò)環(huán)境在辦公室區(qū)域(office-wide)或全企業(yè)計算機網(wǎng)絡(luò)、局內(nèi)網(wǎng)和國際互聯(lián)網(wǎng)中是常見的。
      當在LAN網(wǎng)絡(luò)環(huán)境中使用計算機420時,計算機420通過網(wǎng)絡(luò)接口或適配器453與本地網(wǎng)451相連。當在WAN網(wǎng)絡(luò)環(huán)境中使用計算機420(譯者注原文這里為computer 20,我想這里應(yīng)為computer 420)時,計算機420可包括調(diào)制解調(diào)器454、無線連接、或者用于在諸如國際互聯(lián)網(wǎng)這樣的廣域網(wǎng)452上確立通信的其它裝置。調(diào)制解調(diào)器454可為內(nèi)置或外置的,其通過串行端口接口446與系統(tǒng)總線423相連。在網(wǎng)絡(luò)化環(huán)境中,相對于計算機420描述的程序模塊或其部分可被保存在遠程存儲器存儲裝置中。應(yīng)當認識到所示網(wǎng)絡(luò)連接是范例性的,而且在廣域網(wǎng)452上確立通信的其它裝置可被使用。
      在不背離本發(fā)明主旨或本質(zhì)特征的前提下,本發(fā)明可具體體現(xiàn)在其它特定的形式中。說明的實施例將在所有方面被認為僅是例證性的,并非限制性的。因此,本發(fā)明的范圍由附加權(quán)利要求書表明,而不是由前述的說明來表明。屬于權(quán)利要求書等價技術(shù)方案的含義和范圍的所有變化在其范疇內(nèi)是可被接受的。
      權(quán)利要求
      1.在能夠執(zhí)行對象的計算系統(tǒng)中,用于測試所述對象以鑒別導(dǎo)致異常的一個或多個調(diào)用序列的方法,所述方法包含如下自動產(chǎn)生可由所述對象執(zhí)行的一組操作,每個操作包括所述對象的方法以及與所述對象相關(guān)聯(lián)的零個或更多參數(shù)的動作;自動從所述操作集合構(gòu)造操作調(diào)用序列的動作;使用所述對象自動執(zhí)行所述操作調(diào)用序列的動作;自動鑒別異常被投擲為執(zhí)行所述調(diào)用序列的結(jié)果的動作;報告所述異常的所述出現(xiàn)以及導(dǎo)致所述異常的所述調(diào)用序列的動作。
      2.如權(quán)利要求1的方法,其特征在于,所述調(diào)用序列是當前調(diào)用序列,構(gòu)造調(diào)用序列的所述動作包含將一個或多個操作從也導(dǎo)致所述異常的先前調(diào)用序列移除的動作。
      3.如權(quán)利要求2的方法,其特征在于,報告所述異常的所述出現(xiàn)的所述動作進一步包含如下也報告所述先前調(diào)用序列的動作。
      4.如權(quán)利要求2的方法,進一步包含如下重復(fù)關(guān)于一個或多個減小的調(diào)用序列構(gòu)造、執(zhí)行和鑒別的所述動作,其中一個或多個操作被從所述當前調(diào)用序列移除,其中對每個所述一個或多個減小的調(diào)用序列而言,鑒別異常是否出現(xiàn)的所述動作包含鑒別所述異常不出現(xiàn)的動作。
      5.如權(quán)利要求1的方法,進一步包含如下重復(fù)關(guān)于從所述操作集合構(gòu)造的每個多數(shù)調(diào)用序列而自動構(gòu)造、執(zhí)行、鑒別并報告的所述動作。
      6.如權(quán)利要求1的方法,進一步包含,重復(fù)關(guān)于每個多數(shù)調(diào)用序列而自動產(chǎn)生、構(gòu)造、執(zhí)行、鑒別并報告的所述動作。
      7.如權(quán)利要求1的方法,進一步包含如下鑒別一組一個或多個期望異常的動作。
      8.如權(quán)利要求7的方法,其特征在于,報告的所述動作進一步包含報告所述投擲異常是否是一個或多個期望異常所述集合的其中一個的動作。
      9.如權(quán)利要求7的方法,其特征在于,鑒別一組一個或多個異常的所述動作包含通過在測試中檢查關(guān)于所述對象的文檔編制或源代碼而手工的鑒別一個或多個異常的所述集合的動作。
      10.如權(quán)利要求7的方法,其特征在于,鑒別一組一個或多個異常的所述動作包含如下使用軟件程序自動鑒別一個或多個異常的所述集合,以檢查所述對象的所述結(jié)構(gòu)的動作。
      11.如權(quán)利要求10的方法,其特征在于,使用軟件程序自動鑒別一個或多個異常的所述集合以檢查所述對象的所述結(jié)構(gòu)的所述動作,包含自動檢查所述對象的所述源代碼的動作。
      12.如權(quán)利要求10的方法,其特征在于,使用軟件程序自動鑒別一個或多個異常的所述集合以檢查所述對象的所述結(jié)構(gòu)的所述動作,包含自動檢查所述對象的所述機器可讀指令的動作。
      13.如權(quán)利要求1的方法,其特征在于,所述對象具有多個相關(guān)聯(lián)的方法、所述操作集合包括所述相關(guān)聯(lián)方法中的不只一個。
      14.如權(quán)利要求1的方法,其特征在于,所述自動產(chǎn)生可由所述對象執(zhí)行的操作集合的所述動作包含如下關(guān)于每個至少所述多數(shù)相關(guān)聯(lián)方法,其執(zhí)行如下產(chǎn)生用于所述相關(guān)聯(lián)方法的一組一個或多個參數(shù)的一個或多個集合的動作;以及將通過把所述相關(guān)聯(lián)的方法同關(guān)于所述相關(guān)聯(lián)方法的一個或多個參數(shù)的每個集合組合起來而獲得的那些操作包括在所述操作集合內(nèi)的動作。
      15.如權(quán)利要求14的方法,其特征在于,一個或多個參數(shù)的所述集合包括應(yīng)該導(dǎo)致投擲異常的參數(shù)。
      16.如權(quán)利要求1的方法,其特征在于,所述對象具有單個相關(guān)聯(lián)的方法,所述操作集合包括所述單個方法。
      17.計算機程序產(chǎn)品,在能夠執(zhí)行對象的計算系統(tǒng)中使用,所述計算機程序產(chǎn)品用于實現(xiàn)有關(guān)測試所述對象以鑒別導(dǎo)致異常的一個或多個調(diào)用序列的方法,且所述計算機程序產(chǎn)品包含具有計算機可執(zhí)行指令的一個或多個計算機可讀媒體,該計算機可執(zhí)行指令當被處理器執(zhí)行的時候,使所述計算系統(tǒng)執(zhí)行產(chǎn)生可被所述對象執(zhí)行的一組操作,每個操作包括所述對象的方法以及與所述對象相關(guān)聯(lián)的零個或更多參數(shù);從所述操作集合構(gòu)造操作的調(diào)用序列;使用所述對象執(zhí)行操作的所述調(diào)用序列;鑒別異常被投擲為執(zhí)行所述調(diào)用序列的結(jié)果;以及報告所述異常的所述出現(xiàn)以及導(dǎo)致所述異常的所述調(diào)用序列。
      18.如權(quán)利要求17的計算機程序產(chǎn)品,其特征在于,所述一個或多個計算機可讀媒體是物理媒體。
      19.如權(quán)利要求18的計算機程序產(chǎn)品,其特征在于,所述物理媒體是非易失性存儲媒體。
      20.如權(quán)利要求18的計算機程序產(chǎn)品,其特征在于,所述物理媒體是非易失性系統(tǒng)存儲器。
      21.如權(quán)利要求17的計算機程序產(chǎn)品,其特征在于,所述調(diào)用序列是當前的調(diào)用序列,所述一個或多個計算機可讀媒體進一步具有計算機可執(zhí)行指令,該計算機可執(zhí)行指令當被處理器執(zhí)行時,使所述計算系統(tǒng)執(zhí)行如下將一個或多個操作從也導(dǎo)致所述異常的先前調(diào)用序列移除。
      22.如權(quán)利要求21的計算機程序產(chǎn)品,其特征在于,所述一個或多個計算機可讀媒體進一步具有計算機可執(zhí)行指令,該計算機可執(zhí)行指令當被處理器執(zhí)行時,使所述計算系統(tǒng)執(zhí)行如下重復(fù)關(guān)于一個或多個減小的調(diào)用序列的所述構(gòu)造、執(zhí)行和鑒別,其中一個或多個操作被從所述當前的調(diào)用序列移除,其中這關(guān)于每個所述一個或多個減小的調(diào)用序列。
      23.如權(quán)利要求17的計算機程序產(chǎn)品,其特征在于,所述一個或多個計算機可讀媒體進一步具有計算機可執(zhí)行指令,該計算機可執(zhí)行指令當被處理器執(zhí)行時,使所述計算系統(tǒng)執(zhí)行如下重復(fù)關(guān)于從所述操作集合構(gòu)造的每個多數(shù)調(diào)用序列的所述構(gòu)造、執(zhí)行、鑒別以及報告。
      24.如權(quán)利要求17的計算機程序產(chǎn)品,其特征在于,所述一個或多個計算機可讀媒體進一步具有計算機可執(zhí)行指令,該計算機可執(zhí)行指令當被處理器執(zhí)行時,促使所述計算系統(tǒng)執(zhí)行如下鑒別一組一個或多個期望異常。
      25.如權(quán)利要求17的計算機程序產(chǎn)品,其特征在于,所述一個或多個計算機可讀媒體進一步具有計算機可執(zhí)行指令,該計算機可執(zhí)行指令當被處理器執(zhí)行時,使所述計算系統(tǒng)執(zhí)行如下產(chǎn)生用于所述相關(guān)聯(lián)方法的一組一個或多個參數(shù)的一個或多個集合;以及將通過把所述相關(guān)聯(lián)的方法與關(guān)于所述相關(guān)聯(lián)方法的一個或多個參數(shù)的每個集合組合起來而獲得的那些操作包括在所述操作集合內(nèi)。
      26.在能夠執(zhí)行所述對象的計算系統(tǒng)中,用于測試所述對象以鑒別導(dǎo)致異常的一個或多個調(diào)用序列的方法,所述方法包含如下自動鑒別導(dǎo)致異常的無效調(diào)用序列的步驟;以及報告所述異常的所述出現(xiàn)以及導(dǎo)致所述異常的所述無效調(diào)用序列的動作。
      27.如權(quán)利要求26的方法,其特征在于,自動鑒別導(dǎo)致異常的無效調(diào)用序列的所述步驟包含自動產(chǎn)生可由所述對象執(zhí)行的一組操作,每個操作包括所述對象的方法以及與所述對象相關(guān)聯(lián)的零個或更多參數(shù)的動作;從所述操作集合自動構(gòu)造操作的調(diào)用序列的動作;使用所述對象自動執(zhí)行操作的所述調(diào)用序列的動作;自動鑒別異常被投擲為執(zhí)行所述調(diào)用序列的結(jié)果的動作。
      全文摘要
      對象的計算機化測試以鑒別導(dǎo)致異常的一個或多個調(diào)用序列。自動產(chǎn)生一組潛在操作(由方法和相關(guān)聯(lián)的參數(shù)值組成)。參數(shù)發(fā)生器可供給更有可能導(dǎo)致投擲異常的有趣參數(shù)值。使用操作集合中的操作來自動構(gòu)造許多調(diào)用序列,這作為該序列中的步驟。然后使用對象的新實例來執(zhí)行每個調(diào)用序列。若異常被投擲,則可發(fā)行這樣的報告,其包含對評估該異常適當與否有幫助的信息。這個信息可包括該異常類型以及導(dǎo)致該投擲異常的無效調(diào)用序列。該無效調(diào)用序列也可被最小化,以幫助測試者評估根本原因和該異常的適當性。
      文檔編號G06F11/28GK1542622SQ20041003461
      公開日2004年11月3日 申請日期2004年4月14日 優(yōu)先權(quán)日2003年4月14日
      發(fā)明者J·R·蘭伯特, J R 蘭伯特 申請人:微軟公司
      網(wǎng)友詢問留言 已有0條留言
      • 還沒有人留言評論。精彩留言會獲得點贊!
      1