欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

一種客戶端生成方法、裝置及電子設(shè)備與流程

文檔序號(hào):12801988閱讀:202來源:國知局
一種客戶端生成方法、裝置及電子設(shè)備與流程

本申請(qǐng)主要涉及計(jì)算機(jī)技術(shù)領(lǐng)域,更具體地說是涉及一種客戶端生成方法、裝置及電子設(shè)備。



背景技術(shù):

thrift是一種跨語言的服務(wù)部署框架,通過一個(gè)中間語言如接口定義語言idl(interfacedefinitionlanguage),來定義rpc(remoteprocedurecallprotocol,遠(yuǎn)程過程調(diào)用)接口和數(shù)據(jù)類型,然后通過編譯器生成相應(yīng)語言的若干服務(wù)器端代碼文件和客戶端代碼文件,以便在需要情況下編譯得到服務(wù)端和客戶端的可執(zhí)行程序,滿足實(shí)際需要。

基于此,當(dāng)需要對(duì)rpc服務(wù)接口性能與功能進(jìn)行測試時(shí),現(xiàn)有技術(shù)通常是針對(duì)具體的rpc服務(wù),根據(jù)thrift文件定義編寫相應(yīng)的客戶端代碼進(jìn)行性能與功能測試,這就導(dǎo)致在不同的測試場景下,需要編寫一一對(duì)應(yīng)的客戶端代碼,才能進(jìn)行rpc服務(wù)的性能與功能測試,工作量非常大,成本較高且測試效率較低。



技術(shù)實(shí)現(xiàn)要素:

有鑒于此,本發(fā)明提供了一種客戶端生成方法、裝置及電子設(shè)備,利用客戶端的模板文件,通過配置需要的測試場景以及測試數(shù)據(jù),實(shí)現(xiàn)對(duì)模板文件的配置,得到相應(yīng)的客戶端可執(zhí)行文件,具有很強(qiáng)的復(fù)用性,降低了客戶端代碼編寫工作量,提高了客戶端生成效率。

為了實(shí)現(xiàn)上述目的,本申請(qǐng)?zhí)峁┝艘韵录夹g(shù)方案:

一種測試客戶端生成方法,所述方法包括:

獲得針對(duì)測試客戶端編寫的thrift文件;

按照預(yù)設(shè)要求將所述thrift文件轉(zhuǎn)化成測試數(shù)據(jù)文件以及測試場景文件;

利用獲得的針對(duì)所述測試客戶端的配置文件,對(duì)所述測試數(shù)據(jù)文件和所述測試場景文件進(jìn)行配置,得到目標(biāo)測試數(shù)據(jù)文件以及目標(biāo)測試場景文件,其中,所述配置文件包括填寫的針對(duì)所述測試客戶端的測試功能的測試數(shù)據(jù),以及實(shí)現(xiàn)所述測試功能的測試接口驗(yàn)證參數(shù);

根據(jù)預(yù)設(shè)數(shù)據(jù)變化接口文件和預(yù)設(shè)客戶端模板文件,利用所述目標(biāo)測試數(shù)據(jù)文件和所述目標(biāo)測試場景文件,生成測試客戶端文件。

本申請(qǐng)實(shí)施例還提供了一種測試客戶端生成裝置,所述裝置包括:

文件獲得模塊,用于獲得針對(duì)測試客戶端編寫的thrift文件;

文件轉(zhuǎn)化模塊,用于按照預(yù)設(shè)要求將所述thrift文件轉(zhuǎn)化成測試數(shù)據(jù)文件以及測試場景文件;

目標(biāo)文件配置模塊,用于利用獲得的針對(duì)所述測試客戶端的配置文件,對(duì)所述測試數(shù)據(jù)文件和所述測試場景文件進(jìn)行配置,得到目標(biāo)測試數(shù)據(jù)文件以及目標(biāo)測試場景文件,所述配置文件包括填寫的針對(duì)所述測試客戶端的測試功能的測試數(shù)據(jù),以及實(shí)現(xiàn)所述測試功能的測試接口驗(yàn)證參數(shù);

文件生成模塊,用于根據(jù)預(yù)設(shè)數(shù)據(jù)變化接口文件和預(yù)設(shè)客戶端模板文件,利用所述目標(biāo)測試數(shù)據(jù)文件和所述目標(biāo)測試場景文件,生成測試客戶端文件。

本申請(qǐng)實(shí)施例還提供了一種電子設(shè)備,包括如上所述的測試客戶端生成裝置。

由此可見,與現(xiàn)有技術(shù)相比,本申請(qǐng)?zhí)峁┝艘环N客戶端生成方法、裝置及電子設(shè)備,當(dāng)需要某一測試客戶端時(shí),將公共部分抽離出來得到相應(yīng)的客戶端模板文件,之后,將按照預(yù)設(shè)要求將其thrifit文件轉(zhuǎn)化成測試數(shù)據(jù)文件以及測試場景文件,那么,用戶可以根據(jù)測試需要,在該測試數(shù)據(jù)文件中填寫測試數(shù)據(jù),并在該測試場景文件中填寫相應(yīng)的測試接口驗(yàn)證參數(shù),從而根據(jù)預(yù)設(shè)數(shù)據(jù)變化接口文件、客戶端模板文件以及編譯腳本模板文件,利用得到的目標(biāo)測試數(shù)據(jù)文件和目標(biāo)測試場景文件,自動(dòng)生成測試客戶端的可執(zhí)行文件,即得到測試客戶端。由此可見,本申請(qǐng)利用模板文件,不需要根據(jù)不同測試場景編寫測試客戶端,只需要用戶填寫需要的一些數(shù)據(jù),大大減少了工作量,提高了工作效率。

附圖說明

為了更清楚地說明本發(fā)明實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對(duì)實(shí)施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動(dòng)的前提下,還可以根據(jù)提供的附圖獲得其他的附圖。

圖1為本申請(qǐng)實(shí)施例提供的一種測試客戶端生成方法的流程圖;

圖2為本申請(qǐng)實(shí)施例提供的另一種測試客戶端生成方法的流程圖;

圖3為本申請(qǐng)實(shí)施例提供的一種測試客戶端生成裝置的結(jié)構(gòu)框圖;

圖4為本申請(qǐng)實(shí)施例提供的另一種測試客戶端生成裝置的結(jié)構(gòu)框圖;

