国产精品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>

      基于控制流圖的單元回歸測試用例集合優(yōu)化方法

      文檔序號:6380154閱讀:287來源:國知局
      專利名稱:基于控制流圖的單元回歸測試用例集合優(yōu)化方法
      技術(shù)領(lǐng)域
      本發(fā)明涉及軟件測試技術(shù),尤其涉及一種基于控制流圖的單元回歸測試用例集合優(yōu)化方法,屬于控制流圖對比技術(shù)在回歸測試中的應(yīng)用。
      背景技術(shù)
      當開發(fā)人員在單元測試過程中發(fā)現(xiàn)軟件故障時,會對代碼進行相應(yīng)的修改。被測單元在改動之后,需要重新測試以保證所做的修改達到了預(yù)期的目的,并且沒有引入新的缺陷,這個過程叫做回歸測試。回歸測試作為單元測試周期中的一個組成部分,在整個測試過程中占有很大比重,其成本甚至達到了整個測試成本的一半以上。因此,通過選擇正確的回歸測試策略來改進回歸測試的有效性和效率是非常有意義的。
      提高回歸測試效率的重心是構(gòu)造精簡而有效的測試用例集合。如果簡單地重測所有用例將會帶來大量不必要的開銷;而部分測試用例又會因為軟件不斷更新而失效。因此,回歸測試只需要根據(jù)修改情況進行有選擇性的測試,并根據(jù)測試目標考慮補充新的測試用例。現(xiàn)有的回歸測試策略主要分為三類對基線測試用例庫的約簡,測試用例優(yōu)先級技術(shù)以及測試用例的選擇性復(fù)用。其中,測試用例庫約簡技術(shù)是通過刪除所有冗余測試用例得到測試用例集合的最小約簡子集。而測試用例優(yōu)先級技術(shù)是根據(jù)測試用例對測試目標的貢獻程度進行比較和排序,優(yōu)先執(zhí)行相對重要的測試用例。雖然測試用例庫約簡技術(shù)和測試用例優(yōu)先級技術(shù)的測試效率較高,但是由于缺乏選擇的針對性,其發(fā)現(xiàn)程序錯誤的能力相比于原有測試用例集可能會有很大的損失,即這種通過減少測試用例來節(jié)省測試精力的策略,在降低成本的同時也增加了測試風(fēng)險。所述的測試用例的選擇性復(fù)用是圍繞某種準則從基線測試用例庫中選擇測試用例,目前最常見的選擇準則是程序修改點與測試用例的相關(guān)性。這種方法能夠保證選擇出的測試用例精度高、針對性強,在測試過程中使用這樣的測試用例集合可以同時保證回歸測試的高效性與有效性。

      發(fā)明內(nèi)容
      有鑒于此,本發(fā)明的主要目的在于提供一種基于控制流圖的單元回歸測試用例集合優(yōu)化方法,根據(jù)代碼中被修改部分篩選和新增測試用例,從而構(gòu)造出回歸測試用例集合,以提高回歸測試的效率,并保證回歸測試的有效性與充分性。為達到上述目的,本發(fā)明的技術(shù)方案是這樣實現(xiàn)的
      基于控制流圖的單元回歸測試用例集合優(yōu)化方法,該方法包括
      A、對比被測單元修改前后的控制流圖,找出代碼中被修改的部分所對應(yīng)的節(jié)點,所述節(jié)點簡稱修改點;
      B、從單元測試用例集合中篩選出執(zhí)行路徑經(jīng)過修改點的測試用例,作為回歸測試用例集合的一部分,記作選擇測試用例集Tselected,并運行集合中的所有測試用例;
      C、計算修改點的所有可達后繼節(jié)點,從中選出在步驟B的運行過程中未被覆蓋的節(jié)點子集
      D、若節(jié)點子集#為空,則執(zhí)行步驟F,否則執(zhí)行步驟E;
      E、從節(jié)點子集#中取出一個節(jié)點作為覆蓋目標生成測試用例,將其加入到新增測試用例集合Tnew并運 行;待運行完畢后,更新節(jié)點子集見從中刪除在此次運行中已被覆蓋的節(jié)點,然后執(zhí)行步驟D ;
      F、回歸測試用例集合Tk構(gòu)造完畢,Tr
      Tselected ^ ^new0其中,所述步驟A中根據(jù)對比控制流圖的方法找出修改點的具體過程為
      Al、在代碼被修改前,將其對應(yīng)的控制流圖備份,記為CFGl ;代碼被修改后,對被測單元重新進行靜態(tài)分析,生成控制流圖,記為CFG2 ;控制流圖的節(jié)點包含對應(yīng)的抽象語法樹
      信息;
      A2、使用深度優(yōu)先搜索算法同時遍歷控制流圖CFGl和CFG2 ;在遍歷過程中成對地對比當前遍歷到的控制流圖節(jié)點;若其包含的抽象語法樹信息不同,則把它當作修改點,加入到修改點集合當中。其中,步驟A2中使用深度優(yōu)先搜索算法同時遍歷控制流圖CFGl和CFG2,對比當前節(jié)點對的抽象語法樹信息;同時還考慮節(jié)點的增加和刪減情況,并作了相應(yīng)處理;其具體過程如下
      A21、根據(jù)控制流圖產(chǎn)生時的節(jié)點序號順序,分別取CFGl和CFG2的未訪問過的后繼節(jié)點作為當前節(jié)點對,并取當前節(jié)點對中CFG2的節(jié)點作為當前節(jié)點;
      A22、若當前節(jié)點對為空,當父節(jié)點是函數(shù)入口節(jié)點時,遍歷結(jié)束,否則回退到當前節(jié)點對的父節(jié)點,執(zhí)行步驟A21 ;
      A23、若當前節(jié)點對中的兩個節(jié)點都不為空,則比較當前節(jié)點對中每個節(jié)點包含的抽象語法樹信息,即對應(yīng)的表達式中的常量、變量、運算符信息,若這些信息都相同則執(zhí)行步驟A21 ;若不同,則執(zhí)行步驟A24;
      A24、將當前節(jié)點作為修改點,加入到修改點集合當中;如果當前節(jié)點對中CFGl的節(jié)點為空,CFG2的節(jié)點不為空,則說明CFG2的節(jié)點是修改后新增的,此時將CFG2非空節(jié)點的父節(jié)點作為修改點,加入到修改點集合當中;如果CFGl的節(jié)點不為空而CFG2的節(jié)點為空,則說明CFGl中對應(yīng)的代碼已被刪除,把CFGl中被刪除的節(jié)點作為修改點,加入到修改點集合中。步驟B中在單元測試過程中使用的測試用例,均以控制流圖節(jié)點標號的形式將執(zhí)行路徑記錄于數(shù)據(jù)庫中;遍歷測試用例數(shù)據(jù)庫中的每個測試用例,若其執(zhí)行路徑的標號序列中包含了修改點集合中任一修改點的標號,則被選擇為回歸測試用例,加入到選擇測試用例集
      Tselected 并執(zhí)行。步驟C中,從覆蓋率角度考慮為回歸測試添加新的測試用例;具體為首先,計算出修改點在控制流圖中的所有可達后繼節(jié)點;然后,從此節(jié)點集合中選出在步驟B的運行過程中沒有被覆蓋到的節(jié)點,作為需要在回歸測試中被覆蓋的目標節(jié)點集合見步驟E中,以節(jié)點集合#中的節(jié)點為覆蓋目標,進行區(qū)間運算,生成滿足覆蓋條件的測試用例,并運行。同時,更新節(jié)點集合見從中刪除在本次運行過程中已覆蓋到的節(jié)點。步驟F中,該回歸測試用例集合由兩部分構(gòu)成選擇測試用例集和新增測試用例集合Tnev,即 'Tr =
      Tselected ^ ^new0本發(fā)明所提供的基于控制流圖的單元回歸測試用例集合優(yōu)化方法,具有以下優(yōu)
      占-
      應(yīng)用該單元回歸測試用例集合優(yōu)化方法進行回歸測試,其關(guān)鍵在于提高測試用例選擇精度和測試可信度,本發(fā)明方法在基于控制流圖遍歷的回歸測試用例選擇算法和基于覆蓋要求的測試方法的基礎(chǔ)上,加以改進和綜合,能夠達到以下的目標以更少的測試用例提高回歸測試的效率;以篩選相關(guān)測試用例和補充新測試用例的方式提高回歸測試的有效性。


      圖I為本發(fā)明的回歸測試用例集合組成圖;
      圖2為本發(fā)明的單元回歸測試用例集優(yōu)化策略的應(yīng)用流程示意 圖3為本發(fā)明源程序Testl. Java中函數(shù)f的初始控制流 圖4為本發(fā)明中控制流圖對比過程中CFGl的后繼節(jié)點為空而CFG2的后繼節(jié)點不為空的控制流圖對比 圖5為本發(fā)明中控制流圖對比過程中CFGl的后繼節(jié)點不為空而CFG2的后繼節(jié)點為空的控制流圖對比圖。
      具體實施例方式下面結(jié)合附圖及本發(fā)明的實施例對本發(fā)明的方法作進一步詳細的說明。本發(fā)明的基本思想是利用回歸測試的第三種策略,即根據(jù)程序修改情況對基線測試用例庫中的測試用例進行選擇性復(fù)用,考慮到運行原有測試用例可能無法滿足新代碼的測試需求,導(dǎo)致回歸測試不夠充分,因此有必要向回歸測試用例集合中補充新的測試用例。這樣,通過程序控制流圖對比技術(shù)識別出程序中的修改點,根據(jù)執(zhí)行路徑經(jīng)過修改點的測試用例在再次運行時結(jié)果可能發(fā)生改變的原理對這類測試用例選擇性復(fù)用,并且按照覆蓋需求補充新的測試用例;即回歸測試用例集合包括兩部分復(fù)用測試用例和新增測試用例。在開發(fā)人員對原程序改動較少的情況下,沒有必要將所有單元測試的測試用例進行回歸測試。此時,應(yīng)進行選擇性回歸測試(selective regression test),即從原測試用例集合中找出部分測試用例來測試。當這些測試用例對于修改后的代碼來說,測試并不夠充分的情況下,再生成新的測試用例進行測試。因此,回歸測試的重點在于測試用例的選擇與生成。本發(fā)明方法中,優(yōu)化回歸測試用例集合的策略,盡力保證集合中的每個元素都與修改相關(guān)。因此,本發(fā)明的研究內(nèi)容主要為以下兩點
      分析回歸測試需要哪些測試用例;
      如何篩選或生成這些測試用例。第一點,即討論回歸測試中測試用例集合的組成。由于回歸測試的測試目標主要包含兩方面,即所做的修改達到了預(yù)期的目的;軟件的修改沒有引入新的缺陷。為了保證第一個條件成立,需要將與該修改處相關(guān)且在單元測試中執(zhí)行失敗的測試用例重新運行,以驗證修改后這些測試用例可以通過;同時,為了保證對修改處的測試足夠充分,可能需要新增一部分與之相關(guān)的測試用例。而為了保證第二個條件成立,則需要將與該修改處相關(guān)且在單元測試中執(zhí)行成功的測試用例再重新運行一次,以驗證這些本來已經(jīng)通過的測試用例在回歸測試中依然通過。因此,回歸測試用例集合Tk可以表示為
      Tr ~ Tfajl U Tnew U Tpass - Tselected U Tnew
      其中'Tfail表示與該修改處相關(guān)且在單元測試環(huán)節(jié)中執(zhí)行失敗的測試用例集合,Tnew表示需要為修改處新增的 測試用例集合,Tpass表示與該修改處相關(guān)且在單元測試環(huán)節(jié)中執(zhí)行成功的測試用例集合。Tfail和Tpass組合成為選擇測試用例集合Ts+rted。圖I為本發(fā)明的回歸測試用例集合組成圖。在研究分析出回歸測試用例集合的組成后,需要討論如何篩選或者生成符合條件的測試用例。由于回歸測試中測試用例集合主要由兩部分組成選擇測試用例集合T—和為修改處新增的測試用例集合TnOT。所述“選擇測試用例集合”T—即在代碼被修改之后,執(zhí)行結(jié)果可能會受到影響的測試用例。顯而易見,若一個測試用例在執(zhí)行過程中,其執(zhí)行路徑經(jīng)過被修改的語句或判定條件,那么它的執(zhí)行結(jié)果受之影響的可能性非常大。所以,將執(zhí)行路徑經(jīng)過修改點的測試用例等價為“與修改處相關(guān)的測試用例”。另外,這些測試用例不僅是執(zhí)行結(jié)果可能會受影響,其執(zhí)行路徑也有可能會發(fā)生改變,如某個判定條件的修改。為了保證對修改后的功能進行了充分的測試,有必要新增一些測試用例,將與被修改點相關(guān)的所有語句按覆蓋率要求(包括語句、分支、MCDC)至少執(zhí)行一次。這里,將被修改點的相關(guān)節(jié)點定義為被修改點的后繼語句(或表達式),并且修改點到這些相關(guān)節(jié)點都是可達的。以下結(jié)合附圖,對本發(fā)明提出的測試用例集合優(yōu)化策略在軟件回歸測試實施例中的應(yīng)用進行解釋和說明。圖2為本發(fā)明單元回歸測試用例集優(yōu)化策略的應(yīng)用流程示意圖。如圖2所示,該方法主要包括
      步驟A、對比被測單元修改前后的控制流圖,找出代碼中被修改部分所對應(yīng)的節(jié)點,該節(jié)點簡稱為修改點。若要找到被修改語句,就要比較被修改前后的代碼。本發(fā)明采用基于控制流圖的比較方法。這里所使用的控制流圖不僅包含程序控制結(jié)構(gòu)的信息,同時也將每個節(jié)點對應(yīng)的語句(或表達式)信息一一記錄下來。在對兩個控制流圖進行比較時,使用深度優(yōu)先搜索算法進行遍歷并采用節(jié)點“成對比較”的方式,即分別從兩個控制流圖的入口節(jié)點開始遍歷,并成對比較其對應(yīng)的抽象語法樹信息是否相同(變量、常量、運算符)。當抽象語法樹信息不同的節(jié)點時,將其加入到修改點集合中。該方法具體包括如下步驟
      Al、備份代碼修改前的控制流圖CFG1,并生成代碼修改后的控制流圖CFG2。被測單元在單元測試過程中,通過靜態(tài)分析獲得了對應(yīng)的抽象語法樹。由抽象語法樹,進一步獲得對應(yīng)的控制流圖。因此,控制流圖的節(jié)點包含了代碼對應(yīng)的表達式信息。為避免在代碼修改后由于重新進行靜態(tài)分析,而導(dǎo)致原控制流圖丟失,需要將代碼修改前的控制流圖進行備份,記為CFGl。當確認代碼修改完成時,系統(tǒng)對新代碼重新進行靜態(tài)分析,得到新的控制流圖,記為CFG2。此時,被測單元一共有兩個控制流圖,一個是單元測試時的控制流圖CFG1,另一個是開發(fā)人員對代碼進行修改后的控制流圖CFG2。這兩個控制流圖完整的保存了代碼修改前后的程序結(jié)構(gòu)與代碼信息。A2、使用深度優(yōu)先搜索算法同時遍歷控制流圖CFGl和CFG2。在遍歷的過程中成對地對比當前遍歷到的控制流圖節(jié)點;若其包含的抽象語法樹信息不同,則把它當作修改點,加入到修改點集合當中。同時考慮了節(jié)點的增加和刪減情況,并作了相應(yīng)處理。其具體步驟如下
      A21、根據(jù)控制流圖產(chǎn)生時的節(jié)點序號順序,分別取CFGl和CFG2的未訪問過的后繼節(jié)點作為當前節(jié)點對,并取當前節(jié)點對中CFG2的節(jié)點作為當前節(jié)點。A22、若當前節(jié)點對為空,當父節(jié)點是函數(shù)入口節(jié)點時,遍歷結(jié)束,否則回退到當前節(jié)點對的父節(jié)點,執(zhí)行步驟A21 ;
      A23、若當前節(jié)點對中的兩個節(jié)點都不為空,則比較當前節(jié)點對中每個節(jié)點包含的抽象語法樹信息,即對應(yīng)的表達式中的常量、變量、運算符信息,若這些信息都相同則執(zhí)行步驟A21 ;若不同,則當前節(jié)點為修改點,加入到修改點集合當中。如果當前節(jié)點對中CFGl的節(jié)點為空,CFG2的節(jié)點不為空,則說明CFG2的節(jié)點是修改后新增的,將CFG2非空節(jié)點的父節(jié)點作為修改點,加入到修改點集合當中。如果CFGl的節(jié)點不為空而CFG2的節(jié)點為空,則說明CFGl中對應(yīng)的代碼已被刪除,把CFGl中被刪除的節(jié)點作為修改點,加入到修改點集合當中。下面本發(fā)明結(jié)合具體實例對本發(fā)明做進一步說明。對于下面的源程序test, c中的函數(shù)f,在被修改前建立的初始控制流圖如附圖3,圖中的節(jié)點與源程序中行號的對應(yīng)關(guān)系如表I所示,其中節(jié)點名字的最后一個數(shù)字標識了產(chǎn)生的順序號,邊上標識的最后一個數(shù)字標識了該邊產(chǎn)生的順序號,以“T”開頭表示為條件表達式的真分支,以“F”開頭則表示為假分支。函數(shù)f的單元測試用例庫如表2所示,其中包含了每個測試用例的執(zhí)行路徑信息(注路徑節(jié)點不包含終結(jié)符節(jié)點,如if_out、func_out)。/#
      * 一元二次方程test, c */
      I: ^include〈stdio. h〉
      2: int f (int a, int b,int c) {
      3:int mid 二 b氺b_4氺a氺c;
      4:if (mid> 0)
      5:printf (〃two real roots \n ;
      6:elsei f (mi d==~3)
      7:print f (,,one real root\n〃);
      8:else
      9:print f (〃two complex roots\n〃);
      10 :return mid ;
      11: I
      權(quán)利要求
      1.基于控制流圖的單元回歸測試用例集合優(yōu)化方法,其特征在于,該方法包括 A、對比被測單元修改前后的控制流圖,找出代碼中被修改的部分對應(yīng)的節(jié)點,即修改占. B、從單元測試用例集合中篩選出執(zhí)行路徑經(jīng)過修改點的測試用例,作為回歸測試用例集合的一部分,記作選擇測試用例集Tselected,并運行集合中的所有測試用例; C、計算修改點的所有可達后繼節(jié)點,從中選出在步驟B的運行過程中未被覆蓋的節(jié)點子集 D、若節(jié)點子集#為空,則執(zhí)行步驟F,否則執(zhí)行步驟E; E、從節(jié)點子集#中取出一個節(jié)點作為覆蓋目標生成測試用例,將其加入到新增測試用例集合Tnev并運行;待運行完畢后,更新節(jié)點子集見從中刪除在此次運行中已被覆蓋的節(jié)點,返回步驟D ; F、回歸測試用例集合Tk構(gòu)造完畢,Tr
      2.根據(jù)權(quán)利要求I所述的基于控制流圖的單元回歸測試用例集合優(yōu)化方法,其特征在于,所述步驟A中根據(jù)對比控制流圖的方法找出修改點的具體過程為 Al、在代碼被修改前,將其對應(yīng)的控制流圖備份,記為CFGl ;代碼被修改后,對被測單元重新進行靜態(tài)分析,生成控制流圖,記為CFG2 ;控制流圖的節(jié)點包含對應(yīng)的抽象語法樹信息; A2、使用深度優(yōu)先搜索算法同時遍歷控制流圖CFGl和CFG2 ;在遍歷過程中成對地對比當前遍歷到的控制流圖節(jié)點;若其包含的抽象語法樹信息不同,則把它當作修改點,加入到修改點集合當中。
      3.根據(jù)權(quán)利要求2所述基于控制流圖的單元回歸測試用例集合優(yōu)化方法,其特征在于,步驟A2中使用深度優(yōu)先搜索算法同時遍歷控制流圖CFGl和CFG2,對比當前節(jié)點對的抽象語法樹信息;同時還考慮節(jié)點的增加和刪減情況,并作了相應(yīng)處理;其具體過程如下 A21、根據(jù)控制流圖產(chǎn)生時的節(jié)點序號順序,分別取CFGl和CFG2的未訪問過的后繼節(jié)點作為當前節(jié)點對,并取當前節(jié)點對中CFG2的節(jié)點作為當前節(jié)點; A22、若當前節(jié)點對為空,當父節(jié)點是函數(shù)入口節(jié)點時,遍歷結(jié)束,否則回退到當前節(jié)點對的父節(jié)點,執(zhí)行步驟A21 ; A23、若當前節(jié)點對中的兩個節(jié)點都不為空,則比較當前節(jié)點對中每個節(jié)點包含的抽象語法樹信息,即對應(yīng)的表達式中的常量、變量、運算符信息,若這些信息都相同則執(zhí)行步驟A21 ;若不同,則執(zhí)行步驟A24; A24、將當前節(jié)點作為修改點,加入到修改點集合當中;如果當前節(jié)點對中CFGl的節(jié)點為空,CFG2的節(jié)點不為空,則說明CFG2的節(jié)點是修改后新增的,此時將CFG2非空節(jié)點的父節(jié)點作為修改點,加入到修改點集合當中;如果CFGl的節(jié)點不為空而CFG2的節(jié)點為空,則說明CFGl中對應(yīng)的代碼已被刪除,把CFGl中被刪除的節(jié)點作為修改點,加入到修改點集合中。
      4.根據(jù)權(quán)利要求I所述的基于控制流圖的單元回歸測試用例集合優(yōu)化方法,其特征在于,步驟B中在單元測試過程中使用的測試用例,均以控制流圖節(jié)點標號的形式將執(zhí)行路徑記錄于數(shù)據(jù)庫中;遍歷測試用例數(shù)據(jù)庫中的每個測試用例,若其執(zhí)行路徑的標號序列中包含了修改點集合中任一修改點的標號,則被選擇為回歸測試用例,加入到選擇測試用例集 Tselected 并執(zhí)行。
      5.根據(jù)權(quán)利要求I所述的基于控制流圖的單元回歸測試用例集合優(yōu)化方法,其特征在于,步驟C中,從覆蓋率角度考慮為回歸測試添加新的測試用例;具體為首先,計算出修改點在控制流圖中的所有可達后繼節(jié)點;然后,從此節(jié)點集合中選出在步驟B的運行過程中沒有被覆蓋到的節(jié)點,作為需要在回歸測試中被覆蓋的目標節(jié)點集合見
      6.根據(jù)權(quán)利要求I所述的基于控制流圖的單元回歸測試用例集合優(yōu)化方法,其特征在于,步驟E中,以節(jié)點集合#中的節(jié)點為覆蓋目標,進行區(qū)間運算,生成滿足覆蓋條件的測試用例,并運行;同時,更新節(jié)點集合見從中刪除在本次運行過程中已覆蓋到的節(jié)點。
      7.根據(jù)權(quán)利要求I所述的基于控制流圖的單元回歸測試用例集合優(yōu)化方法,其特征在于,步驟F中,該回歸測試用例集合Tr由兩部分構(gòu)成選擇測試用例集和新增測試用例集合Tner,即
      全文摘要
      本發(fā)明公開了一種基于控制流圖的單元回歸測試用例集合優(yōu)化方法,包括A、在被測單元修改前后的控制流圖中找出被修改部分對應(yīng)的修改點;B、篩選出執(zhí)行路徑經(jīng)過修改點的測試用例,作為回歸測試用例集合的一部分即選擇測試用例集Tselected,運行集合中的所有測試用例;C、計算修改點的所有可達后繼節(jié)點,選出步驟B運行過程中未被覆蓋的節(jié)點子集N;D、若N為空,執(zhí)行步驟F,否則執(zhí)行步驟E;E、從N中取出一個節(jié)點作為覆蓋目標生成測試用例,將其加入新增測試用例集合Tnew并運行完畢,更新N,刪除在此次運行中已被覆蓋的節(jié)點,返回步驟D;F、回歸測試用例集合TR構(gòu)造完畢。應(yīng)用本發(fā)明,能夠提高回歸測試的效率,并保證回歸測試的有效性與充分性。
      文檔編號G06F11/36GK102915271SQ201210426628
      公開日2013年2月6日 申請日期2012年10月31日 優(yōu)先權(quán)日2012年10月31日
      發(fā)明者宮云戰(zhàn), 王雅文, 黃俊飛, 金大海, 蔡敏 申請人:北京郵電大學(xué)
      網(wǎng)友詢問留言 已有0條留言
      • 還沒有人留言評論。精彩留言會獲得點贊!
      1