本發(fā)明涉及通信技術(shù)領(lǐng)域,具體而言,涉及一種測試方法、服務(wù)器和系統(tǒng)。
背景技術(shù):
隨著硬件性能的提升和成本的降低,智能手機已經(jīng)非常普及。在系統(tǒng)或產(chǎn)品發(fā)布之前,需要對系統(tǒng)或產(chǎn)品的性能、穩(wěn)定性等方面進行一系列測試。但是,這些手機系統(tǒng)或產(chǎn)品的版本更新速度很快,往往一個月甚至十幾天即有新版本發(fā)布。比較傳統(tǒng)的測試方法是人工手動測試或者經(jīng)過一些操作后才能進行半自動化測試。這種測試方式具有非常明顯的缺陷,需要耗費大量的人力物力去進行測試,測試方案的更改需要人工進行手動操作,對于測試結(jié)果無法自動通知,對于測試結(jié)果也需要人工定期進行查看。在時間上難以滿足這種系統(tǒng)測試需求,而現(xiàn)有的自動化測試方法存在編寫腳本速度慢、測試結(jié)果不易判斷、測試報告不易獲取等問題。
技術(shù)實現(xiàn)要素:
有鑒于此,本發(fā)明的目的在于提供一種測試方法、服務(wù)器和系統(tǒng),以力圖解決或者至少緩解上面存在的問題。
第一方面,本發(fā)明提供一種測試方法,該方法包括:
服務(wù)器接收外部終端上傳的測試腳本和對應(yīng)所述測試腳本的腳本執(zhí)行信息,所述腳本執(zhí)行信息包括測試腳本名稱、腳本執(zhí)行參數(shù)和腳本執(zhí)行命令;
所述服務(wù)器根據(jù)所述腳本執(zhí)行命令和腳本執(zhí)行參數(shù),執(zhí)行所述測試腳本名稱對應(yīng)的測試腳本,并生成測試結(jié)果信息;
所述服務(wù)器向所述外部終端傳輸所述測試結(jié)果信息。
可選地,在根據(jù)本發(fā)明的方法中,所述服務(wù)器接收外部終端上傳的測試腳本和對應(yīng)所述測試腳本的腳本執(zhí)行信息包括:
所述服務(wù)器建立與所述外部終端之間的預(yù)定連接,接收所述外部終端傳輸?shù)阶陨碇付ㄎ募A中的所述測試腳本,所述測試腳本是所述外部終端通過本地文件的輸入流寫入到預(yù)定連接的輸出流并由所述預(yù)定連接的輸出流傳輸?shù)椒?wù)器的,所述預(yù)定連接的輸出流和所述本地文件的輸入流是所述外部終端獲取的。
可選地,在根據(jù)本發(fā)明的方法中,所述服務(wù)器接收外部終端上傳的測試腳本和對應(yīng)所述測試腳本的腳本執(zhí)行信息包括還包括:
所述服務(wù)器接收所述外部終端通過信息請求對象傳輸?shù)拇鎯τ兴瞿_本執(zhí)行信息的信息上傳對象,所述信息請求對象和所述信息上傳對象是所述外部終端獲取的,所述信息上傳對象中存儲的腳本執(zhí)行信息是所述信息請求對象寫入的。
可選地,在根據(jù)本發(fā)明的方法中,所述服務(wù)器根據(jù)所述腳本執(zhí)行命令和腳本執(zhí)行參數(shù),執(zhí)行所述測試腳本名稱對應(yīng)的測試腳本,并生成測試結(jié)果信息包括:
在服務(wù)器中查找所述測試腳本名稱對應(yīng)的測試腳本;
如果在服務(wù)器中查找到所述測試腳本名稱對應(yīng)的測試腳本,則執(zhí)行所述測試腳本名稱對應(yīng)的測試腳本;
如果在服務(wù)器中未查找到所述測試腳本名稱對應(yīng)的測試腳本,則生成測試結(jié)果信息。
可選地,在根據(jù)本發(fā)明的方法中,還包括:
所述服務(wù)器根據(jù)所述測試結(jié)果信息,判斷在執(zhí)行所述測試腳本過程中是否發(fā)生異常,如果在執(zhí)行所述測試腳本過程中發(fā)生異常,則向外部終端發(fā)送測試異常信息。
第二方面,本發(fā)明提供一種服務(wù)器,包括:
接收模塊,用于接收外部終端上傳的測試腳本和對應(yīng)所述測試腳本的腳本執(zhí)行信息,所述腳本執(zhí)行信息包括測試腳本名稱、腳本執(zhí)行參數(shù)和腳本執(zhí)行命令;
處理模塊,用于根據(jù)所述腳本執(zhí)行命令和腳本執(zhí)行參數(shù),執(zhí)行所述測試腳本名稱對應(yīng)的測試腳本,并生成測試結(jié)果信息;
發(fā)送模塊,用于向所述外部終端傳輸所述測試結(jié)果信息。
可選地,在根據(jù)本發(fā)明的服務(wù)器中,所述服務(wù)器中的接收模塊還用于:
建立與所述外部終端之間的預(yù)定連接,接收所述外部終端傳輸?shù)阶陨碇付ㄎ募A中的所述測試腳本,所述測試腳本是所述外部終端通過本地文件的輸入流寫入到預(yù)定連接的輸出流并由預(yù)定連接的輸出流傳輸?shù)椒?wù)器的,所述預(yù)定連接的輸出流和所述本地文件的輸入流是所述外部終端獲取的。
可選地,在根據(jù)本發(fā)明的服務(wù)器中,所述服務(wù)器中的接收模塊用于接收所述外部終端通過信息請求對象傳輸?shù)拇鎯τ兴瞿_本執(zhí)行信息的信息上傳對象,所述信息請求對象和所述信息上傳對象是所述外部終端獲取的,所述信息上傳對象中存儲的腳本執(zhí)行信息是所述信息請求對象寫入的。
可選地,在根據(jù)本發(fā)明的服務(wù)器中,所述服務(wù)器中的處理模塊還用于:
在服務(wù)器中查找所述測試腳本名稱對應(yīng)的測試腳本;
如果在服務(wù)器中查找到所述測試腳本名稱對應(yīng)的測試腳本,則執(zhí)行所述測試腳本;
如果在服務(wù)器中未查找到所述測試腳本名稱對應(yīng)的測試腳本,則生成測試結(jié)果信息。
第三方面,辦發(fā)明提供一種測試系統(tǒng),該系統(tǒng)包括外部終端和如上的服務(wù)器,其中,
所述外部終端,用于將測試腳本和對應(yīng)所述測試腳本的腳本執(zhí)行信息上傳至所述服務(wù)器,所述腳本執(zhí)行信息包括測試腳本名稱、腳本執(zhí)行參數(shù)和腳本執(zhí)行命令;
所述服務(wù)器,用于接收所述外部終端上傳的所述測試腳本和對應(yīng)所述測試腳本的所述腳本執(zhí)行信息,根據(jù)所述腳本執(zhí)行命令和腳本執(zhí)行參數(shù),執(zhí)行所述測試腳本名稱對應(yīng)的測試腳本并生成測試結(jié)果信息;并向所述外部終端傳輸所述測試結(jié)果信息。
根據(jù)本發(fā)明的技術(shù)方案,能夠通過外部終端上傳不同的測試腳本和腳本執(zhí)行信息到服務(wù)器,能夠動態(tài)調(diào)整測試任務(wù),實現(xiàn)自動化測試的目的。對于測試完成后的測試結(jié)果信息能夠通過微信等方式通知外部終端。
為使本發(fā)明的上述目的、特征和優(yōu)點能更明顯易懂,下文特舉較佳實施例,并配合所附附圖,作詳細說明如下。
附圖說明
為了更清楚地說明本發(fā)明實施例的技術(shù)方案,下面將對實施例中所需要使用的附圖作簡單地介紹,應(yīng)當理解,以下附圖僅示出了本發(fā)明的某些實施例,因此不應(yīng)被看作是對范圍的限定,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動的前提下,還可以根據(jù)這些附圖獲得其他相關(guān)的附圖。
圖1示出了本發(fā)明實施例所提供的一種測試系統(tǒng)的結(jié)構(gòu)圖;
圖2示出了本發(fā)明實施例所提供的一種測試方法的流程圖;以及
圖3示出了本發(fā)明實施例所提供的一種測試裝置的結(jié)構(gòu)圖。
具體實施方式
為使本發(fā)明實施例的目的、技術(shù)方案和優(yōu)點更加清楚,下面將結(jié)合本發(fā)明實施例中附圖,對本發(fā)明實施例中的技術(shù)方案進行清楚、完整地描述,顯然,所描述的實施例僅僅是本發(fā)明一部分實施例,而不是全部的實施例。通常在此處附圖中描述和示出的本發(fā)明實施例的組件可以以各種不同的配置來布置和設(shè)計。因此,以下對在附圖中提供的本發(fā)明的實施例的詳細描述并非旨在限制要求保護的本發(fā)明的范圍,而是僅僅表示本發(fā)明的選定實施例?;诒景l(fā)明的實施例,本領(lǐng)域技術(shù)人員在沒有做出創(chuàng)造性勞動的前提下所獲得的所有其他實施例,都屬于本發(fā)明保護的范圍。
圖1示出了根據(jù)本發(fā)明的一個實施例的測試系統(tǒng)的示意圖。如圖1所示,該系統(tǒng)包括:外部終端100和服務(wù)器200。
外部終端100將測試腳本和對應(yīng)測試腳本的腳本執(zhí)行信息上傳至服務(wù)器200。服務(wù)器200根據(jù)接收到的測試腳本和對應(yīng)測試腳本的腳本執(zhí)行信息執(zhí)行相應(yīng)的測試腳本并生成測試結(jié)果信息,將上述測試結(jié)果信息傳輸給外部終端100。其中,外部終端可以是但不限于移動終端、計算設(shè)備、便攜式設(shè)備等。服務(wù)器是用于提供計算服務(wù)的設(shè)備,服務(wù)器的構(gòu)成包括處理器、硬盤、內(nèi)存、系統(tǒng)總線等,和通用的計算機架構(gòu)類似,但是由于需要提供高可靠的服務(wù),因此在處理能力、穩(wěn)定性、可靠性、安全性、可擴展性、可管理性等方面要求較高。在網(wǎng)絡(luò)環(huán)境下,根據(jù)服務(wù)器提供的服務(wù)類型不同,分為不同的服務(wù)器,例如,web服務(wù)器、管理服務(wù)器、游戲服務(wù)器等。由于服務(wù)器需要響應(yīng)服務(wù)請求,并進行處理,因此一般來說服務(wù)器應(yīng)具備承擔服務(wù)并且保障服務(wù)的能力。具體以下進行詳細敘述。
圖2示出了本發(fā)明的實施例所提供的一種測試方法的流程圖。如圖2所示,該方法在服務(wù)器中執(zhí)行,上述方法始于步驟S210。
在步驟S210中,服務(wù)器接收外部終端上傳的測試腳本和對應(yīng)測試腳本的腳本執(zhí)行信息。腳本執(zhí)行信息包括測試腳本名稱、腳本執(zhí)行參數(shù)和腳本執(zhí)行命令。
服務(wù)器首先建立與外部終端之間的預(yù)定連接,如Socket連接。Socket連接能夠使網(wǎng)絡(luò)上的兩個程序通過一個雙向的通信連接實現(xiàn)數(shù)據(jù)交換。外部終端通過自身提供的方式獲取Socket連接。具體調(diào)用函數(shù)為:Socket("168.168.168.94",10005),其中,第一個參數(shù)是IP地址,第二個參數(shù)是端口號,在實例化成功后返回Socket連接對象fileLoaderSocket。不過此處應(yīng)當理解,上述連接僅僅是示意性的,所有可以建立服務(wù)器與外部終端之間的連接形式都在本發(fā)明的保護范圍內(nèi)。
外部終端建立與服務(wù)器的連接后,獲取預(yù)定連接的輸出流和本地文件的輸入流。在Java中,能夠讀取一個字節(jié)序列的對象稱為輸入流,能夠?qū)懭胍粋€字節(jié)序列的對象就稱作一個輸出流。外部終端通過fileLoaderSocket中的getOutputStream()方法獲取到fileLoaderSocket的輸出流out。外部終端通過FileInputStream函數(shù)傳入文件路徑并返回文件的輸入流,如,InputStreamfileRead=newFileInputStream("D:\\abc.sh")。該輸入流主要用于將測試腳本讀取到外部終端的內(nèi)存中。
輸入流將測試腳本寫入到預(yù)定連接的輸出流中,預(yù)定連接的輸出流將上述測試腳本傳輸?shù)椒?wù)器指定文件夾中,如,服務(wù)器中的script目錄下,這樣只要上傳過的測試腳本都可以告知服務(wù)器調(diào)用哪些腳本執(zhí)行哪些命令的操作。在一個實施例中,外部終端將文件輸入流fileRead中的測試腳本數(shù)據(jù)循環(huán)的寫入到Socket輸出流out中。如,通過調(diào)用fileRead.read(buf))每次從輸入流中讀取1k的數(shù)據(jù)到內(nèi)存緩存buf中。再通過out.write(buf)將buf中的數(shù)據(jù)寫入到Socket輸出流out中,重復(fù)上述操作直到輸入流fileRead中的所有數(shù)據(jù)全部寫入到Socket輸出流out中,Socket輸出流將測試腳本文件數(shù)據(jù)上傳到服務(wù)器。通過調(diào)用fileLoaderSocket.shutdownOutput()方法通知服務(wù)器整個測試腳本文件上傳完畢,關(guān)閉輸出流。
隨后,外部終端將腳本執(zhí)行參數(shù)上傳到服務(wù)器。腳本執(zhí)行參數(shù)是以預(yù)定格式傳送的服務(wù)器的,如,JSON格式。JSON格式是一個通用的服務(wù)器和客戶端傳輸信息的格式。上傳腳本執(zhí)行參數(shù)的代碼如下:
{
"scriptName":"test.sh",
"cmd":"start",
"param":"paramInfo",
"extr":"extr",
}
其中,scriptName是需要執(zhí)行的腳本的名稱,本實例中需要執(zhí)行的腳本名稱是test.sh。cmd為需要執(zhí)行的腳本的命令字,本發(fā)明中主要有如下命令字段:start:啟動執(zhí)行腳本;stop:停止執(zhí)行腳本。param:這個是執(zhí)行腳本命令所需要攜帶的參數(shù)信息,本實例中參數(shù)填寫的是paramInfo,這個命令字段需要根據(jù)具體的腳本實現(xiàn)邏輯來傳遞腳本所需參數(shù)具體信息。腳本執(zhí)行信息的具體上傳過程如下:
外部終端獲取信息請求對象和信息上傳對象,信息請求對象將腳本執(zhí)行信息寫入到信息上傳對象中,信息請求對象將存儲有腳本執(zhí)行信息的信息上傳對象傳輸?shù)椒?wù)器。
在一個實施例中,外部終端通過自身運行的操作系統(tǒng)如安卓系統(tǒng)、Linux系統(tǒng)等提供的API如HttpClienthttpclient=new DefaultHttpClient()獲取HttpClinet實例對象。通過系統(tǒng)提供的API如HttpPosthttpPost=new HttpPost(url)獲取HttpPost實例對象,即將服務(wù)器上傳命令的的地址url傳遞到上述實例對象中,實例化成功后返回HttpPost對象。
隨后,外部終端通過系統(tǒng)提供的API獲取用來存儲待上傳的腳本執(zhí)行信息(或命令字)的MultipartEntity對象中的mulentity。通過調(diào)用mulentity中的addPart方法來存放上傳命令字,例如,mulentity.addPart(“scriptName”,”test.sh”),將scriptName和對應(yīng)的test.sh存放在mulentity中,通過相同的方式將cmd、param、extra等信息全部存入到mulentity中。上傳命令字封裝到mulentity中后,通過httpPost的setEntity(mulentity)方法,將mulentity中存儲的信息存放到httpPost對象內(nèi)部。
最后,通過調(diào)用httpclient對象中的execute(httpPost)方法,將整個httpPost中的所有信息全部傳遞給服務(wù)器端。其中,httpPost中已經(jīng)存儲有mulentity中的例如cmd、param、extra等。
在步驟S220中,服務(wù)器根據(jù)腳本執(zhí)行命令和腳本執(zhí)行參數(shù),執(zhí)行測試腳本名稱對應(yīng)的測試腳本,并生成測試結(jié)果信息。
由于服務(wù)器接收到腳本執(zhí)行參數(shù)是JSON格式,服務(wù)器需要使用通用的解析方式來解析上述預(yù)定格式的腳本執(zhí)行參數(shù)。如,可以通過服務(wù)器中自帶的解析器解析。由于JSON本身是一串字符串,服務(wù)器接收的時候用JSONObject對象來存儲這一串字符串,為了能夠獲取到字符串中的數(shù)據(jù),通過調(diào)用JSONObject的getString方法獲取其中的具體值,如,通過調(diào)用getString(“scriptName”)返回scriptName所對應(yīng)的值test.sh。
服務(wù)器解析完成后,可以獲取測試腳本名稱、腳本執(zhí)行參數(shù)和腳本執(zhí)行命令,如,名稱fileName、執(zhí)行命令cmd、執(zhí)行命令參數(shù)paramInfo等。服務(wù)器在自身的存儲目錄如Script中查找所述測試腳本名稱對應(yīng)的測試腳本。如果在服務(wù)器中查找到所述測試腳本名稱對應(yīng)的測試腳本,則執(zhí)行測試腳本名稱對應(yīng)的測試腳本。如果在服務(wù)器中未查找到測試腳本名稱對應(yīng)的測試腳本,則生成無法執(zhí)行測試腳本的測試結(jié)果信息。
在一個實施例中,服務(wù)器中運行有l(wèi)inux系統(tǒng),服務(wù)器通過調(diào)用linux系統(tǒng)自帶的文件查找工具如find命令來查找文件,如,通過(find fileName)的方式調(diào)用該命令。
如果在Script目錄下找到了fileName的文件,則會直接執(zhí)行fileName的腳本文件。并通過cmd命令執(zhí)行不同的操作,如,執(zhí)行start命令就會直接將paramInfo信息傳遞給測試腳本腳本。執(zhí)行stop命令則會直接停止該腳本的執(zhí)行。其中,執(zhí)行測試腳本是通過“./filename paramInfo”方式來進行的。停止測試腳本是通過向執(zhí)行測試腳本終端發(fā)送“ctrl+c”命令來停止腳本執(zhí)行。
如果在script目錄中沒有找到對應(yīng)測試腳本名稱的文件,外部終端會通過HTTP協(xié)議告知客戶端服務(wù)器上不存在該文件,無法執(zhí)行。這時,客戶端會收到服務(wù)器的返回的服務(wù)器不存在測試腳本的測試結(jié)果信息。
根據(jù)一種實施方式,服務(wù)器根據(jù)測試結(jié)果信息,判斷在執(zhí)行測試腳本過程中是否發(fā)生異常。如果在執(zhí)行測試腳本過程中發(fā)生異常,則生成測試異常信息。異常處理是處理執(zhí)行測試腳本過程中出錯的情況。核心功能是捕獲腳本執(zhí)行的異常行為,并將異常返回給外部終端。其中反饋方式是通過微信推送的方式進行返回給客戶端。
在一個實施例中,Linux系統(tǒng)中測試腳本中每一行命令的執(zhí)行都會有一個返回結(jié)果。如果一行命令的返回的結(jié)果為零,則表示這一行命令執(zhí)行沒有異常。如果返回的結(jié)果非零,則表示測試腳本執(zhí)行有異常,通過測試腳本中每一行命令的返回值來判定腳本是否出現(xiàn)異常。
如果測試腳本執(zhí)行過程中出現(xiàn)了錯誤信息,服務(wù)器生成測試異常信息。
在步驟S230中,服務(wù)器向所述外部終端傳輸測試結(jié)果信息。
測試結(jié)果信息或測試異常信息會通過微信方式發(fā)送至外部終端。例如,用戶可以提前關(guān)注執(zhí)行測試的微信公眾號,服務(wù)器端存儲有用戶的信息,當腳本執(zhí)行完生成測試結(jié)果信息后,服務(wù)器可以調(diào)用微信的推送接口(如API),以微信消息的方式通知所有關(guān)注上述微信公眾號的用戶。不過此處應(yīng)當理解,本發(fā)明中的測試結(jié)果消息的推送形式不限于微信,所有可以實現(xiàn)推送上述消息的方式都在本發(fā)明的保護范圍內(nèi)。
根據(jù)本發(fā)明的技術(shù)方案,能夠通過外部終端上傳不同的測試腳本和腳本執(zhí)行信息到服務(wù)器,能夠動態(tài)調(diào)整測試任務(wù),實現(xiàn)自動化測試的目的。對于測試完成后的測試結(jié)果信息能夠通過微信等方式通知外部終端。
圖3示出了根據(jù)本發(fā)明的一個實施例的服務(wù)器的結(jié)構(gòu)圖。如圖3所示,該服務(wù)器包括:接收模塊310、處理模塊320和發(fā)送模塊330。
接收模塊310接收外部終端上傳的測試腳本和對應(yīng)測試腳本的腳本執(zhí)行信息。其中,腳本執(zhí)行信息包括測試腳本名稱、腳本執(zhí)行參數(shù)和腳本執(zhí)行命令。接收模塊310可以建立與所述外部終端之間的預(yù)定連接,接收外部終端傳輸?shù)阶陨碇付ㄎ募A中的測試腳本,測試腳本是外部終端通過本地文件的輸入流寫入到預(yù)定連接的輸出流并由預(yù)定連接的輸出流傳輸?shù)椒?wù)器的,預(yù)定連接的輸出流和本地文件的輸入流是外部終端獲取的。接收模塊310還用于接收外部終端通過信息請求對象傳輸?shù)拇鎯τ心_本執(zhí)行信息的信息上傳對象,信息請求對象和信息上傳對象是外部終端獲取的,信息上傳對象中存儲的腳本執(zhí)行信息是所述信息請求對象寫入的。測試腳本和腳本執(zhí)行信息上傳的具體過程已在方法部分進行詳細描述,此處不做過多敘述。
處理模塊320根據(jù)腳本執(zhí)行命令和腳本執(zhí)行參數(shù),執(zhí)行測試腳本名稱對應(yīng)的測試腳本,并生成測試結(jié)果信息。處理模塊320在服務(wù)器中查找所述測試腳本名稱對應(yīng)的測試腳本。如果在服務(wù)器中查找到測試腳本名稱對應(yīng)的測試腳本,則執(zhí)行測試腳本。如果在服務(wù)器中未查找到測試腳本名稱對應(yīng)的測試腳本,則生成測試結(jié)果信息。具體過程請參考方法流程,此處不再進行敘述。
處理模塊320還可以根據(jù)命令執(zhí)行模塊生成的測試結(jié)果信息,判斷在執(zhí)行測試腳本過程中是否發(fā)生異常。果在執(zhí)行測試腳本過程中發(fā)生異常,則生成測試異常信息。
發(fā)送模塊330向所述外部終端傳輸測試結(jié)果信息和測試異常信息。
本發(fā)明實施例所提供的一種測試裝置可以為設(shè)備上的特定硬件或者安裝于設(shè)備上的軟件或固件等。本發(fā)明實施例所提供的裝置,其實現(xiàn)原理及產(chǎn)生的技術(shù)效果和前述方法實施例相同,為簡要描述,裝置實施例部分未提及之處,可參考前述方法實施例中相應(yīng)內(nèi)容。所屬領(lǐng)域的技術(shù)人員可以清楚地了解到,為描述的方便和簡潔,前述描述的系統(tǒng)、裝置和單元的具體工作過程,均可以參考上述方法實施例中的對應(yīng)過程,在此不再贅述。
在本發(fā)明所提供的實施例中,應(yīng)該理解到,所揭露裝置和方法,可以通過其它的方式實現(xiàn)。以上所描述的裝置實施例僅僅是示意性的,例如,所述單元的劃分,僅僅為一種邏輯功能劃分,實際實現(xiàn)時可以有另外的劃分方式,又例如,多個單元或組件可以結(jié)合或者可以集成到另一個系統(tǒng),或一些特征可以忽略,或不執(zhí)行。另一點,所顯示或討論的相互之間的耦合或直接耦合或通信連接可以是通過一些通信接口,裝置或單元的間接耦合或通信連接,可以是電性,機械或其它的形式。
所述作為分離部件說明的單元可以是或者也可以不是物理上分開的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位于一個地方,或者也可以分布到多個網(wǎng)絡(luò)單元上。可以根據(jù)實際的需要選擇其中的部分或者全部單元來實現(xiàn)本實施例方案的目的。
另外,在本發(fā)明提供的實施例中的各功能單元可以集成在一個處理單元中,也可以是各個單元單獨物理存在,也可以兩個或兩個以上單元集成在一個單元中。
所述功能如果以軟件功能單元的形式實現(xiàn)并作為獨立的產(chǎn)品銷售或使用時,可以存儲在一個計算機可讀取存儲介質(zhì)中?;谶@樣的理解,本發(fā)明的技術(shù)方案本質(zhì)上或者說對現(xiàn)有技術(shù)做出貢獻的部分或者該技術(shù)方案的部分可以以軟件產(chǎn)品的形式體現(xiàn)出來,該計算機軟件產(chǎn)品存儲在一個存儲介質(zhì)中,包括若干指令用以使得一臺計算機設(shè)備(可以是個人計算機,服務(wù)器,或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行本發(fā)明各個實施例所述方法的全部或部分步驟。而前述的存儲介質(zhì)包括:U盤、移動硬盤、只讀存儲器(ROM,Read-Only Memory)、隨機存取存儲器(RAM,Random Access Memory)、磁碟或者光盤等各種可以存儲程序代碼的介質(zhì)。
應(yīng)注意到:相似的標號和字母在下面的附圖中表示類似項,因此,一旦某一項在一個附圖中被定義,則在隨后的附圖中不需要對其進行進一步定義和解釋,此外,術(shù)語“第一”、“第二”、“第三”等僅用于區(qū)分描述,而不能理解為指示或暗示相對重要性。
最后應(yīng)說明的是:以上所述實施例,僅為本發(fā)明的具體實施方式,用以說明本發(fā)明的技術(shù)方案,而非對其限制,本發(fā)明的保護范圍并不局限于此,盡管參照前述實施例對本發(fā)明進行了詳細的說明,本領(lǐng)域的普通技術(shù)人員應(yīng)當理解:任何熟悉本技術(shù)領(lǐng)域的技術(shù)人員在本發(fā)明揭露的技術(shù)范圍內(nèi),其依然可以對前述實施例所記載的技術(shù)方案進行修改或可輕易想到變化,或者對其中部分技術(shù)特征進行等同替換;而這些修改、變化或者替換,并不使相應(yīng)技術(shù)方案的本質(zhì)脫離本發(fā)明實施例技術(shù)方案的精神和范圍。都應(yīng)涵蓋在本發(fā)明的保護范圍之內(nèi)。因此,本發(fā)明的保護范圍應(yīng)所述以權(quán)利要求的保護范圍為準。