圖5為本申請(qǐng)實(shí)施例提供的又一種測試客戶端生成裝置的結(jié)構(gòu)框圖;

圖6為本申請(qǐng)實(shí)施例提供的又一種測試客戶端生成裝置的結(jié)構(gòu)框圖;

圖7為本申請(qǐng)實(shí)施例提供的一種電子設(shè)備的硬件結(jié)構(gòu)圖。

具體實(shí)施方式

下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對(duì)本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例僅僅是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。

在實(shí)際應(yīng)用中,thrift系統(tǒng)架構(gòu)通常都是實(shí)現(xiàn)客戶端/服務(wù)器模式,通過代碼生成工具(即下文編譯工具),將接口定義文件生成服務(wù)器端和客戶端代碼(可以為不同語言),從而實(shí)現(xiàn)服務(wù)端和客戶端跨語言的支持。并且,用戶可以在thirft文件中聲明自己的服務(wù),這些服務(wù)經(jīng)過編譯后會(huì)生成相應(yīng)語言的代碼文件,然后用戶實(shí)現(xiàn)服務(wù)(客戶端調(diào)用服務(wù),服務(wù)器端提服務(wù))便可以了。

其中,thrift類型系統(tǒng)可以包括預(yù)定義基本類型,用戶自定義結(jié)構(gòu)體,容器類型,異常和服務(wù)定義,關(guān)于thrift文件的內(nèi)容可以參照下文相應(yīng)部分的描述,本實(shí)施例在此不作詳述。

并且,結(jié)構(gòu)體可以由一系列域組成,每個(gè)域有唯一整數(shù)標(biāo)識(shí)符,類型,名字和可選的缺省參數(shù)組成,每個(gè)域有一個(gè)唯一的,正整數(shù)標(biāo)識(shí)符,每個(gè)域可以標(biāo)識(shí)為required或者optional。而且,一個(gè)thrift中可定義多個(gè)結(jié)構(gòu)體,并存在引用關(guān)系,結(jié)構(gòu)體可以包含其他結(jié)構(gòu)體

在本申請(qǐng)中,規(guī)范的struct定義中的每個(gè)域均會(huì)使用required或者optional關(guān)鍵字進(jìn)行標(biāo)識(shí)。如果required標(biāo)識(shí)的域沒有賦值,thrift將給予提示。如果optional標(biāo)識(shí)的域沒有賦值,該域?qū)⒉粫?huì)被序列化傳輸;如果某個(gè)optional標(biāo)識(shí)域有缺省值而用戶沒有重新賦值,則該域的值一直為缺省值。

為了使本發(fā)明的上述目的、特征和優(yōu)點(diǎn)能夠更加明顯易懂,下面結(jié)合附圖和具體實(shí)施方式對(duì)本發(fā)明作進(jìn)一步詳細(xì)的說明。

參照?qǐng)D1,為本申請(qǐng)實(shí)施例提供的一種測試客戶端生成方法的流程圖,該方法可以由編譯工具實(shí)現(xiàn),本申請(qǐng)對(duì)該編譯工具的內(nèi)容不作限定,該方法可以包括以下步驟:

步驟s11,獲得針對(duì)測試客戶端編寫的thrift文件;

在本實(shí)施例中,當(dāng)需要編寫一個(gè)測試客戶端時(shí),該thrift文件可以定義該測試客戶端與服務(wù)器或其他客戶端進(jìn)行通信的通信接口以及通訊規(guī)則等,本申請(qǐng)對(duì)該thrift文件的具體生成方式以及包含的具體內(nèi)容不作限定。

需要說明的是,針對(duì)測試場景得到的不同測試客戶端或者是同一測試客戶端的不同服務(wù)需求,所生成的thrift文件可以不同。

可選的,在實(shí)際應(yīng)用中,預(yù)設(shè)的thrift文件可以為如下所示的代碼文件,但并不局限于此:

由上述代碼文件可知,thrift文件中包含有結(jié)構(gòu)體struct以及服務(wù)接口service兩部分,但并不局限于,而且該thrift文件包含的結(jié)構(gòu)體以及服務(wù)接口相關(guān)信息可以根據(jù)測試場景的需要確定,也可以說是需要編寫的測試客戶端將要實(shí)現(xiàn)的測試功能確定,本申請(qǐng)對(duì)此不作詳述。

步驟s12,將thrift文件轉(zhuǎn)化為預(yù)設(shè)數(shù)據(jù)交換格式的待處理文件;

可選的,本實(shí)施例可以采用json定義方式確定該待處理文件,即預(yù)設(shè)數(shù)據(jù)交換格式可以是json定義,但并不局限于此。

其中,json是一種輕量級(jí)的數(shù)據(jù)交換格式,具有良好的可讀和便于快速編寫的特性,可以在不同平臺(tái)之間進(jìn)行數(shù)據(jù)交換;由于該格式都是壓縮的,占用帶寬小,能夠支持多種語言,且能夠直接為服務(wù)器端代碼使用,大大簡化了服務(wù)器端和客戶端的代碼開發(fā)量。

基于此,仍以上文給出的thrift文件為例,本實(shí)施例可以將其轉(zhuǎn)化為json(javascriptobjectnotation)定義,如下所示的代碼文件:

通過上述待處理文件的代碼內(nèi)容,可以直接得知其可以填寫測試數(shù)據(jù)以及相應(yīng)服務(wù)接口信息等,本申請(qǐng)?jiān)诖瞬蛔髟斒觥?/p>

步驟s13,獲得待處理文件中定義的結(jié)構(gòu)體信息以及服務(wù)接口信息;

本實(shí)施例中,待處理文件中的結(jié)構(gòu)體信息以及服務(wù)接口信息與thrift文件中的結(jié)構(gòu)體信息以及服務(wù)接口信息對(duì)應(yīng)相同,兩者只是在待處理文件和thrift文件中的表示方式或描述方式不同。

以上述列舉實(shí)施進(jìn)行說明,在上述thrift文件中的結(jié)構(gòu)體信息可以包括上述代碼文件中的heartbeatinfo的相關(guān)信息,服務(wù)接口信息可以包括上述代碼文件中的baseservice的相關(guān)信息,需要說明的是,thrift文件的struct和service并不局限于上述代碼文件記載的內(nèi)容,在實(shí)際應(yīng)用中,針對(duì)要生成的不同客戶端所需的thrift文件是不同的,對(duì)應(yīng)的struct和service內(nèi)容也是不同的,本申請(qǐng)?jiān)诖瞬蛔饕灰辉斒觥?/p>

