本發(fā)明涉及計算機(jī)領(lǐng)域,特別涉及一種運行測試用例的方法和裝置。
背景技術(shù):
當(dāng)前,開發(fā)人員在開發(fā)出一套軟件之后,為了找出開發(fā)出的軟件所潛在存在的問題,往往需要使用測試用例對開發(fā)出的軟件進(jìn)行測試。
相關(guān)技術(shù)在使用測試用例進(jìn)行測試的過程中,會將測試用例集合按照用例數(shù)目等分成幾份,但這樣可能會出現(xiàn)某一份測試用例的運行時間相對于另一份測試用例的運行時間過長,從而導(dǎo)致整個測試用例集合的運行時間過長。
技術(shù)實現(xiàn)要素:
本發(fā)明實施例提供了一種運行測試用例的方法和裝置,以縮短測試用例集合的運行時間。
一方面,提供一種運行測試用例的方法,所述方法包括:
獲取測試用例集合中每個測試用例的運行時間;
根據(jù)獲取的每個測試用例的運行時間,為多個測試設(shè)備中的每個測試設(shè)備分配測試用例,使得所述多個測試設(shè)備中的每兩個測試設(shè)備之間運行各自所分配的測試用例的時間差值小于預(yù)設(shè)值;其中,分配給各個測試設(shè)備的測試用例的數(shù)目是相同或不相同的;
在各個測試設(shè)備上運行分配給該測試設(shè)備的測試用例。
可選地,在本發(fā)明的一個實施例中,所述獲取測試用例集合中每個測試用例的運行時間包括:
預(yù)先執(zhí)行各個測試用例以得到各個測試用例的XML(可擴(kuò)展標(biāo)記語言)文件;
利用正則表達(dá)式或XML庫解析所述XML文件,得到各個測試用例的運行時間。
可選地,在本發(fā)明的另一個實施例中,所述方法還包括:
在每個測試用例運行的過程中,實時地示出該測試用例的運行結(jié)果。
可選地,在本發(fā)明的另一個實施例中,所述方法還包括:
為所述測試用例集合中的測試用例分配運行優(yōu)先級;
所述在各個測試設(shè)備上運行分配給該測試設(shè)備的測試用例包括:
在各個測試設(shè)備上按照測試用例的運行優(yōu)先級從高到低的順序依次運行分配給該測試設(shè)備的測試用例。
可選地,在本發(fā)明的另一個實施例中,所述方法還包括:
在每個測試用例運行后,生成記錄該測試用例執(zhí)行情況的可擴(kuò)展標(biāo)記語音(Extensible Markup Language,XML)格式文件;
將每個測試用例對應(yīng)的XML格式文件進(jìn)行合并。
另一方面,提供一種運行測試用例的裝置,所述裝置包括:
獲取模塊,用于獲取測試用例集合中每個測試用例的運行時間;
分配模塊,用于根據(jù)獲取的每個測試用例的運行時間,為多個測試設(shè)備中的每個測試設(shè)備分配測試用例,使得所述多個測試設(shè)備中的每兩個測試設(shè)備之間運行各自所分配的測試用例的時間差值小于預(yù)設(shè)值;其中,分配給各個測試設(shè)備的測試用例的數(shù)目是相同或不相同的;
運行模塊,用于在各個測試設(shè)備上運行分配給該測試設(shè)備的測試用例。
可選地,在本發(fā)明的一個實施例中,所述獲取模塊具體用于:
預(yù)先執(zhí)行各個測試用例以得到各個測試用例的XML文件;
利用正則表達(dá)式或XML庫解析所述XML文件,得到各個測試用例的運行時間。
可選地,在本發(fā)明的另一個實施例中,所述裝置還包括:
顯示模塊,用于在每個測試用例運行的過程中,實時地示出該測試用例的運行結(jié)果。
可選地,在本發(fā)明的另一個實施例中,所述分配模塊還用于:
為所述測試用例集合中的測試用例分配運行優(yōu)先級;
相應(yīng)地,所述運行模塊具體用于:在各個測試設(shè)備上按照測試用例的運行優(yōu)先級從高到低的順序依次運行分配給該測試設(shè)備的測試用例。
可選地,在本發(fā)明的另一個實施例中,所述運行模塊還用于:在每個測試 用例運行后,生成記錄該測試用例執(zhí)行情況的XML格式文件;將每個測試用例對應(yīng)的XML格式文件進(jìn)行合并。
另一方面,提供一種終端設(shè)備,所述終端設(shè)備包括存儲器和處理器,所述存儲器上存儲有計算機(jī)程序,當(dāng)所述處理器執(zhí)行所述計算機(jī)程序時執(zhí)行本發(fā)明實施例中的任一種運行測試用例的方法。
其中,所述終端設(shè)備可以為手機(jī)、平板電腦、臺式電腦等。
另一方面,提供一種非臨時性存儲介質(zhì),所述非臨時性存儲介質(zhì)上存儲有計算機(jī)程序,當(dāng)所述計算機(jī)程序被處理器執(zhí)行時運行本發(fā)明實施例中的任一種運行測試用例的方法。
本發(fā)明實施例提供的運行測試用例的方法、運行測試用例的裝置、終端設(shè)備和非臨時性存儲介質(zhì),基于測試用例的運行時間來向各個測試設(shè)備分配測試用例,可以保證各個測試設(shè)備上運行的測試用例所花費的執(zhí)行時間大致相同,從而縮短了測試用例集合的運行時間。
附圖說明
為了更清楚地說明本發(fā)明實施例中的技術(shù)方案,下面將對實施例描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
圖1是本發(fā)明實施例提供的運行測試用例的方法的流程圖;
圖2是本發(fā)明實施例提供的運行測試用例的裝置的結(jié)構(gòu)框圖。
具體實施方式
為使本發(fā)明的目的、技術(shù)方案和優(yōu)點更加清楚,下面將結(jié)合附圖對本發(fā)明實施方式作進(jìn)一步地詳細(xì)描述。
圖1是本發(fā)明實施例提供的運行測試用例的方法的流程圖。參照圖1,本發(fā)明實施例提供的運行測試用例的方法可包括:
11、獲取測試用例集合中每個測試用例的運行時間。
本發(fā)明實施例中的“測試用例集合”由多個測試用例構(gòu)成,亦即,測試用例集合為多個測試用例的集合。
測試用例(Test Case)是為某個特殊目標(biāo)而編制的一組測試輸入、執(zhí)行條件以及預(yù)期結(jié)果的計算機(jī)代碼,以測試某個程序路徑或核實是否滿足某個特定需求。
本步驟11在執(zhí)行時可先獲取測試用例集合,然后再獲取其中每個測試用例的運行時間。當(dāng)然,在執(zhí)行時也可以不獲取測試用例集合,而是直接獲取每個測試用例的運行時間。
一種獲取測試用例集合及其中每個測試用例的運行時間的方式為:利用正則表達(dá)式獲取針對測試用例的方法名、包名和類名;根據(jù)獲取的所述方法名、所述包名和所述類名,確定測試用例集合;然后在執(zhí)行完測試用例得到對應(yīng)的XML文件之后,利用正則表達(dá)式解析得到的XML文件得到各個測試用例的運行時間。
另一種獲取測試用例集合及其中每個測試用例的運行時間的方式為:利用正則表達(dá)式獲取針對測試用例的方法名、包名和類名;根據(jù)獲取的所述方法名、所述包名和所述類名,確定測試用例集合;然后在執(zhí)行完測試用例得到對應(yīng)的XML文件之后,利用XML庫來解析得到的XML文件,從而得到測試用例集合中每個測試用例的運行時間。
在本發(fā)明實施例中,可通過小程序或小工具來獲取測試用例集合中每個測試用例的運行時間,例如可通過預(yù)先執(zhí)行測試用例集合中每個測試用例(執(zhí)行過程中會生成XML文件)來獲取每個測試用例的運行時間。當(dāng)然,在本發(fā)明實施例中,也可以直接在測試設(shè)備上預(yù)先運行一次測試用例集合中的測試用例(執(zhí)行過程中會生成XML文件)來獲取各個測試用例的執(zhí)行時間。
12、根據(jù)獲取的每個測試用例的運行時間,為多個測試設(shè)備中的每個測試設(shè)備分配測試用例,使得所述多個測試設(shè)備中的每兩個測試設(shè)備之間運行各自所分配的測試用例的時間差值小于預(yù)設(shè)值;其中,分配給各個測試設(shè)備的測試用例的數(shù)目是相同或不相同的;
在本發(fā)明實施例中,在得到每個測試用例的運行時間之后,即可根據(jù)各個測試用例的運行時間長短,差別化地將各個測試用例分配給測試設(shè)備,但需保證分配給各個測試設(shè)備執(zhí)行的所有測試用例的執(zhí)行時間大致相同,即,不能超出設(shè)定值。舉例而言,如果有3個測試設(shè)備,測試用例集合中總共有30個測試用例,利用本發(fā)明實施例提供的運行測試用例的方法,未必是為每個測試設(shè)備 分配10個測試用例,而是按照測試用例的執(zhí)行時間長短來分配測試用例,保證每個測試設(shè)備上運行測試用例所花費的時間相差不大。具體地,舉例而言,測試設(shè)備A可分配例如3個測試用例(例如,這3個測試用例中可存在至少一個測試用例的執(zhí)行時間較長),測試設(shè)備B可分配例如10個測試用例(例如,這10個測試用例的執(zhí)行時間可相對居中,即,既不太長也不太短),測試設(shè)備C可分配例如17個測試用例(例如,這17個測試用例的執(zhí)行時間可相對較短),盡管各個測試設(shè)備所分配的測試用例的數(shù)目并不相同,但是測試設(shè)備A上執(zhí)行3個測試用例所花費的時間、測試設(shè)備B上執(zhí)行10個測試用例所花費的時間以及測試設(shè)備C上執(zhí)行17個測試用例所花費的時間大致是相當(dāng)?shù)?,例如,測試設(shè)備A上執(zhí)行3個測試用例所花費的時間為2分鐘,測試設(shè)備B上執(zhí)行10個測試用例所花費的時間為2分5秒,測試設(shè)備C上執(zhí)行17個測試用例所花費的時間為2分10秒。也就說,這三個測試設(shè)備中的任兩個測試設(shè)備執(zhí)行測試用例所花費的時間的差值小于預(yù)設(shè)值,例如小于10秒,小于30秒等,此預(yù)設(shè)值可根據(jù)需要來設(shè)置,本發(fā)明對此不作限定。
在本發(fā)明實施例中,由于對分配給各個測試設(shè)備的測試用例的具體數(shù)目并不進(jìn)行限定,而只是限定在各個測試設(shè)備上運行分配給該測試設(shè)備的所有測試用例的時間大致相當(dāng),即需保證任兩個測試設(shè)備上運行各自所得到的測試用例的時間差值小于預(yù)設(shè)值。因而,作為另一種可能的實現(xiàn)方式,在本發(fā)明實施例中,各個測試設(shè)備所分配的測試用例的數(shù)目也可能是相等的。還是以上文所舉出的30個測試用例、3個測試設(shè)備為例進(jìn)行說明。在此情況下,每個測試設(shè)備可分配10個測試用例,同時各個測試設(shè)備執(zhí)行各自所得到的這10個測試用例的時間是大致相當(dāng)?shù)?,即,任兩個測試設(shè)備上運行各自所得到的測試用例的時間差值小于預(yù)設(shè)值。在分配給各個測試設(shè)備的測試用例的數(shù)目是相同的情況下,為保證各個測試設(shè)備執(zhí)行所得到的測試用例的時間大致相當(dāng),分配給各個測試設(shè)備的測試用例必然是運行時間較長的測試用例與運行時間較短的測試用例的混合,因為如果分配給某個測試設(shè)備全是執(zhí)行時間較長的測試用例或者分配給某個測試設(shè)備全是執(zhí)行時間較短的測試用例,則無法保證每個測試設(shè)備執(zhí)行所得到的所有測試用例的時間相差不大(即,差值小于預(yù)設(shè)值)。
這里指出的是,上面提到的各個測試設(shè)備執(zhí)行測試用例所花費的時間只是舉例來說明,同樣地,測試設(shè)備的數(shù)目以及分配給各個測試設(shè)備的測試用例的 數(shù)目也是舉例說明,并不意為限制。
13、在各個測試設(shè)備上運行分配給該測試設(shè)備的測試用例。
在將測試用例集合中的所有測試用例分配給各個測試設(shè)備之后,各個測試設(shè)備即可運行所得到的各個測試用例。運行完成后,會重新得到各個測試用例的執(zhí)行時間,用于后續(xù)的測試用例分配和執(zhí)行。
需指出的是,在本發(fā)明實施例中,還可以為所述測試用例集合中的測試用例分配運行優(yōu)先級,例如用戶關(guān)心的測試用例可以分配較高的優(yōu)先級,而優(yōu)先級較高的用例可優(yōu)先得到運行。這樣一來,測試設(shè)備在得到所分配的各個測試用例之后,即可按照測試用例的運行優(yōu)先級從高到低的順序依次運行分配給該測試設(shè)備的測試用例。如此,可以根據(jù)需要來更加快速地得知這些測試用例的運行結(jié)果,從而加快測試效率。
本發(fā)明實施例提供的運行測試用例的方法,基于測試用例的運行時間來向各個測試設(shè)備分配測試用例,可以保證各個測試設(shè)備上運行的測試用例所花費的執(zhí)行時間大致相同,從而縮短了測試用例集合的運行時間。
在本發(fā)明實施例中,在每個測試用例運行的過程中,還可實時地示出該測試用例的運行結(jié)果。從而,可根據(jù)測試用例的執(zhí)行情況,實時地調(diào)度測試用例的運行。
此外,在每個測試用例運行后,可生成記錄該測試用例執(zhí)行情況的XML格式文件,并可存儲該XML文件;待測試設(shè)備上的所有測試用例運行完畢之后,可將每個測試用例對應(yīng)的XML格式文件進(jìn)行合并,得到該測試設(shè)備的合并的測試用例執(zhí)行報告。如此,可根據(jù)測試用例執(zhí)行報告更全面地了解測試用例的執(zhí)行情況。當(dāng)然,在本發(fā)明實施例中,在測試用例執(zhí)行完畢后,還可獲取記錄合并代碼覆蓋率情況的合并代碼覆蓋率報告。
為更好地理解本發(fā)明的技術(shù)方案,下面對本發(fā)明實施例進(jìn)行進(jìn)一步闡釋。
測試用例的識別與執(zhí)行時間統(tǒng)計
依據(jù)不同的框架,測試用例會使用不同的方法進(jìn)行標(biāo)識,有些使用@Test注解來標(biāo)識,有些則使用test開頭的方法名來標(biāo)識,而后者在編寫安卓(android)測試用例上更為通用,故可假定測試用例的命名均以test開頭。據(jù)此,本方案可使用正則表達(dá)式:‘(test.*)\’來匹配并提取測試代碼中所有以test開頭的方法名,同時還需要記錄下對應(yīng)的包名(例如,使用正則表達(dá)式:‘^package(.*);’ 來識別)以及類名(例如,使用正則表達(dá)式:‘public class(\S*)’來識別),完成后即可得知所有的測試用例名稱,進(jìn)而可得到測試用例集合。
而測試用例運行時間的統(tǒng)計可以通過XML格式的測試用例執(zhí)行報告來提取。測試用例執(zhí)行報告的示例可如下:
<testsuite failures="0"name="Untitled suite in com.kugou.test"package="com.kugou.test"tests="2"time="4.775">
<testcase classname="Test"name="method1"time="0.467"/>
<testcase classname="Test2"name="method2"time="0.467"/>
</testsuite>
本發(fā)明實施例可通過正則表達(dá)式來提取需要的元素,如包名、類名、方法名等,這樣就獲取到了測試用例集合,然后可通過正則表達(dá)式或XML庫解析得到的XML文件就知道每個測試用例執(zhí)行所花的時間。注意:因為測試用例執(zhí)行報告是上一次測試用例運行的情況,所以測試用例執(zhí)行報告中的測試用例可能是過時的。
測試用例的調(diào)度
得到所有測試用例的運行時間后,本發(fā)明實施例可將這些測試用例按照執(zhí)行時間從長到短進(jìn)行排序。然后一個一個地將這些測試用例分配到當(dāng)前包含運行時間最短的測試用例的設(shè)備上。如當(dāng)前有3臺測試設(shè)備,10個測試用例,假設(shè)這10個測試用例所耗時間為10~1秒。在將前3個測試用例平均分配到3臺設(shè)備后,此時3臺設(shè)備的當(dāng)前包含的測試用例的運行時間分別為10秒、9秒和8秒,則第4個測試用例則應(yīng)該在包含運行時間最短的測試用例的測試設(shè)備上(即第三臺設(shè)備)運行。依此算法分配所有測試用例,可使測試用例的總體執(zhí)行時間近似于最優(yōu)。
基于以上的原理,本發(fā)明實施例還可以靈活地加入其它測試用例調(diào)度策略,如優(yōu)先級調(diào)度策略。用戶可給那些比較重要的用例添加更高的優(yōu)先級標(biāo)識(標(biāo)識可以以約定好的注釋形式存在于代碼中,本發(fā)明實施例可通過正則表達(dá)式進(jìn)行掃描獲取),測試設(shè)備可根據(jù)這些標(biāo)識來決定測試用例的執(zhí)行順序,從而使得這些測試用例的執(zhí)行結(jié)果可以更快地反饋給用戶。
測試用例的分發(fā)
不同于相關(guān)技術(shù),本發(fā)明實施例因為需要細(xì)粒度地控制每個測試用例的執(zhí) 行,故而可采用以下命令來執(zhí)行測試用例(可使用逗號來同時運行多個測試用例,另外,adb的-s參數(shù)可指定設(shè)備名):
adb shell am instrument-w-e class com.android.foo.FooTest#testFoo com.android.foo/android.test.InstrumentationTestRunner
執(zhí)行結(jié)果的匯總
本發(fā)明實施例對執(zhí)行結(jié)果的匯總需要完成兩部分工作。一部分是XML格式文件的匯總,另一部分是覆蓋率文件的匯總。XML格式文件的匯總可先利用一些EL4J XmlMerge庫來完成合并XML文件的工作,例如如下:
覆蓋率文件的匯總則可利用jacoco的ExecFileLoader類來完成。例如如下:
需要指出的是,以上所列出的代碼只是以舉例的方式進(jìn)行說明,本發(fā)明還可以采用其他類似的代碼來完成相應(yīng)的功能。
由于不同用例的執(zhí)行時間可能會有較大差異,如果所有耗時較長的用例都被分配到同一臺測試設(shè)備上,那么會因為木桶效應(yīng)而導(dǎo)致最終的執(zhí)行時間無法到達(dá)最優(yōu)值(假設(shè)在一臺測試設(shè)備上執(zhí)行所有用例時間為T,總共有n臺測試設(shè)備,那么此最優(yōu)值應(yīng)該是T/n)。本發(fā)明實施例根據(jù)測試用例的執(zhí)行時間來將測試用例分發(fā)到不同設(shè)備上,能夠使最終執(zhí)行時間能近似于最優(yōu)值。
而且,本發(fā)明實施例可以無需運行完所有測試用例后才展示最終測試結(jié)果。 由于本發(fā)明實施例是細(xì)粒度地控制每個測試用例的運行,因此可以實時地示出每個測試用例的執(zhí)行情況,并根據(jù)執(zhí)行情況實時地調(diào)度測試用例的運行。
同時,本發(fā)明實施例可以給每個測試用例分配運行優(yōu)先級,優(yōu)先級較高的測試用例可獲取優(yōu)先運行權(quán),因此用戶可以為關(guān)心的測試用例設(shè)置較高的優(yōu)先級,以更加快速地得知這些測試用例的運行結(jié)果,從而加快測試效率。
由上可知,本發(fā)明實施例提供的運行測試用例的方法,不但可縮短所有測試用例的總運行時間,還可以在測試用例運行過程中實時展示用例運行結(jié)果,并且為測試用例的運行添加優(yōu)先級概念,使得用戶可以按照需要優(yōu)先運行某些測試用例。
圖2是本發(fā)明實施例提供的一種運行測試用例的裝置的結(jié)構(gòu)框圖。參照圖2,本發(fā)明實施例提供的運行測試用例的裝置200可包括獲取模塊201、分配模塊202以及運行模塊203。其中,
獲取模塊201,用于獲取測試用例集合中每個測試用例的運行時間;
分配模塊202,用于根據(jù)獲取的每個測試用例的運行時間,為多個測試設(shè)備中的每個測試設(shè)備分配測試用例,使得所述多個測試設(shè)備中的每兩個測試設(shè)備之間運行各自所分配的測試用例的時間差值小于預(yù)設(shè)值;其中,分配給各個測試設(shè)備的測試用例的數(shù)目是相同或不相同的;
運行模塊203,用于在各個測試設(shè)備上運行分配給該測試設(shè)備的測試用例。
本發(fā)明實施例提供的運行測試用例的裝置,基于測試用例的運行時間來向各個測試設(shè)備分配測試用例,可以保證各個測試設(shè)備上運行的測試用例所花費的執(zhí)行時間大致相同,從而縮短了測試用例集合的運行時間。
可選地,在一個實施例中,所述獲取模塊201可具體用于:
預(yù)先執(zhí)行各個測試用例以得到各個測試用例的XML文件;
利用正則表達(dá)式或XML庫解析所述XML文件,得到各個測試用例的運行時間。
可選地,在另一個實施例中,所述裝置200還包括:顯示模塊204,用于在每個測試用例運行的過程中,實時地示出該測試用例的運行結(jié)果。
可選地,在另一個實施例中,所述分配模塊202還可用于:為所述測試用例集合中的測試用例分配運行優(yōu)先級。相應(yīng)地,所述運行模塊203可具體用于:在各個測試設(shè)備上按照測試用例的運行優(yōu)先級從高到低的順序依次運行分配給 該測試設(shè)備的測試用例。
可選地,在另一個實施例中,所述運行模塊203還可用于:在每個測試用例運行后,生成記錄該測試用例執(zhí)行情況的XML格式文件;將每個測試用例對應(yīng)的XML格式文件進(jìn)行合并。
本發(fā)明實施例提供的運行測試用例的裝置,不但可縮短所有測試用例的總運行時間,還可以在測試用例運行過程中實時展示用例運行結(jié)果,并且為測試用例的運行添加優(yōu)先級概念,使得用戶可以按照需要優(yōu)先運行某些測試用例。
需要說明的是:上述實施例提供的運行測試用例的裝置僅以上述各功能模塊的劃分進(jìn)行舉例說明,實際應(yīng)用中,可以根據(jù)需要而將上述功能分配由不同的功能模塊完成,即將運行測試用例的裝置的內(nèi)部結(jié)構(gòu)劃分成不同的功能模塊,以完成以上描述的全部或者部分功能。另外,上述實施例提供的運行測試用例的裝置和運行測試用例的方法實施例屬于同一構(gòu)思,其具體實現(xiàn)過程詳見方法實施例,這里不再贅述。
同時,需要說明的是,上文提到的運行測試用例的裝置中所包括的各個模塊可以以軟件或硬件的形式來實現(xiàn)。
需要說明的是,本說明書中的各個實施例均采用遞進(jìn)的方式描述,每個實施例重點說明的都是與其他實施例的不同之處,各個實施例之間相同相似的部分互相參見即可。對于裝置類實施例而言,由于其與方法實施例基本相似,所以描述的比較簡單,相關(guān)之處參見方法實施例的部分說明即可。
需要說明的是,在本文中,術(shù)語“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的過程、方法、物品或者設(shè)備不僅包括那些要素,而且還包括沒有明確列出的其他要素,或者是還包括為這種過程、方法、物品或者設(shè)備所固有的要素。在沒有更多限制的情況下,由語句“包括一個……”限定的要素,并不排除在包括所述要素的過程、方法、物品或者設(shè)備中還存在另外的相同要素。
本領(lǐng)域普通技術(shù)人員可以理解實現(xiàn)上述實施例的全部或部分步驟可以通過硬件來完成,也可以通過程序來指令相關(guān)的硬件完成,所述的程序可以存儲于一種計算機(jī)可讀存儲介質(zhì)中,上述提到的存儲介質(zhì)可以是只讀存儲器,磁盤或光盤等。
以上所述僅為本發(fā)明的較佳實施例,并不用以限制本發(fā)明,凡在本發(fā)明的 精神和原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。