夏同飛,鄭 浩
(1. 國(guó)網(wǎng)信通產(chǎn)業(yè)集團(tuán)安徽繼遠(yuǎn)軟件有限公司,安徽 合肥 230088; 2. 國(guó)網(wǎng)安徽省電力公司,安徽 合肥 230061)
?
大型軟件回歸測(cè)試用例選擇優(yōu)化策略
夏同飛1,鄭浩2
(1. 國(guó)網(wǎng)信通產(chǎn)業(yè)集團(tuán)安徽繼遠(yuǎn)軟件有限公司,安徽 合肥 230088; 2. 國(guó)網(wǎng)安徽省電力公司,安徽 合肥 230061)
摘要:在軟件回歸測(cè)試時(shí)需要制定測(cè)試策略,選擇有效測(cè)試用例進(jìn)行測(cè)試以避免測(cè)試的盲目性. 針對(duì)大型軟件回歸測(cè)試用例的選擇問(wèn)題本文提出一種新的選擇方法并對(duì)其進(jìn)行算法設(shè)計(jì)和實(shí)現(xiàn). 本文運(yùn)用Uml用例圖來(lái)描述系統(tǒng)功能模塊間的關(guān)系,將UML圖轉(zhuǎn)換為有向圖并通過(guò)有向圖的遍歷算法輸出回歸測(cè)試時(shí)需要測(cè)試的模塊. 通過(guò)實(shí)例研究表明,運(yùn)用此方法能夠顯著提高回歸測(cè)試中測(cè)試的效率和準(zhǔn)確性,在保證了回歸測(cè)試覆蓋度的同時(shí)減少了測(cè)試的冗余度.
關(guān)鍵詞:回歸測(cè)試; 測(cè)試用例; UML用例圖; 軟件測(cè)試; 黑盒測(cè)試
在軟件研發(fā)過(guò)程中設(shè)計(jì)人員通過(guò)架構(gòu)設(shè)計(jì)將軟件系統(tǒng)分割為多個(gè)功能模塊,但由于需求變更或缺陷修復(fù)經(jīng)常要對(duì)某些代碼進(jìn)行修改,而大型軟件有多個(gè)功能,它們之間有各種關(guān)聯(lián)關(guān)系,僅僅測(cè)試修改的模塊是不夠的,需要進(jìn)行所謂的回歸測(cè)試. 回歸測(cè)試是指修改了舊代碼后,重新進(jìn)行測(cè)試以確認(rèn)修改沒(méi)有引入新的錯(cuò)誤或?qū)е缕渌a產(chǎn)生錯(cuò)誤[1]. 回歸測(cè)試在整個(gè)軟件測(cè)試過(guò)程中占有很大的工作量比重,軟件開(kāi)發(fā)的各個(gè)階段都會(huì)進(jìn)行多次回歸測(cè)試. 據(jù)估計(jì),回歸測(cè)試在整個(gè)測(cè)試預(yù)算中占80%,在軟件維護(hù)中占50%[2]. 如果對(duì)回歸測(cè)試用例不做選擇與優(yōu)化將給軟件測(cè)試工作帶來(lái)大量重復(fù)無(wú)效的工作,影響測(cè)試人員工作興趣與發(fā)現(xiàn)問(wèn)題的敏感度. 在漸進(jìn)和快速迭代開(kāi)發(fā)中,新版本的連續(xù)發(fā)布使回歸測(cè)試進(jìn)行的更加頻繁,而在極限編程開(kāi)發(fā)模式下,更是要求每天都進(jìn)行若干次回歸測(cè)試[3]. 因此,通過(guò)選擇正確的回歸測(cè)試策略來(lái)提高回歸測(cè)試的速度和有效性是非常有意義的.
回歸測(cè)試的目的一是要對(duì)新修改的部分增加測(cè)試用例重新測(cè)試,二是測(cè)試其他模塊是否會(huì)受到影響. 在回歸測(cè)試開(kāi)始前測(cè)試人員一般已有一個(gè)用例庫(kù),對(duì)于大型軟件模塊眾多,每次回歸測(cè)試執(zhí)行所有模塊測(cè)試用例是沒(méi)有必要也不現(xiàn)實(shí)的. 而憑個(gè)人經(jīng)驗(yàn)選擇需要測(cè)試的模塊又是不夠科學(xué)可靠的. 此外測(cè)試人員一般無(wú)法得到軟件代碼,即使能得到,通過(guò)分析代碼來(lái)確定模塊間關(guān)系也需要大量時(shí)間,無(wú)法滿(mǎn)足快速回歸的要求. 需要有個(gè)簡(jiǎn)單而精準(zhǔn)的方法找出修改模塊會(huì)受到影響的模塊進(jìn)行測(cè)試. 本文介紹的重點(diǎn)內(nèi)容即是通過(guò)算法自動(dòng)在大量的模塊中選擇有影響有關(guān)聯(lián)的模塊來(lái)幫助測(cè)試人員選擇回歸測(cè)試用例.
1基于模塊關(guān)系的回歸測(cè)試選擇方案
由于在快速迭代的回歸測(cè)試過(guò)程中,大型軟件代碼龐大復(fù)雜,測(cè)試人員沒(méi)有精力從代碼級(jí)別研究修改帶來(lái)的影響,有研究人員給出了基于模型的影響分析方法[4-7],這些方法跟蹤模型各元素間的依賴(lài)關(guān)系來(lái)給出修改影響分析而不需要接觸源代碼,給我們一定的啟發(fā).
模塊間相互關(guān)聯(lián)往往是因?yàn)楣灿觅Y源(資源可以是數(shù)據(jù)表,文件、 流向多個(gè)模塊的數(shù)據(jù)等)或彼此的相互調(diào)用子模塊造成的. 而有時(shí)模塊修改造成的影響是要通過(guò)多個(gè)模塊的傳遞才會(huì)影響到另一模塊. 對(duì)于大型軟件可能模塊眾多,關(guān)聯(lián)模塊路徑較長(zhǎng),測(cè)試者在回歸測(cè)試過(guò)程中沒(méi)有太多時(shí)間研究所有關(guān)聯(lián)模塊,我們可以引入自動(dòng)搜索功能來(lái)自動(dòng)增加需要測(cè)試的關(guān)聯(lián)模塊. 對(duì)于這種分析多個(gè)元素相互聯(lián)系方式的問(wèn)題我們應(yīng)該使用圖結(jié)構(gòu)來(lái)解決[8].
圖1 關(guān)聯(lián)規(guī)則示例Fig.1 The example of correlations rule
測(cè)試人員在軟件設(shè)計(jì)時(shí)期可以得到軟件架構(gòu)設(shè)計(jì)文檔,并且有充分的時(shí)間做產(chǎn)品分析,因此可以在此期間詳細(xì)畫(huà)出各模塊間的關(guān)聯(lián)關(guān)系圖,基于各模塊測(cè)試人員應(yīng)該一起進(jìn)行討論,貢獻(xiàn)自己了解的那一部分,共同完成該系統(tǒng)的各功能模塊的關(guān)聯(lián)關(guān)系圖[8],如圖1 所示. 當(dāng)測(cè)試開(kāi)始后測(cè)試工作進(jìn)度緊張,測(cè)試人員可能在回歸測(cè)試時(shí)沒(méi)有時(shí)間研究規(guī)模龐大的模塊關(guān)聯(lián)圖,此時(shí)應(yīng)該使用計(jì)算機(jī)程序算法將圖形化的模塊關(guān)聯(lián)關(guān)系抽取出來(lái),針對(duì)某一模塊的改動(dòng)自動(dòng)搜索出有影響的模塊. 隨著測(cè)試工作的深入,測(cè)試人員對(duì)大型軟件越來(lái)越熟悉,每輪測(cè)試后應(yīng)該對(duì)關(guān)聯(lián)關(guān)系圖進(jìn)行更新和修正,以確保測(cè)試的準(zhǔn)確性[9].
1.1解決方案基本思路
通過(guò)有向圖的結(jié)構(gòu)來(lái)確定各功能模塊的關(guān)系,當(dāng)一個(gè)模塊發(fā)生變化時(shí)利用有向圖深度優(yōu)先遍歷的算法搜索有關(guān)聯(lián)的模塊來(lái)確定需要測(cè)試的其他模塊. 首先需要引入工具能形象快捷地畫(huà)出各功能模塊之間的關(guān)聯(lián)關(guān)系,然后從圖形文件中檢索出關(guān)系結(jié)構(gòu),形成可供算法處理的數(shù)據(jù)結(jié)構(gòu),最后當(dāng)某一功能節(jié)點(diǎn)變更后通過(guò)算法輸出所有有關(guān)聯(lián)的模塊,相應(yīng)增加關(guān)聯(lián)模塊的測(cè)試優(yōu)先級(jí),避免遺漏.
1.2工具選擇
很多研究人員做了通過(guò)UML圖模型自動(dòng)生成測(cè)試用例的研究[10-13],這對(duì)解決這一問(wèn)題提供了思路. 在軟件工程中通常用UML來(lái)進(jìn)行建模,而UML用例圖和測(cè)試用例有一定對(duì)應(yīng)關(guān)系,可以通過(guò)UML的用例圖來(lái)實(shí)現(xiàn)測(cè)試用例對(duì)應(yīng)需求模塊的圖形關(guān)系. 使用UML圖中的用例圖清晰指明各功能模塊的關(guān)聯(lián)關(guān)系,可以把這些功能模塊作為圖的頂點(diǎn),關(guān)聯(lián)關(guān)系作為圖的邊,圖的頂點(diǎn)與測(cè)試用例所覆蓋需求名稱(chēng)對(duì)應(yīng). Rational rose 工具作為業(yè)內(nèi)通用UML工具且生成的MDL文件為明文形式很方便我們通過(guò)程序進(jìn)行分析[10].
規(guī)則定義: 在用例圖中模塊之間關(guān)系相連,會(huì)相互影響,而影響也會(huì)傳導(dǎo),一個(gè)模塊修改后通過(guò)關(guān)系傳導(dǎo)會(huì)影響到多個(gè)模塊. 我們要通過(guò)圖結(jié)構(gòu)的算法在錯(cuò)綜復(fù)雜的關(guān)系中把修改一個(gè)模塊所有受影響的模塊全部搜索出來(lái). 因此首先做如下約定.
約定一:由于共用資源(包括數(shù)據(jù)表,文件等)是產(chǎn)生模塊關(guān)聯(lián)的重要元素,所以必須在用例圖中畫(huà)出,對(duì)于如“更新數(shù)據(jù)庫(kù)”等模塊應(yīng)該有一條指向數(shù)據(jù)文件的關(guān)系,而對(duì)于“查詢(xún)數(shù)據(jù)庫(kù)”之類(lèi)獲取信息的模塊應(yīng)該有一條關(guān)系從數(shù)據(jù)庫(kù)/數(shù)據(jù)文件指向查詢(xún)模塊,以表示信息傳遞. 其他規(guī)則與UML用例圖相同.
約定二:通過(guò)模塊間的分解包含關(guān)系可生成一張多頂點(diǎn)的有向圖,其中模塊為頂點(diǎn),關(guān)系為弧. 當(dāng)一個(gè)模塊修改后對(duì)于該模塊通過(guò)關(guān)系弧能到達(dá)的所有模塊稱(chēng)為該模塊的直接影響模塊組.
約定三:對(duì)于修改模塊和其直接影響模塊組以外的模塊在圖中做深度優(yōu)先遍歷,如果能到達(dá)修改模塊或直接影響模塊組中的模塊則這些模塊為間接受影響模塊.
通過(guò)找出所有直接影響模塊組和所有間接影響模塊組可以確定回歸測(cè)試需要測(cè)試的模塊,從而根據(jù)實(shí)際情況選擇回歸測(cè)試用例以達(dá)到優(yōu)化.
1.3操作步驟實(shí)例解析
以一個(gè)超市進(jìn)貨管理系統(tǒng)來(lái)說(shuō)明操作方法.
1) 用例圖描述:圖2 所示用例圖為該系統(tǒng)的部分用例圖,分為3個(gè)角色:商品管理員,收銀員,系統(tǒng)管理員. 商品管理員負(fù)責(zé)貨品的管理,可以添加、 修改貨品并將數(shù)據(jù)存入貨品數(shù)據(jù)庫(kù),還可以查詢(xún)存入的貨品; 收銀員給客戶(hù)結(jié)賬的時(shí)候系統(tǒng)會(huì)更新柜臺(tái)商品數(shù)據(jù)庫(kù); 當(dāng)貨品缺貨時(shí)收銀員可以選擇庫(kù)存的貨品上架,貨品上架后,貨品數(shù)據(jù)庫(kù)減少一條記錄,柜臺(tái)數(shù)據(jù)庫(kù)增加一條數(shù)據(jù).
圖2 系統(tǒng)UML圖實(shí)例Fig.2 UML use-case diagram
2) MDL文件解析: 數(shù)據(jù)結(jié)構(gòu)中,圖必須有頂點(diǎn)和頂點(diǎn)間的弧,只有確定這兩個(gè)要素才能運(yùn)用到具體的算法中. 業(yè)界通用的UML工具rational rose當(dāng)狀態(tài)圖畫(huà)畫(huà)好之后會(huì)存儲(chǔ)在一個(gè)MDL文件中,通過(guò)文本形式打開(kāi)MDL文件,可以看到圖3所示的usecase節(jié)點(diǎn)結(jié)構(gòu). 這些Object UseCase 是需求細(xì)分模塊,可以作為有向圖的頂點(diǎn). 圖4為MDL文件中用例間的關(guān)聯(lián)關(guān)系結(jié)構(gòu)截圖,顯示了源點(diǎn)和終點(diǎn)可以作為有向圖的弧可以作為圖結(jié)構(gòu)的弧. 從文件內(nèi)容得出,可以通過(guò)編寫(xiě)程序讀取MDL文件中的內(nèi)容并存儲(chǔ)到圖結(jié)構(gòu)的頂點(diǎn)和弧中來(lái)確定UML圖的算法模型. 通過(guò)這種精確的方法可以在回歸測(cè)試開(kāi)始時(shí)清晰地分析出受影響的模塊和不受影響的模塊. 一方面避免漏測(cè)某些隱藏較深的關(guān)聯(lián)模塊,另一方面避免測(cè)試的盲目性,簡(jiǎn)化測(cè)試用例規(guī)模,能夠加快回歸測(cè)試效率,提高測(cè)試覆蓋度,滿(mǎn)足大型軟件迭代開(kāi)發(fā)和長(zhǎng)期頻繁維護(hù)升級(jí)的快速響應(yīng)需要.
圖3 MDL文件Usecese結(jié)構(gòu)Fig.3 The Usecase struct in MDL file
圖4 MDL文件關(guān)聯(lián)關(guān)系結(jié)構(gòu)Fig.4 The association struct in MDL file
3) 針對(duì)修改模塊找出關(guān)聯(lián)模塊:當(dāng)系統(tǒng)部分需求發(fā)生變化時(shí),除了要測(cè)試變化的模塊還需要同時(shí)測(cè)試關(guān)聯(lián)模塊.
4) 最后在制定測(cè)試策略時(shí)選擇覆蓋這些需求功能的用例來(lái)進(jìn)行回歸測(cè)試.
1.4實(shí)際驗(yàn)證
為了驗(yàn)證思路的正確性,通過(guò)一個(gè)軟件研發(fā)中常見(jiàn)的情況予以說(shuō)明.
1) 為了適應(yīng)用戶(hù)需求,系統(tǒng)的“新增貨品”模塊發(fā)生變更,增加了物品信息字段.
2) 測(cè)試人員通過(guò)本方法進(jìn)行用例選擇. 首先通過(guò)深度優(yōu)先遍歷找出有直接影響的模塊,分別是:“填寫(xiě)貨物信息”,“存入貨品數(shù)據(jù)庫(kù)”,“ 貨品數(shù)據(jù)庫(kù)”,“ 查詢(xún)貨品數(shù)據(jù)庫(kù)”. 然后找出有間接影響的模塊,方法是遍歷所有模塊頂點(diǎn),如果與這些模塊存在路徑則標(biāo)記為有間接影響的模塊. 在本實(shí)例中有以下模塊被間接影響:“進(jìn)貨管理”,“修改貨品”,“更新貨品信息”,“存入貨品數(shù)據(jù)庫(kù)”,“貨品查詢(xún)”,“顯示貨品信息”,“上架管理”,“顯示庫(kù)存信息”,“上架”,“刪除貨品數(shù)據(jù)庫(kù)中的上架貨品”.
3) 結(jié)果分析:當(dāng)增加了物品信息字段,會(huì)對(duì)貨品數(shù)據(jù)庫(kù)結(jié)構(gòu)產(chǎn)生直接影響,增、 刪、 改、 查數(shù)據(jù)都需要做相應(yīng)修改,因此用到這些功能的模塊都需要測(cè)試,分析以上列出的直接影響和模塊都涉及到了貨品數(shù)據(jù)庫(kù),是正確的. 而“選擇貨品”,“更新柜臺(tái)商品”,“結(jié)賬”,“缺陷管理”等模塊與新增貨品沒(méi)有聯(lián)系,不需要測(cè)試,步驟中也沒(méi)有列出. 因此思路是正確的.
4) 如果不用此方法選擇測(cè)試用例,可能會(huì)出現(xiàn)以下情況: ① 測(cè)試人員只選擇貨品數(shù)據(jù)庫(kù)直接關(guān)聯(lián)的“進(jìn)貨管理模塊”用例進(jìn)行測(cè)試,而對(duì)“顯示庫(kù)存信息”,“上架”等受間接影響??斓臏y(cè)試則可能會(huì)遺漏,產(chǎn)生測(cè)試隱患. 而實(shí)際上貨品數(shù)據(jù)庫(kù)字段改變會(huì)影響所有查詢(xún)、 顯示該數(shù)據(jù)庫(kù)信息的模塊. ② 選擇所有模塊用例進(jìn)行回歸. 這樣會(huì)把一些沒(méi)有影響的模塊也測(cè)試了,不但不能發(fā)現(xiàn)問(wèn)題而且還影響了測(cè)試響應(yīng)速度. ③ 分析所有模塊源代碼來(lái)選擇測(cè)試用例,這將耗費(fèi)大量時(shí)間與精力,這種方法在大型軟件快速回歸測(cè)試中是不現(xiàn)實(shí)的.
2策略實(shí)現(xiàn)
本文中的策略主要是通過(guò)圖的深度優(yōu)先算法來(lái)實(shí)現(xiàn),因此首先要?jiǎng)?chuàng)建圖的數(shù)據(jù)結(jié)構(gòu).
2.1數(shù)據(jù)結(jié)構(gòu)
按照計(jì)算機(jī)基礎(chǔ)課程數(shù)據(jù)結(jié)構(gòu)中有向圖的十字鏈表結(jié)構(gòu)來(lái)實(shí)現(xiàn)策略,本文用Java語(yǔ)言描述
算法 1數(shù)據(jù)結(jié)構(gòu)
2.2圖的創(chuàng)建方法
算法 2圖的創(chuàng)建
2.3根據(jù)系統(tǒng)變化情況輸出有直接影響的模塊
算法 3輸出直接影響的模塊
2.4輸出受變化功能模塊間接影響的功能模塊
算法 4輸出間接影響的模塊
3結(jié)束語(yǔ)
本文通過(guò)UML圖,理清了軟件各模塊的直接關(guān)系,研究了通過(guò)圖的遍歷算法輸出修改一個(gè)模塊可能會(huì)影響到的其他模塊. 通過(guò)這個(gè)策略?xún)?yōu)化回歸測(cè)試用例選擇方法,提高測(cè)試準(zhǔn)確性,避免測(cè)試漏測(cè)失誤. 加快測(cè)試速度以適應(yīng)快速多版本迭代的開(kāi)發(fā)模式.
參考文獻(xiàn):
[1]Muccini H, Dias M, Richardson D. Towards software architecture-based regression testing[J]. ACM SIGSOFT Software Engineering Notes, 2005, 30(4): 1-7.
[2]Harrold M J. Reduce, reuse, recycle, recover: techniques for improved regression testing[C]. Proceedings of the IEEE International Conference on Software Maintenance. Netherlands: IEEE, 2009: 5.
[3]李丹,劉杰. 軟件回歸測(cè)試及其實(shí)踐[J]. 電子產(chǎn)品可靠性與環(huán)境試驗(yàn),2001,2(6): 23-25.
Li Dan, Liu Jie. Software regression testing and its application[J]. Electronic Product Reliability and Enviromental Test, 2001, 2(6): 23-25. (in Chinese)
[4]Briand L C, Labiche Y, Sullivan L O. Impact analysis and change management of UML models[C]. International Conference on Software Maintenance. Netherlands: IEEE, 2003: 256-265.
[5]Briand L C, Labiche Y, Sullivan L O, et al. Automated impact analysis of UML models[J]. Journal of Systems and Software, 2006, 79(3): 339-352.
[6]Tang P H. Design based change impact modeling for object-oriented software[D]. New York: State University of New York, 2003.
[7]王映輝,王立福. 軟件體系結(jié)構(gòu)演化模型[J]. 電子學(xué)報(bào),2005, 3(8): 1381-1386.
Wang Yinghui, Wang Lifu. Research about model and ripple effect analysis of software architecture evolution[J]. Journal of Electronics, 2005, 3(8):1381-1386. (in Chinese)
[8]羅文兵,趙亮,趙洪宇. 基于圖分析的測(cè)試用例集優(yōu)化[J]. 計(jì)算機(jī)工程,2010,15(36): 92-96.
Luo Wenbing, Zhao Liang, Zhao Hongyu. Test suite optimization based on graph analysis[J]. Computer Engineering, 2010, 15(36): 92-96. (in Chinese)
[9]李寧,李戰(zhàn)懷. 基于黑盒測(cè)試的軟件測(cè)試策略研究與實(shí)踐[J]. 計(jì)算機(jī)應(yīng)用研究,2009,3(26): 923-926.
Li Ning, Li Zhanhuai. Research and practice of software test policies based on black box testing[J]. Application Research of Computers, 2009,3(26): 923-926. (in Chinese)
[10]張毅坤,施鳳鳴. 從Rose的規(guī)約文件自動(dòng)生成測(cè)試用例[J]. 計(jì)算機(jī)應(yīng)用,2003,12(23): 12-16.
Zhang Yikun, Shi Fengming. Automatic test cases generation from rational rose specification files[J].Computer Applications, 2003, 12(23): 12-16. (in Chinese)
[11]蘇翠翠,王曉軍. 基于UML活動(dòng)圖的測(cè)試用例生成方法研究[J]. 計(jì)算機(jī)技術(shù)與發(fā)展,2010,8(20): 49-51.
Su Cuicui, Wang Xiaojun. Research on automatic generating test cases method based on UML activity diagram[J]. Computer Technology and Development, 2010, 8(20): 49-51. (in Chinese)
[12]蔡素梅,梅登華. 基于動(dòng)態(tài)切片和UML圖的回歸測(cè)試用例生成[J]. 計(jì)算機(jī)工程, 2009, 8(35): 70-72.
Cai Sumei, Mei Denghua. Regression test case generation based on dynamic slicing and UML diagram[J].Computer Engineering, 2009, 8(35): 70-72. (in Chinese)
[13]葉皚,蘇厚勤. 基于UML活動(dòng)圖的系統(tǒng)測(cè)試方法研究[J]. 計(jì)算機(jī)應(yīng)用與軟件, 2010, 12(27): 132-134.
Ye Ai, Su Houqin. Study on UML activity diagram-based system testing method[J].Computer Applications and Software, 2010, 12(27): 132-134. (in Chinese)
Regression Test Case Selection Stratege for Large Scale Software
XIA Tongfei1, ZHENG Hao2
(1. Anhui Jiyuan Software Co. Ltd., State Grid Information & Telecommunication Group, Hefei 230088, China;2. State Grid Anhui Electric Power Company, Hefei 230061, China)
Abstract:It is necessary to make the test strategy in software regression test and the effective test case can avoid the blindness of the test.,In order to solve the problem of how to choose valid regression test cases for large scale software, a new selection method and the algorithm design for this method were proposed in this paper. In this method,UML use-case diagram was used to describe correlations among modules of software system.After converting the UML diagram to directed graph, the modules which need to be tested will be output by using traversing graph algorithm during regression testing.It is validated through a case study that this method can improve the efficiency and accuracy of testing ,and avoid redundancy test case selection and keep the high testing coverage.
Key words:regression testing; test case; UML use-case diagrams; software tetsing; black box testing
中圖分類(lèi)號(hào):TP311
文獻(xiàn)標(biāo)識(shí)碼:A
doi:10.3969/j.issn.1671-7449.2016.02.003
作者簡(jiǎn)介:夏同飛(1979-),男,工程師,主要從事軟件項(xiàng)目管理、 軟件測(cè)試的研究.
基金項(xiàng)目:國(guó)家電網(wǎng)公司科技資助項(xiàng)目(2014-06-487-S)
收稿日期:2015-07-12
文章編號(hào):1671-7449(2016)02-0106-08