相應(yīng)地,在對(duì)thrift文件進(jìn)行轉(zhuǎn)換處理得到的待處理文件中,其包含的結(jié)構(gòu)體信息可以是上述待處理文件的代碼文件中的"structs"中的相關(guān)信息,服務(wù)接口信息則是"services"中的相關(guān)信息,本申請(qǐng)對(duì)待處理文件包含的結(jié)構(gòu)體信息以及服務(wù)接口信息的具體內(nèi)容不作一一詳述。

步驟s14,利用結(jié)構(gòu)體信息生成測試數(shù)據(jù)文件,并利用服務(wù)接口信息生成測試場景文件。

在本申請(qǐng)中,可以將thrift文件中定義的復(fù)雜類型轉(zhuǎn)換為xml(extensiblemarkuplanguage,可擴(kuò)展標(biāo)記語言)描述的數(shù)據(jù)定義,以便進(jìn)行后續(xù)操作,如上文描述,可以將thrift文件轉(zhuǎn)化為待處理文件,再轉(zhuǎn)換為xml需要說明的是,對(duì)于thrift文件中的基本數(shù)據(jù)類型可以直接在xml中填寫,不需要展開描述。

在本申請(qǐng)中,測試數(shù)據(jù)文件可以是thrift文件轉(zhuǎn)換的自定義xml數(shù)據(jù)定義文件,用于用戶填寫測試數(shù)據(jù),測試場景文件也可以是定義測試場景和接口驗(yàn)證的xml文件,用于用戶填寫測試接口驗(yàn)證參數(shù)。其中,所填寫數(shù)據(jù)內(nèi)容可以根據(jù)具體的rpc服務(wù)的測試要求確定,本申請(qǐng)?jiān)诖瞬蛔髟斒觥?/p>

由此可見,本申請(qǐng)通過將thrift文件轉(zhuǎn)換為填寫測試數(shù)據(jù)的模板文件即測試數(shù)據(jù)文件,以及填寫測試接口驗(yàn)證參數(shù)的模板文件即測試場景文件,用戶可以根據(jù)實(shí)際測試場景的要求,在當(dāng)前顯示的測試數(shù)據(jù)文件和測試場景文件中對(duì)應(yīng)文件填寫相應(yīng)數(shù)據(jù)內(nèi)容,簡單方便,解決了現(xiàn)有技術(shù)中,在使用thrift文件轉(zhuǎn)化的接口編寫客戶端,對(duì)測試場景、測試數(shù)據(jù)以及驗(yàn)證數(shù)據(jù)沒有指定統(tǒng)一的規(guī)則,不易使用戶理解及交互的技術(shù)問題。

步驟s15,檢測用戶按照該測試數(shù)據(jù)文件針對(duì)測試客戶端輸入的測試數(shù)據(jù),以及按照測試場景文件針對(duì)測試客戶端輸入的測試接口驗(yàn)證參數(shù);

如上述分析,測試數(shù)據(jù)文件和測試場景文件都是模板文件,用戶可以根據(jù)本次測試場景的需要,輸入所需的測試數(shù)據(jù)以及對(duì)應(yīng)的測試接口驗(yàn)證參數(shù)。

其中,測試數(shù)據(jù)文件中結(jié)構(gòu)體成員信息都屬于基本數(shù)據(jù)類型信息,其包括了基本數(shù)據(jù)類型信息的變化規(guī)則。

步驟s16,利用檢測到的測試數(shù)據(jù)配置測試數(shù)據(jù)文件,獲得目標(biāo)測試數(shù)據(jù)文件,并利用檢測到的相應(yīng)的測試接口驗(yàn)證參數(shù)配置測試場景文件,獲得目標(biāo)測試場景文件;

步驟s17,利用預(yù)設(shè)數(shù)據(jù)變化接口文件,以及目標(biāo)測試數(shù)據(jù)文件中定義的基本數(shù)據(jù)類型變化規(guī)則,生成目標(biāo)數(shù)據(jù)變化規(guī)則文件;

根據(jù)上文對(duì)測試數(shù)據(jù)文件的分析得知,測試數(shù)據(jù)文件中包含有基本數(shù)據(jù)類型的變化規(guī)則,所以,在確定目標(biāo)測試數(shù)據(jù)文件后,可以從中提取所有基本數(shù)據(jù)類型變化規(guī)則信息,并結(jié)合預(yù)設(shè)的數(shù)據(jù)變化接口文件,生成目標(biāo)數(shù)據(jù)變化規(guī)則文件。

可選的,在實(shí)際應(yīng)用中,可以通過遍歷目標(biāo)測試數(shù)據(jù)文件中的結(jié)構(gòu)體信息,若其結(jié)構(gòu)體成員的datareg屬性有定義,從預(yù)設(shè)數(shù)據(jù)變化接口文件中調(diào)用相應(yīng)接口的參數(shù)對(duì)該結(jié)構(gòu)體成員的datareg屬性賦值;若該datareg屬性沒有定義,則可以利用用戶填寫的值對(duì)其進(jìn)行賦值。之后,再利用目標(biāo)測試數(shù)據(jù)文件中定義的基本數(shù)據(jù)變化規(guī)則,生成目標(biāo)數(shù)據(jù)變化規(guī)則文件。

本實(shí)施例中,目標(biāo)數(shù)據(jù)變化規(guī)則文件可以用來對(duì)測試客戶端中的測試數(shù)據(jù)進(jìn)行更新及初始化,也就是說,在測試客戶端運(yùn)行時(shí),根據(jù)需要可以從該目標(biāo)數(shù)據(jù)變化規(guī)則文件中調(diào)取對(duì)應(yīng)接口的變化規(guī)則,得到測試數(shù)據(jù),具體應(yīng)用過程不作限定。

步驟s18,利用目標(biāo)測試數(shù)據(jù)文件和目標(biāo)測試場景文件,根據(jù)預(yù)設(shè)客戶端模板文件,獲得測試客戶端文件;

在本實(shí)施例中,通過遍歷目標(biāo)測試場景文件中每個(gè)服務(wù)接口定義,可以獲得每個(gè)接口的返回值、函數(shù)名屬性、調(diào)用次數(shù)、參數(shù)、回調(diào)函數(shù)類型、是否驗(yàn)證等信息,從而根據(jù)這些信息在預(yù)設(shè)客戶端模板文件的對(duì)應(yīng)區(qū)域直接插入回調(diào)函數(shù)信息、接口調(diào)用信息,得到用戶定義的測試客戶端文件。

其中,預(yù)設(shè)客戶端模板文件可以是通過對(duì)這類測試客戶端的可執(zhí)行文件或編譯文件進(jìn)行共性分析,從而將測試客戶端共有部分抽離出來,生成模板文件。這樣,當(dāng)測試場景比較多,即rpc服務(wù)多樣化的情況下,不需要一一編寫測試客戶端,只需要用戶填寫針對(duì)各測試場景的測試數(shù)據(jù)及其對(duì)應(yīng)的服務(wù)接口驗(yàn)證信息,即可生成不同的測試客戶端,簡單且方面,降低了客戶端編寫成本,提高了客戶端生成效率。

步驟s19,利用預(yù)設(shè)編譯腳本模板文件和所述測試客戶端文件,根據(jù)所述目標(biāo)數(shù)據(jù)變化規(guī)則文件,編譯得到所述測試客戶端的可執(zhí)行文件;

步驟s110,執(zhí)行測試客戶端的可執(zhí)行文件,獲得所述測試客戶端的測試結(jié)果。

在本申請(qǐng)中,通過編譯工具利用測試客戶端文件,替換或填寫預(yù)設(shè)編譯腳本模板文件,生成測試客戶端的可執(zhí)行文件,以實(shí)現(xiàn)測試客戶端的測試功能,得到測試結(jié)果。并且,根據(jù)實(shí)際需要可以將測試結(jié)果輸出,和/或?qū)y試結(jié)果進(jìn)行驗(yàn)證,從而根據(jù)驗(yàn)證結(jié)果輸出相應(yīng)的提示信息。

其中,需要說明的是,本申請(qǐng)對(duì)如何利用編譯腳本編譯得到可執(zhí)行文件的具體實(shí)現(xiàn)方法不作限定。

綜上,對(duì)于任意具體的rpc服務(wù),在利用thrift文件定義的接口編寫測試客戶端進(jìn)行性能與功能驗(yàn)證時(shí),本申請(qǐng)不需要編寫整個(gè)測試客戶端代碼,以獲得測試客戶端的可執(zhí)行文件,而是利用測試客戶端的模板文件,由用戶直接根據(jù)測試場景的需要,直接在thrift文件轉(zhuǎn)化得到的測試數(shù)據(jù)文件和測試場景文件中填寫相應(yīng)的數(shù)據(jù),即可自動(dòng)編譯得到測試客戶端的可執(zhí)行文件,具有很強(qiáng)的復(fù)用性,簡單且方便,大大減少了工作量,提高了測試效率。

如圖2所示,為本申請(qǐng)實(shí)施例提供的另一種測試客戶端生成方法的流程圖,如上述實(shí)施例相同,本實(shí)施例可以由編譯工具實(shí)現(xiàn),具體可以包括以下步驟:

步驟s21,獲得針對(duì)測試客戶端編寫的thrift文件;

在本實(shí)施例中,可以將用戶填寫的針對(duì)測試客戶端的thrift文件的文件名、thrift文件的名字空間、服務(wù)名、thrift文件路徑等信息填寫到編譯工具的配置文件,這樣,編譯工具可以根據(jù)該配置文件的這些內(nèi)容,獲得相應(yīng)的thrift文件,實(shí)現(xiàn)對(duì)測試客戶端的自動(dòng)編譯。

步驟s22,將thrift文件轉(zhuǎn)化為預(yù)設(shè)數(shù)據(jù)交換格式的待處理文件;

步驟s23,獲得待處理文件中定義的結(jié)構(gòu)體信息以及服務(wù)接口信息;

步驟s24,利用預(yù)設(shè)定義規(guī)則對(duì)結(jié)構(gòu)體信息進(jìn)行處理,得到相應(yīng)的結(jié)構(gòu)體成員信息;

可選的,在本實(shí)施例中,對(duì)于獲得的結(jié)構(gòu)體信息,可以將存在的每一個(gè)結(jié)構(gòu)體的結(jié)構(gòu)體成員依次展開并作為并列節(jié)點(diǎn),且將結(jié)構(gòu)體成員變量名稱作為相應(yīng)節(jié)點(diǎn)名。

其中,本申請(qǐng)對(duì)得到的結(jié)構(gòu)體成員信息包含的具體內(nèi)容不作限定,可以包括數(shù)據(jù)類型、索引、變化規(guī)則等等。

步驟s25,檢測確定的結(jié)構(gòu)體成員信息是否屬于基本數(shù)據(jù)類型信息,如果否,返回步驟s24;如果是,進(jìn)入步驟s26;

在本申請(qǐng)中,需要確定所得結(jié)構(gòu)體成員信息不再包含有結(jié)構(gòu)體,都屬于基本數(shù)據(jù)類型,如短整型short、整型int、長整型long、單精度型float、雙精度型double以及字符類型char等等,以保證后續(xù)步驟的順利進(jìn)行。

繼上文描述,將結(jié)構(gòu)體展開得到的結(jié)構(gòu)體成員中,若仍包含有結(jié)構(gòu)體,可以按照上述方式繼續(xù)展開,直至所得結(jié)構(gòu)體成員即結(jié)構(gòu)體節(jié)點(diǎn)都是基本數(shù)據(jù)類型為止。

步驟s26,提取滿足第一預(yù)設(shè)要求的基本數(shù)據(jù)類型信息,生成測試數(shù)據(jù)文件;

其中,第一預(yù)設(shè)要求包含的具體內(nèi)容可以根據(jù)將要編寫的測試客戶端的具體測試需要確定,也就是說,根據(jù)不同的測試場景需要,所確定的第一預(yù)設(shè)要求的內(nèi)容可以不同,進(jìn)而提取的基本數(shù)據(jù)類型信息的也就不同,從而得到的測試數(shù)據(jù)文件不同,本申請(qǐng)對(duì)第一預(yù)設(shè)要求包含的具體內(nèi)容不作限定。

仍以上述實(shí)施例給出的thrift文件為例進(jìn)行說明,由上述代碼文件可以得知,該thrift文件包括一個(gè)結(jié)構(gòu)體heartbeat,按照上述對(duì)結(jié)構(gòu)體信息的處理過程,可以得到如下所述的測試數(shù)據(jù)文件,即自定義xml數(shù)據(jù)定義文件,以便用戶填寫所需的測試數(shù)據(jù)。其中,該測試數(shù)據(jù)文件可以為:

由上文給出的測試數(shù)據(jù)文件的代碼內(nèi)容可知,其與上述待處理文件中的結(jié)構(gòu)體信息內(nèi)容基本一致,所以說,本申請(qǐng)將thrift文件轉(zhuǎn)化為json文件后,可以通過對(duì)其文件內(nèi)容進(jìn)行解析,得到所需的測試數(shù)據(jù)文件。

需要說明的是,為了滿足不同的測試需要,提取的基本數(shù)據(jù)類型信息內(nèi)容不同時(shí),所得測試數(shù)據(jù)文件也會(huì)相應(yīng)改變,并不局限于上文描述的代碼文件。

其中,上述代碼文件中,datareg表示基本數(shù)據(jù)類型變化規(guī)則,如遞增,遞減,隨機(jī),不變等等,用于根據(jù)該變化規(guī)則產(chǎn)生測試數(shù)據(jù);index表示結(jié)構(gòu)體成員變量在結(jié)構(gòu)體中的索引;optional表示結(jié)構(gòu)體成員是否選中,與thrift文件中結(jié)構(gòu)體成員變量的require,optional表示含義一致;type表示結(jié)構(gòu)體成員的數(shù)據(jù)類型。

步驟s27,根據(jù)服務(wù)接口信息,確定遠(yuǎn)程過程調(diào)用接口信息以及對(duì)應(yīng)的接口驗(yàn)證信息;

在本實(shí)施例中,可以從待處理文件中服務(wù)接口信息即上述"services"包含的信息中,確定其包含的所有遠(yuǎn)程過程調(diào)用接口信息即所有rpclist節(jié)點(diǎn),以及所有接口驗(yàn)證信息即所有checklist節(jié)點(diǎn),其中,rpclist節(jié)點(diǎn)與checklist節(jié)點(diǎn)之間是一一對(duì)應(yīng)的。

可選的,上述遠(yuǎn)程過程調(diào)用接口信息可以包括接口請(qǐng)求發(fā)送順序、接口參數(shù)順序及類型標(biāo)簽、接口調(diào)用次數(shù)、接口名稱、接口返回類型等等,則接口驗(yàn)證信息可以包括驗(yàn)證接口的驗(yàn)證值、驗(yàn)證接口名、是否驗(yàn)證以及接口返回類型等等。本申請(qǐng)對(duì)上述遠(yuǎn)程過程調(diào)用接口信息以及對(duì)應(yīng)的接口驗(yàn)證信息包含的具體內(nèi)容不作限定。

步驟s28,提取滿足第二預(yù)設(shè)要求的遠(yuǎn)程過程調(diào)用接口信息以及對(duì)應(yīng)的接口驗(yàn)證信息,生成測試場景文件;

需要說明的是,該第二預(yù)設(shè)要求可以與上述第一預(yù)設(shè)要求對(duì)應(yīng),兩者都是為了實(shí)現(xiàn)同一測試目的確定的,本申請(qǐng)對(duì)其包含的具體內(nèi)容不作限定,在實(shí)際應(yīng)用中,第二預(yù)設(shè)要求與第一預(yù)設(shè)要求可以相同,也可以不同。

仍以上述列舉的thrift文件為例進(jìn)行說明,按照上述方式得到的測試場景文件可以是如下代碼文件,但并不局限于此:

在上述代碼文件中,各rpclist節(jié)點(diǎn)可以是測試場景定義,子節(jié)點(diǎn)順序即接口請(qǐng)求發(fā)送順序,其中,args表示接口參數(shù)順序及類型標(biāo)簽;call_num表示接口調(diào)用次數(shù);func表示接口名稱;return_type表示接口返回類型。而該代碼文件中的各checklist節(jié)點(diǎn)可以是接口驗(yàn)證定義,其中,check_args表示驗(yàn)證接口的驗(yàn)證值;func表示驗(yàn)證接口名;is_check表示是否驗(yàn)證;return_type表示接口返回類型。

需要說明的是,當(dāng)?shù)诙A(yù)設(shè)要求不同時(shí),提取的遠(yuǎn)程過程調(diào)用接口信息以及對(duì)應(yīng)的接口驗(yàn)證信息不同,即從服務(wù)接口信息中提取的字段不同,從而生成的測試場景文件內(nèi)容不同,即生成的rpc節(jié)點(diǎn)不同,本申請(qǐng)?jiān)诖藘H以上述代碼文件為例進(jìn)行說明。

步驟s29,檢測用戶輸入的測試數(shù)據(jù)和測試接口及驗(yàn)證參數(shù),配置相應(yīng)的測試數(shù)據(jù)文件和測試場景文件,得到目標(biāo)測試數(shù)據(jù)文件以及目標(biāo)測試場景文件;

在本申請(qǐng)實(shí)際應(yīng)用中,按照上述方式得到測試數(shù)據(jù)文件以及測試場景文件之后,可以輸出所得測試數(shù)據(jù)文件以及測試場景文件,此時(shí),用戶只需要在文件空白位置填寫本次生成客戶端所需的測試數(shù)據(jù),以及測試接口與驗(yàn)證參數(shù),不需要編寫整個(gè)測試數(shù)據(jù)文件以及測試場景文件,非常方便。

仍以上文給出的測試數(shù)據(jù)文件以及測試場景文件為例進(jìn)行說明,當(dāng)需要對(duì)各接口進(jìn)行測試,并對(duì)測試結(jié)果進(jìn)行校驗(yàn)時(shí),用戶可以相應(yīng)填寫上述給出的測試數(shù)據(jù)文件中的id、version、address以及comment等信息。

根據(jù)上述測試場景的需要,可以在上述測試數(shù)據(jù)文件中填寫需要的測試數(shù)據(jù),如初始化heartbeatinfo的結(jié)構(gòu)體變量中的id和address兩個(gè)結(jié)構(gòu)體成員信息,即iddatareg="random",即id隨機(jī)生成;addressdatareg="static_5",即address固定的5個(gè)字符。其中,對(duì)于用戶填寫后的目標(biāo)測試數(shù)據(jù)文件的代碼文件,本申請(qǐng)?jiān)诖瞬辉倭信e。

同理,用戶可以根據(jù)測試場景的需要,填寫測試場景文件服務(wù)接口信息,如rpcargs1.i64="1",rpcargs1.enum.testseq="testid_1",rpcargs1.string="test_bool",<rpcargs1.byte="0x01",<rpcargs1.i32="2",<rpcargs1.double="3.14",<rpccheck_args="1",<rpccheck_args="testid_2",<rpccheck_args="true",<rpccheck_args="0x02",<rpccheck_args="hello",<rpccheck_args="3.14"。對(duì)于填寫后的目標(biāo)測試場景文件的代碼內(nèi)容本實(shí)施例在此不再贅述。

根據(jù)上述各代碼文件可知,測試場景依次調(diào)用了heartbeat、test_enum、test_complex、test_byte、test_string以及test_double接口各一次,并填寫了相應(yīng)的參數(shù),且使用了測試數(shù)據(jù)文件中定義的結(jié)構(gòu)體變量,同時(shí),由于本申請(qǐng)需要對(duì)所有接口調(diào)用返回結(jié)果進(jìn)行驗(yàn)證,還填寫了各接口的驗(yàn)證值即上述代碼文件中check_char的值,但并不局限于上述代碼文件記載的內(nèi)容。

s210,利用預(yù)設(shè)數(shù)據(jù)變化接口文件,以及目標(biāo)測試數(shù)據(jù)文件中定義的基本數(shù)據(jù)類型變化規(guī)則,生成目標(biāo)數(shù)據(jù)變化規(guī)則文件;

仍以上述用戶填寫的目標(biāo)測試數(shù)據(jù)文件對(duì)應(yīng)的代碼文件為例進(jìn)行說明,提取其包括的基本數(shù)據(jù)類型變化規(guī)則,生成的目標(biāo)數(shù)據(jù)變化規(guī)則文件可以是如下所示的代碼文件,但并不局限于該代碼文件。

可選的,在實(shí)際應(yīng)用中,可以通過遍歷目標(biāo)測試數(shù)據(jù)文件記錄每個(gè)結(jié)構(gòu)體成員信息即基本數(shù)據(jù)類型信息,檢測該基本數(shù)據(jù)類型信息中是否存在對(duì)基本數(shù)據(jù)類型變化規(guī)則的定義,若存在,利用定義的基本數(shù)據(jù)類型變化規(guī)則,調(diào)用相應(yīng)接口并對(duì)其賦值;若不存在,可以由用戶根據(jù)變量類型以及初始值對(duì)相應(yīng)接口進(jìn)行賦值,從而確定相應(yīng)的目標(biāo)數(shù)據(jù)變化規(guī)則文件。

需要說明的是,本申請(qǐng)對(duì)目標(biāo)數(shù)據(jù)變化規(guī)則文件的具體生成過程不作限定。

步驟s211,解析目標(biāo)測試數(shù)據(jù)文件以及目標(biāo)測試場景文件,確定相應(yīng)的回調(diào)函數(shù)信息以及接口調(diào)用信息。

需要說明的是,本申請(qǐng)對(duì)解析測試數(shù)據(jù)文件以及測試場景文件,確定相應(yīng)的回調(diào)函數(shù)以及接口調(diào)用函數(shù)的代碼文件的實(shí)現(xiàn)方法不作限定,且對(duì)于得到的回調(diào)函數(shù)以及接口調(diào)用函數(shù)的代碼文件的內(nèi)容本實(shí)施例在此不作詳述。

步驟s212,將得到的回調(diào)函數(shù)信息以及場景調(diào)用信息嵌入預(yù)設(shè)客戶端模板文件,得到測試客戶端文件;

步驟s213,利用預(yù)設(shè)編譯腳本模板文件和所述測試客戶端文件,根據(jù)所述目標(biāo)數(shù)據(jù)變化規(guī)則文件,編譯得到測試客戶端的可執(zhí)行文件;

在實(shí)際應(yīng)用中,為了實(shí)現(xiàn)測試場景的測試,用戶可以根據(jù)實(shí)際測試需要,將針對(duì)測試客戶端的性能測試參數(shù)添加到上述配置文件中,以便測試客戶端基于這些性能測試參數(shù)運(yùn)行,并完成測試場景的測試任務(wù)。

其中,性能測試參數(shù)可以包括連接方式、連接數(shù)量、發(fā)送速率、請(qǐng)求數(shù)量、統(tǒng)計(jì)周期等等,本申請(qǐng)對(duì)此不作限定,可以根據(jù)實(shí)際測試需要確定,本申請(qǐng)?jiān)诖瞬辉僖灰辉斒觥?/p>

步驟s214,執(zhí)行測試客戶端的可執(zhí)行文件,得到測試結(jié)果。

基于上述分析,本申請(qǐng)只需要用戶填寫當(dāng)前測試場景需要的相關(guān)數(shù)據(jù),不需要編寫整個(gè)測試客戶端的代碼,來獲得可執(zhí)行文件,大大降低了代碼編寫工作量,提高了工作效率。

如圖3所示,本申請(qǐng)實(shí)施例提供了一種測試客戶端生成裝置的結(jié)構(gòu)框圖,該裝置可以包括:

文件獲得模塊31,用于獲得針對(duì)測試客戶端編寫的thrift文件;

文件轉(zhuǎn)化模塊32,用于按照預(yù)設(shè)要求將所述thrift文件轉(zhuǎn)化成測試數(shù)據(jù)文件以及測試場景文件;

本實(shí)施例中,關(guān)于thrift文件及其轉(zhuǎn)化得到的測試數(shù)據(jù)文件和測試場景文件的內(nèi)容,可以參照上述方法實(shí)施例對(duì)應(yīng)部分的描述,本實(shí)施例在此不再詳述。

目標(biāo)文件配置模塊33,用于利用獲得的針對(duì)所述測試客戶端的配置文件,對(duì)所述測試數(shù)據(jù)文件和所述測試場景文件進(jìn)行配置,得到目標(biāo)測試數(shù)據(jù)文件以及目標(biāo)測試場景文件;

其中,配置文件包括填寫的針對(duì)所述測試客戶端的測試功能的測試數(shù)據(jù),以及實(shí)現(xiàn)所述測試功能的測試接口驗(yàn)證參數(shù);

文件生成模塊34,用于根據(jù)預(yù)設(shè)數(shù)據(jù)變化接口文件和預(yù)設(shè)客戶端模板文件,利用所述目標(biāo)測試數(shù)據(jù)文件和所述目標(biāo)測試場景文件,生成測試客戶端文件。

在本實(shí)施例中,為了根據(jù)用戶填寫的數(shù)據(jù)信息,自動(dòng)生成測試客戶端文件,上述文件編譯模塊34可以包括:

規(guī)則文件生成單元,用于利用所述目標(biāo)測試數(shù)據(jù)文件中定義的基本數(shù)據(jù)類型變化規(guī)則以及預(yù)設(shè)數(shù)據(jù)變化接口文件,生成目標(biāo)數(shù)據(jù)變化規(guī)則文件;

測試客戶端文件獲得單元,用于利用所述目標(biāo)測試數(shù)據(jù)文件和所述目標(biāo)測試場景文件,根據(jù)預(yù)設(shè)客戶端模板文件,獲得測試客戶端文件。

在本實(shí)施中,該測試客戶端文件獲得單元可以包括:

解析子單元,用于解析所述目標(biāo)測試數(shù)據(jù)文件以及所述目標(biāo)測試場景文件,確定的相應(yīng)的回調(diào)函數(shù)信息以及接口調(diào)用信息;

信息嵌入子單元,用于將得到的所述回調(diào)函數(shù)信息以及所述接口調(diào)用信息嵌入所述客戶端的預(yù)設(shè)模板文件,獲得測試客戶端文件。

其中,上述實(shí)施例中測試客戶端文件的具體生成過程可以參照上述方法實(shí)施例對(duì)應(yīng)部分的描述,本實(shí)施例在此不再贅述。

作為本申請(qǐng)另一實(shí)施例,在上述實(shí)施例的基礎(chǔ)上,得到測試客戶端文件后,可以通過編譯器,編譯得到相應(yīng)的可執(zhí)行文件,所以,如圖4所示,裝置還可以包括:

文件編譯模塊35,用于利用預(yù)設(shè)編譯腳本模板文件和所述測試客戶端文件,編譯得到所述測試客戶端的可執(zhí)行文件;

測試模塊36,用于執(zhí)行所述測試可執(zhí)行文件,獲得所述測試客戶端的測試結(jié)果

可選的,如圖5所示,該文件轉(zhuǎn)化模塊32可以包括:

第一文件生成單元321,用于利用所述thrift文件中定義的結(jié)構(gòu)體信息,生成測試數(shù)據(jù)文件;

第二文件生成單元322,用于利用所述thrift文件中定義的服務(wù)接口信息,生成測試場景文件。

在本實(shí)施例中,如圖6所示,該第一文件生成單元321可以包括:

信息處理單元3211,利用預(yù)設(shè)定義規(guī)則對(duì)所述thrift文件中定義的結(jié)構(gòu)體信息進(jìn)行處理,得到相應(yīng)的結(jié)構(gòu)體成員信息;

檢測單元3212,用于檢測確定的所述結(jié)構(gòu)體成員信息是否屬于基本數(shù)據(jù)類型信息;如果否,觸發(fā)所述信息處理單元利用所述預(yù)設(shè)定義規(guī)則繼續(xù)對(duì)不屬于基本數(shù)據(jù)類型信息的結(jié)構(gòu)體成員信息進(jìn)行處理,直至所述檢測單元得到的所述結(jié)構(gòu)體成員信息都屬于基本數(shù)據(jù)類型信息;

第一信息提取單元3213,用于提取滿足第一預(yù)設(shè)要求的基本數(shù)據(jù)類型信息,生成測試數(shù)據(jù)文件。

另外,參照?qǐng)D6,第二文件生成單元322可以包括:

信息確定單元3221,用于利用所述thrift文件中定義的服務(wù)接口信息,確定遠(yuǎn)程調(diào)用接口信息以及對(duì)應(yīng)的接口驗(yàn)證信息;

第二信息提取單元3222,用于提取滿足第二預(yù)設(shè)要求的遠(yuǎn)程調(diào)用接口信息以及對(duì)應(yīng)的接口驗(yàn)證信息,生成測試場景文件。

綜上所述,當(dāng)需要實(shí)現(xiàn)某rpc服務(wù)的測試,編寫相應(yīng)的測試客戶端時(shí),本實(shí)施例將通過客戶端模板文件,由用戶直接填寫所需要的測試數(shù)據(jù)及其對(duì)應(yīng)的服務(wù)接口驗(yàn)證信息,并據(jù)此實(shí)現(xiàn)對(duì)客戶端模板文件的配置,得到所需要的測試客戶端,進(jìn)而完成對(duì)對(duì)rpc服務(wù)的性能以及功能的驗(yàn)證,不需要用戶編寫整個(gè)測試客戶端的代碼文件,大大減少了工作量,提高了測試效率。

本申請(qǐng)實(shí)施例還提供了一種電子設(shè)備,其可以包括如上述裝置實(shí)施例描述的測試客戶端生成裝置,關(guān)于其組成結(jié)構(gòu)及其功能,可以參照上述裝置實(shí)施例的描述,本實(shí)施例在此不再詳述。

其中,在實(shí)際應(yīng)用中,電子設(shè)備具體可以是電腦、工控機(jī)等可以裝載編譯工具的設(shè)備,本申請(qǐng)對(duì)該電子設(shè)備的具體產(chǎn)品類型不作限定。

如圖7所示,本申請(qǐng)實(shí)施例還提供的一種電子設(shè)備的硬件結(jié)構(gòu)框圖,該系統(tǒng)可以包括:處理器71、存儲(chǔ)器72、顯示器73、通信接口74以及通信總線75;

其中,處理器71、存儲(chǔ)器72、顯示器73以及通信接口74通過通信總線65完成相互間的通信。

可選的,該通信接口74可以是usb接口或者其他串口等等。

處理器71,用于執(zhí)行程序;

存儲(chǔ)器72,用于存放程序以及獲得的各種數(shù)據(jù)等;

顯示器73,可以用于顯示性能測試結(jié)果以及測試過程等;

在本實(shí)施例中,該處理器71可以是中央處理器cpu,或者是特定集成電路asic(applicationspecificintegratedcircuit),或者是被配置成實(shí)施本發(fā)明實(shí)施例的一個(gè)或多個(gè)集成電路。

存儲(chǔ)器72可以包含高速ram存儲(chǔ)器,也可能還包括非易失性存儲(chǔ)器(non-volatilememory),例如至少一個(gè)磁盤存儲(chǔ)器等。

其中,上述程序可具體用于:

得針對(duì)測試客戶端編寫的thrift文件;

按照預(yù)設(shè)要求將所述thrift文件轉(zhuǎn)化成測試數(shù)據(jù)文件以及測試場景文件;

利用獲得的針對(duì)所述測試客戶端的配置文件,對(duì)所述測試數(shù)據(jù)文件和所述測試場景文件進(jìn)行配置,得到目標(biāo)測試數(shù)據(jù)文件以及目標(biāo)測試場景文件,所述配置文件包括填寫的針對(duì)所述測試客戶端的測試功能的測試數(shù)據(jù),以及實(shí)現(xiàn)所述測試功能的測試接口驗(yàn)證參數(shù);

根據(jù)預(yù)設(shè)數(shù)據(jù)變化接口文件和預(yù)設(shè)客戶端模板文件,利用所述目標(biāo)測試數(shù)據(jù)文件和所述目標(biāo)測試場景文件,生成測試客戶端文件。

利用預(yù)設(shè)編譯腳本模板文件和所述測試客戶端文件,編譯得到所述測試客戶端的可執(zhí)行文件;

執(zhí)行所述測試客戶端的可執(zhí)行文件,獲得所述測試客戶端的測試結(jié)果。

綜上,本實(shí)施例利用可復(fù)用的模板文件,由用戶直接填寫針對(duì)當(dāng)前測試場景的數(shù)據(jù),即可得到測試客戶端,不需要編譯整個(gè)測試客戶端的代碼,大大減少了工作量,提高了測試效率。

此外,需要說明的是,關(guān)于上述各實(shí)施例中,諸如第一、第二等之類的關(guān)系術(shù)語僅僅用來將一個(gè)操作、單元或模塊與另一個(gè)操作、單元或模塊區(qū)分開來,而不一定要求或者暗示這些單元、操作或模塊之間存在任何這種實(shí)際的關(guān)系或者順序。而且,術(shù)語“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的過程、方法或者系統(tǒng)不僅包括那些要素,而且還包括沒有明確列出的其他要素,或者是還包括為這種過程、方法或者系統(tǒng)所固有的要素。在沒有更多限制的情況下,由語句“包括一個(gè)……”限定的要素,并不排除在包括所述要素的過程、方法或者系統(tǒng)中還存在另外的相同要素。

本說明書中各個(gè)實(shí)施例采用遞進(jìn)的方式描述,每個(gè)實(shí)施例重點(diǎn)說明的都是與其他實(shí)施例的不同之處,各個(gè)實(shí)施例之間相同相似部分互相參見即可。對(duì)于實(shí)施例公開的裝置而言,由于其與實(shí)施例公開的方法對(duì)應(yīng),所以描述的比較簡單,相關(guān)之處參見方法部分說明即可。

專業(yè)人員還可以進(jìn)一步意識(shí)到,結(jié)合本文中所公開的實(shí)施例描述的各示例的單元及算法步驟,能夠以電子硬件、計(jì)算機(jī)軟件或者二者的結(jié)合來實(shí)現(xiàn),為了清楚地說明硬件和軟件的可互換性,在上述說明中已經(jīng)按照功能一般性地描述了各示例的組成及步驟。這些功能究竟以硬件還是軟件方式來執(zhí)行,取決于技術(shù)方案的特定應(yīng)用和設(shè)計(jì)約束條件。專業(yè)技術(shù)人員可以對(duì)每個(gè)特定的應(yīng)用來使用不同方法來實(shí)現(xiàn)所描述的功能,但是這種實(shí)現(xiàn)不應(yīng)認(rèn)為超出本發(fā)明的范圍。

結(jié)合本文中所公開的實(shí)施例描述的方法或算法的步驟可以直接用硬件、處理器執(zhí)行的軟件模塊,或者二者的結(jié)合來實(shí)施。軟件模塊可以置于隨機(jī)存儲(chǔ)器(ram)、內(nèi)存、只讀存儲(chǔ)器(rom)、電可編程rom、電可擦除可編程rom、寄存器、硬盤、可移動(dòng)磁盤、cd-rom、或技術(shù)領(lǐng)域內(nèi)所公知的任意其它形式的存儲(chǔ)介質(zhì)中。

對(duì)所公開的實(shí)施例的上述說明,使本領(lǐng)域?qū)I(yè)技術(shù)人員能夠?qū)崿F(xiàn)或使用本發(fā)明。對(duì)這些實(shí)施例的多種修改對(duì)本領(lǐng)域的專業(yè)技術(shù)人員來說將是顯而易見的,本文中所定義的一般原理可以在不脫離本發(fā)明的精神或范圍的情況下,在其它實(shí)施例中實(shí)現(xiàn)。因此,本發(fā)明將不會(huì)被限制于本文所示的這些實(shí)施例,而是要符合與本文所公開的原理和新穎特點(diǎn)相一致的最寬的范圍。

當(dāng)前第1頁1 2 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
涟水县| 开封市| 轮台县| 青阳县| 渝中区| 长兴县| 廉江市| 金门县| 乌什县| 菏泽市| 谢通门县| 金平| 张家口市| 安平县| 舞阳县| 虞城县| 曲沃县| 阿图什市| 册亨县| 进贤县| 陵川县| 松江区| 孝感市| 于都县| 象山县| 蓬莱市| 青州市| 循化| 南召县| 洪洞县| 衡东县| 甘南县| 聂拉木县| 阿拉善右旗| 六盘水市| 麻栗坡县| 吉木萨尔县| 阿城市| 新绛县| 湘西| 察隅县|