本申請(qǐng)涉及計(jì)算機(jī)技術(shù)領(lǐng)域,尤其涉及一種數(shù)據(jù)源信息的校驗(yàn)方法及裝置。
背景技術(shù):
在互聯(lián)網(wǎng)系統(tǒng)中,當(dāng)服務(wù)端接收到客戶端的數(shù)據(jù)庫訪問請(qǐng)求時(shí),服務(wù)端通過調(diào)用數(shù)據(jù)庫訪問接口連接到相應(yīng)的數(shù)據(jù)庫,之后再進(jìn)行各類數(shù)據(jù)庫訪問操作。然而在某些場景下,通常希望能夠連接到預(yù)期的數(shù)據(jù)庫,因此就需要對(duì)當(dāng)前連接的數(shù)據(jù)庫進(jìn)行校驗(yàn)。而眾所周知,數(shù)據(jù)庫連接的信息往往存儲(chǔ)在數(shù)據(jù)源中,因此,對(duì)當(dāng)前連接的數(shù)據(jù)庫的校驗(yàn)就可以轉(zhuǎn)化為對(duì)數(shù)據(jù)源信息的校驗(yàn)。
現(xiàn)有技術(shù)中,主要有兩種對(duì)數(shù)據(jù)源信息進(jìn)行校驗(yàn)的方法:第一種方法,也稱手工校驗(yàn)方法,即從數(shù)據(jù)庫訪問操作對(duì)應(yīng)的日志文件中查看數(shù)據(jù)源信息是否符合預(yù)期;第二種方法,在數(shù)據(jù)庫訪問接口對(duì)應(yīng)的測試腳本中補(bǔ)充校驗(yàn)邏輯。然而,第一種方法通常需要耗費(fèi)極大的人力資源,且校驗(yàn)效率比較低;而第二種方法因?yàn)樵跍y試腳本中新增了代碼,所以需要重新調(diào)試測試腳本,這增加了時(shí)間成本和人力成本,此外測試腳本中會(huì)新增很多冗余的校驗(yàn)代碼,這使得測試腳本不夠直觀。
技術(shù)實(shí)現(xiàn)要素:
本申請(qǐng)實(shí)施例提供了一種數(shù)據(jù)源信息的校驗(yàn)方法及裝置,可以調(diào)高數(shù)據(jù)源信息校驗(yàn)的效率,且不會(huì)增加測試人員的工作量。
第一方面,提供了一種數(shù)據(jù)源信息的校驗(yàn)方法,該方法包括:
當(dāng)接收到對(duì)數(shù)據(jù)庫訪問接口的調(diào)用請(qǐng)求時(shí),讀取所述數(shù)據(jù)庫訪問接口的注釋信息;
對(duì)所述注釋信息進(jìn)行解析,獲得預(yù)定義的校驗(yàn)算法;
攔截所述數(shù)據(jù)庫訪問接口的一個(gè)或多個(gè)數(shù)據(jù)庫訪問操作,并獲取所述數(shù)據(jù)庫訪問操作對(duì)應(yīng)的一個(gè)或多個(gè)數(shù)據(jù)源信息;
根據(jù)所述預(yù)定義的校驗(yàn)算法,對(duì)所述數(shù)據(jù)源信息進(jìn)行校驗(yàn),并獲得校驗(yàn)結(jié)果信息;
輸出所述校驗(yàn)結(jié)果信息。
第二方面,提供了一種數(shù)據(jù)源信息的校驗(yàn)裝置,該裝置包括:讀取單元、解析單元、攔截單元、校驗(yàn)單元和輸出單元;
所述讀取單元,用于當(dāng)接收到對(duì)數(shù)據(jù)庫訪問接口的調(diào)用請(qǐng)求時(shí),讀取所述數(shù)據(jù)庫訪問接口的注釋信息;
所述解析單元,用于對(duì)所述讀取單元讀取的所述注釋信息進(jìn)行解析,獲得預(yù)定義的校驗(yàn)算法;
所述攔截單元,用于攔截所述數(shù)據(jù)庫訪問接口的一個(gè)或多個(gè)數(shù)據(jù)庫訪問操作,并獲取所述數(shù)據(jù)庫訪問操作對(duì)應(yīng)的一個(gè)或多個(gè)數(shù)據(jù)源信息;
所述校驗(yàn)單元,用于根據(jù)所述解析單元得到的所述預(yù)定義的校驗(yàn)算法,對(duì)所述數(shù)據(jù)源信息進(jìn)行校驗(yàn),并獲得校驗(yàn)結(jié)果信息;
所述輸出單元,用于輸出所述校驗(yàn)單元得到的所述校驗(yàn)結(jié)果信息。
本申請(qǐng)?zhí)峁┑臄?shù)據(jù)源信息的校驗(yàn)方法及裝置,當(dāng)接收到對(duì)數(shù)據(jù)庫訪問接口的調(diào)用請(qǐng)求時(shí),讀取所述數(shù)據(jù)庫訪問接口的注釋信息;對(duì)所述注釋信息進(jìn)行解析,獲得預(yù)定義的校驗(yàn)算法;攔截所述數(shù)據(jù)庫訪問接口的一個(gè)或多個(gè)數(shù)據(jù)庫訪問操作,并獲取所述數(shù)據(jù)庫訪問操作對(duì)應(yīng)的一個(gè)或多個(gè)數(shù)據(jù)源信息;根據(jù)所述預(yù)定義的校驗(yàn)算法,對(duì)所述數(shù)據(jù)源信息進(jìn)行校驗(yàn),并獲得校驗(yàn)結(jié)果信息;輸出所述校驗(yàn)結(jié)果信息。也即本申請(qǐng)中,直接從數(shù)據(jù)庫訪問接口對(duì)應(yīng)的 注釋信息中就可以獲取到預(yù)定義的校驗(yàn)算法,之后根據(jù)預(yù)定義的校驗(yàn)算法,就可以實(shí)現(xiàn)對(duì)數(shù)據(jù)源信息的自動(dòng)校驗(yàn),從而解決了現(xiàn)有技術(shù)中通過人工校驗(yàn)數(shù)據(jù)源信息而導(dǎo)致的校驗(yàn)效率低的問題,且無需對(duì)修改后的數(shù)據(jù)庫訪問接口的測試腳本進(jìn)行再次調(diào)試,這大大節(jié)約了時(shí)間成本和人力成本。
附圖說明
圖1為本申請(qǐng)?zhí)峁┑臄?shù)據(jù)源信息校驗(yàn)裝置示意圖;
圖2為本申請(qǐng)一種實(shí)施例提供的數(shù)據(jù)源信息的校驗(yàn)方法流程圖;
圖3為本申請(qǐng)?zhí)峁┑臄?shù)據(jù)庫訪問接口的示意圖;
圖4為本申請(qǐng)另一種實(shí)施例提供的數(shù)據(jù)源信息的校驗(yàn)裝置示意圖。
具體實(shí)施方式
為使本申請(qǐng)實(shí)施例的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面將結(jié)合本申請(qǐng)實(shí)施例中的附圖,對(duì)本申請(qǐng)實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例是本申請(qǐng)一部分實(shí)施例,而不是全部的實(shí)施例?;诒旧暾?qǐng)中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都屬于本申請(qǐng)保護(hù)的范圍。
為便于對(duì)本申請(qǐng)實(shí)施例的理解,下面將結(jié)合附圖以具體實(shí)施例做進(jìn)一步的解釋說明,實(shí)施例并不構(gòu)成對(duì)本申請(qǐng)實(shí)施例的限定。
本申請(qǐng)實(shí)施例提供的數(shù)據(jù)源信息的校驗(yàn)方法及裝置,適應(yīng)于互聯(lián)網(wǎng)系統(tǒng)中在某些特定場景下對(duì)數(shù)據(jù)庫訪問操作訪問的數(shù)據(jù)庫進(jìn)行校驗(yàn)的場景,此處,互聯(lián)網(wǎng)系統(tǒng)包括客戶端和服務(wù)端,其中,客戶端可以向服務(wù)端發(fā)送數(shù)據(jù)庫訪問請(qǐng)求,此處的數(shù)據(jù)庫訪問請(qǐng)求包括:寫數(shù)據(jù)庫請(qǐng)求和讀數(shù)據(jù)庫請(qǐng)求;服務(wù)端在接收到數(shù)據(jù)庫訪問請(qǐng)求之后,通過調(diào)用數(shù)據(jù)庫訪問接口連接到對(duì)應(yīng)的數(shù)據(jù)庫上,之后可以進(jìn)行各類數(shù)據(jù)庫訪問操作(包括:讀數(shù)據(jù)庫操作和寫數(shù)據(jù)庫操作)。
本申請(qǐng)的服務(wù)端可以包括多個(gè)數(shù)據(jù)庫,多個(gè)數(shù)據(jù)庫可以異地部署,且可以分為兩種類型:讀數(shù)據(jù)庫和寫數(shù)據(jù)庫,寫數(shù)據(jù)庫的個(gè)數(shù)可以為一個(gè),而讀數(shù)據(jù)庫的個(gè)數(shù)可以為多個(gè)。需要說明的是,讀數(shù)據(jù)庫中的數(shù)據(jù)是從寫數(shù)據(jù)庫中復(fù)制的,所以寫數(shù)據(jù)庫的實(shí)時(shí)性最高,當(dāng)寫數(shù)據(jù)庫中的數(shù)據(jù)發(fā)生變化時(shí),可以將寫數(shù)據(jù)庫中發(fā)生變化的數(shù)據(jù)依次同步至多個(gè)讀數(shù)據(jù)庫中。在默認(rèn)狀態(tài)下,讀數(shù)據(jù)庫操作訪問的數(shù)據(jù)庫為讀數(shù)據(jù)庫,而寫數(shù)據(jù)庫操作訪問的數(shù)據(jù)庫為寫數(shù)據(jù)庫。可以理解的是,因?yàn)榭梢杂卸鄠€(gè)讀數(shù)據(jù)庫,所以可以根據(jù)預(yù)設(shè)的路由策略來確定當(dāng)前讀數(shù)據(jù)庫操作所訪問的數(shù)據(jù)庫。
需要說明的是,上述特定場景可以包括但不限于如下三種場景:
場景一:寫庫強(qiáng)制的場景,即當(dāng)服務(wù)端接收到寫數(shù)據(jù)庫請(qǐng)求,且將該寫數(shù)據(jù)庫請(qǐng)求解析為一個(gè)或多個(gè)數(shù)據(jù)庫訪問操作時(shí),假設(shè)該一個(gè)或多個(gè)數(shù)據(jù)庫訪問操作中包含讀數(shù)據(jù)庫操作,則為了保證數(shù)據(jù)的實(shí)時(shí)性,希望該讀數(shù)據(jù)庫操作從寫數(shù)據(jù)庫中讀數(shù)據(jù),此時(shí),就可以對(duì)讀數(shù)據(jù)庫操作訪問的數(shù)據(jù)庫進(jìn)行校驗(yàn),即校驗(yàn)該讀數(shù)據(jù)庫操作訪問的數(shù)據(jù)庫為寫數(shù)據(jù)庫。
場景二:一致性讀的場景,根據(jù)上面的描述,當(dāng)寫數(shù)據(jù)庫中的數(shù)據(jù)發(fā)生變化時(shí),可以將寫數(shù)據(jù)庫中發(fā)生變化的數(shù)據(jù)依次同步至多個(gè)讀數(shù)據(jù)庫中,而在數(shù)據(jù)同步的過程中,當(dāng)服務(wù)端接收到讀數(shù)據(jù)庫請(qǐng)求,且將該數(shù)據(jù)庫請(qǐng)求解析為多個(gè)讀數(shù)據(jù)庫操作時(shí),假設(shè)該多個(gè)讀數(shù)據(jù)庫操作分別訪問不同的讀數(shù)據(jù)庫,則因?yàn)槎鄠€(gè)讀數(shù)據(jù)庫的同步會(huì)有時(shí)間差,而導(dǎo)致部分讀數(shù)據(jù)庫操作訪問的是同步后的讀數(shù)據(jù)庫,而部分讀數(shù)據(jù)庫操作訪問的是未同步的讀數(shù)據(jù)庫,也即任一數(shù)據(jù)庫訪問操作訪問了未同步的數(shù)據(jù)庫,則讀取結(jié)果就是錯(cuò)誤的。所以,可以對(duì)多個(gè)讀數(shù)據(jù)庫操作訪問的數(shù)據(jù)庫進(jìn)行校驗(yàn),即校驗(yàn)多個(gè)數(shù)據(jù)庫訪問操作訪問的數(shù)據(jù)庫是一致的,在這種情況下,只有該讀數(shù)據(jù)庫未同步完成時(shí),才會(huì)導(dǎo)致讀取結(jié)果錯(cuò)誤,由此可以使讀取結(jié)果錯(cuò)誤的概率降到最壞情況的五分之一。
舉例來說,在多個(gè)數(shù)據(jù)庫異地部署的情況下,即假設(shè)寫數(shù)據(jù)庫部署在地點(diǎn) a,多個(gè)讀數(shù)據(jù)庫部署在地點(diǎn)b,則當(dāng)?shù)攸c(diǎn)a的寫數(shù)據(jù)庫中的數(shù)據(jù)發(fā)生變化時(shí),同步到地點(diǎn)b的多個(gè)讀數(shù)據(jù)庫的時(shí)間可能不同,在數(shù)據(jù)未完全同步完成時(shí),地點(diǎn)b觸發(fā)了一筆查詢操作,假設(shè)該查詢操作需要查詢5次讀數(shù)據(jù)庫,如果每次查詢都路由到了不同的讀數(shù)據(jù)庫,那么這5個(gè)讀數(shù)據(jù)庫中任何一個(gè)讀數(shù)據(jù)庫的數(shù)據(jù)是舊的,就導(dǎo)致查詢結(jié)果是錯(cuò)誤的,而如果能保證5次讀數(shù)據(jù)庫都路由到同一個(gè)讀數(shù)據(jù)庫,那么只有這個(gè)讀數(shù)據(jù)庫沒同步完成時(shí),才會(huì)導(dǎo)致查詢結(jié)果錯(cuò)誤。
場景三:切換到異構(gòu)數(shù)據(jù)庫的場景,在互聯(lián)網(wǎng)系統(tǒng)的發(fā)展過程中,不可避免的會(huì)遇到數(shù)據(jù)的遷移(即將數(shù)據(jù)從一個(gè)數(shù)據(jù)庫遷移至另一個(gè)數(shù)據(jù)庫),特別是當(dāng)將數(shù)據(jù)遷移至異構(gòu)數(shù)據(jù)庫時(shí),為了保證互聯(lián)網(wǎng)系統(tǒng)在數(shù)據(jù)遷移之后能正常運(yùn)行,可以對(duì)讀數(shù)據(jù)庫操作訪問的數(shù)據(jù)庫進(jìn)行校驗(yàn),即校驗(yàn)讀數(shù)據(jù)庫操作訪問的數(shù)據(jù)庫是否為遷移后的數(shù)據(jù)庫,當(dāng)然也可以同時(shí)驗(yàn)證訪問結(jié)果的正確性;而假設(shè)數(shù)據(jù)遷移后,互聯(lián)網(wǎng)系統(tǒng)不能夠正確運(yùn)行,此時(shí)還可以將數(shù)據(jù)遷移回之前的數(shù)據(jù)庫,并進(jìn)一步校驗(yàn)讀數(shù)據(jù)庫操作訪問的數(shù)據(jù)庫是否為遷移前的數(shù)據(jù)庫。
綜上,在如上三種場景下,對(duì)數(shù)據(jù)庫訪問操作訪問的數(shù)據(jù)庫進(jìn)行校驗(yàn)是必要的。而因?yàn)閿?shù)據(jù)庫的連接信息通常會(huì)存儲(chǔ)在數(shù)據(jù)源中,也即可以根據(jù)數(shù)據(jù)源信息,查找并連接相應(yīng)的數(shù)據(jù)庫。因此,對(duì)數(shù)據(jù)庫訪問操作訪問的數(shù)據(jù)庫的校驗(yàn)就可以轉(zhuǎn)化為對(duì)數(shù)據(jù)源信息的校驗(yàn)。
需要說明的是,本申請(qǐng)的數(shù)據(jù)源信息也稱為邏輯數(shù)據(jù)源信息,該邏輯數(shù)據(jù)源信息與實(shí)際的物理數(shù)據(jù)庫是對(duì)應(yīng)的,即可以根據(jù)任一邏輯數(shù)據(jù)源信息可以唯一地確定一個(gè)物理數(shù)據(jù)庫。
本申請(qǐng)?zhí)峁┑臄?shù)據(jù)源信息的校驗(yàn)方法可以由圖1所示的數(shù)據(jù)源信息校驗(yàn)裝置執(zhí)行,圖1中,該校驗(yàn)裝置也稱為數(shù)據(jù)血緣核對(duì)裝置,其可以包括:數(shù)據(jù)庫操作攔截器11、規(guī)則解析器12以及路徑校驗(yàn)器13。其中,數(shù)據(jù)庫操作攔截器11用于攔截?cái)?shù)據(jù)庫訪問接口上的數(shù)據(jù)庫訪問操作;規(guī)則解析器12用 于對(duì)數(shù)據(jù)庫訪問接口的注釋信息進(jìn)行解析,以獲取預(yù)定義的校驗(yàn)算法(也稱路由規(guī)則或者路由策略);此處,數(shù)據(jù)庫訪問接口的注釋信息可以是由測試人員預(yù)先編寫,且可以將編寫好的注釋信息添加到數(shù)據(jù)庫訪問接口對(duì)應(yīng)的測試腳本中,以便于當(dāng)該數(shù)據(jù)庫訪問接口被調(diào)用時(shí),由規(guī)則解析器12對(duì)其進(jìn)行解析,此處,由于注釋信息不參與調(diào)試,所以當(dāng)在測試腳本中添加注釋信息時(shí),無需對(duì)測試腳本進(jìn)行重新調(diào)試;路徑校驗(yàn)器13用于根據(jù)規(guī)則解析器12解析得到的預(yù)定義的校驗(yàn)算法,對(duì)數(shù)據(jù)庫操作攔截器11攔截到的數(shù)據(jù)庫訪問操作對(duì)應(yīng)的數(shù)據(jù)源信息進(jìn)行校驗(yàn)。
在本申請(qǐng)中,路徑校驗(yàn)器13的個(gè)數(shù)可以為多個(gè),其個(gè)數(shù)可以與預(yù)定義的校驗(yàn)算法的個(gè)數(shù)據(jù)相一致,如,當(dāng)解析得到預(yù)定義的校驗(yàn)算法包括三種時(shí),則路徑校驗(yàn)器13的個(gè)數(shù)可以為三個(gè),且預(yù)定義的校驗(yàn)算法與路徑校驗(yàn)器13一一對(duì)應(yīng)。在一個(gè)例子中,三個(gè)路徑校驗(yàn)器13可以分別為:第一路徑校驗(yàn)器、第二路徑校驗(yàn)器和第三路徑校驗(yàn)器,其中,第一路徑校驗(yàn)器用于校驗(yàn)多個(gè)數(shù)據(jù)源信息是否一致;第二路徑校驗(yàn)器用于校驗(yàn)一個(gè)或多個(gè)數(shù)據(jù)源信息是否與預(yù)設(shè)的數(shù)據(jù)源信息一致;第三路徑校驗(yàn)器用于校驗(yàn)一個(gè)或多個(gè)數(shù)據(jù)源信息是否與預(yù)定義類型的數(shù)據(jù)源信息一致。
可以理解的是,圖1所示的數(shù)據(jù)源信息校驗(yàn)裝置與數(shù)據(jù)庫訪問接口是一一對(duì)應(yīng)的,即一個(gè)數(shù)據(jù)源信息校驗(yàn)裝置用于對(duì)一個(gè)數(shù)據(jù)庫訪問接口的數(shù)據(jù)庫訪問操作對(duì)應(yīng)的數(shù)據(jù)源信息進(jìn)行校驗(yàn),當(dāng)需要對(duì)多個(gè)數(shù)據(jù)庫訪問接口的數(shù)據(jù)庫訪問操作對(duì)應(yīng)的數(shù)據(jù)源信息進(jìn)行校驗(yàn)時(shí),則可以通過多個(gè)數(shù)據(jù)源信息校驗(yàn)裝置來完成,其中,每個(gè)校驗(yàn)裝置的校驗(yàn)過程類似。本申請(qǐng)以校驗(yàn)一個(gè)數(shù)據(jù)庫訪問接口的數(shù)據(jù)庫訪問操作對(duì)應(yīng)的數(shù)據(jù)源信息進(jìn)行說明。
圖2為本申請(qǐng)一種實(shí)施例提供的數(shù)據(jù)源信息的校驗(yàn)方法流程圖,所述方法的執(zhí)行主體可以為圖1所示的數(shù)據(jù)源信息校驗(yàn)裝置,圖1中,所述方法具體可以包括:
步驟210,當(dāng)接收到對(duì)數(shù)據(jù)庫訪問接口的調(diào)用請(qǐng)求時(shí),讀取所述數(shù)據(jù)庫訪 問接口的注釋信息。
參見圖3所示的本申請(qǐng)?zhí)峁┑臄?shù)據(jù)庫訪問接口的示意圖,圖3中,測試腳本用于對(duì)數(shù)據(jù)庫訪問接口進(jìn)行測試;測試驅(qū)動(dòng)用于模擬客戶端向數(shù)據(jù)庫訪問接口發(fā)送調(diào)用請(qǐng)求;數(shù)據(jù)庫訪問接口分布在服務(wù)接口(service)層、組件(component)層以及數(shù)據(jù)訪問(dao)層。需要說明的是,對(duì)調(diào)用請(qǐng)求解析后得到的數(shù)據(jù)庫訪問操作在數(shù)據(jù)訪問層開始分流。
圖3中,在運(yùn)行數(shù)據(jù)庫訪問接口的測試腳本來對(duì)數(shù)據(jù)庫訪問接口進(jìn)行測試時(shí),測試驅(qū)動(dòng)啟動(dòng)相應(yīng)的線程,啟動(dòng)后的線程向上述數(shù)據(jù)庫訪問接口發(fā)送調(diào)用請(qǐng)求,數(shù)據(jù)源信息校驗(yàn)裝置在檢測到該數(shù)據(jù)庫訪問接口被調(diào)用時(shí),從該數(shù)據(jù)庫訪問接口對(duì)應(yīng)的測試腳本中讀取數(shù)據(jù)庫訪問接口的注釋信息。
也即本申請(qǐng)的數(shù)據(jù)源信息的校驗(yàn)流程是結(jié)合數(shù)據(jù)庫訪問接口的測試過程進(jìn)行的,也即本申請(qǐng)的數(shù)據(jù)源信息的校驗(yàn)方法可以作為數(shù)據(jù)庫訪問接口測試的擴(kuò)展,本申請(qǐng)最后獲得的校驗(yàn)結(jié)果信息可以與數(shù)據(jù)庫訪問接口的測試結(jié)果信息一起返回。
步驟220,對(duì)所述注釋信息進(jìn)行解析,獲得預(yù)定義的校驗(yàn)算法。
此處,預(yù)定義的校驗(yàn)算法包括但不限于校驗(yàn)多個(gè)數(shù)據(jù)源信息是否一致;和/或,校驗(yàn)一個(gè)或多個(gè)數(shù)據(jù)源信息是否與預(yù)設(shè)的數(shù)據(jù)源信息或者預(yù)定義類型的數(shù)據(jù)源信息一致。
具體地,數(shù)據(jù)源信息校驗(yàn)裝置在讀取到數(shù)據(jù)庫訪問接口的注釋信息之后,啟動(dòng)規(guī)則解析器12,從而由規(guī)則解析器12對(duì)數(shù)據(jù)庫訪問接口的注釋信息進(jìn)行解析。在一個(gè)例子中,數(shù)據(jù)庫訪問接口的注釋信息可以為:@dbpathrule(checker=consistchecker.class,rule="default"),對(duì)該注釋信息解析后,獲得的預(yù)定義的校驗(yàn)算法可以為:校驗(yàn)多個(gè)數(shù)據(jù)源信息是否一致,也即可以調(diào)用第一路徑校驗(yàn)器。此外,本申請(qǐng)中還可以進(jìn)一步設(shè)置上述預(yù)定義的校驗(yàn)算法。具體地,可以通過變量“rule”來進(jìn)一步設(shè)置上述預(yù)定義的校驗(yàn)算法。舉例來說,在解析到的預(yù)定義的校驗(yàn)算法為校驗(yàn)多個(gè)數(shù)據(jù)源 信息是否一致時(shí),假設(shè)給變量“rule”賦值“oracle”時(shí),則預(yù)定義的校驗(yàn)算法可以進(jìn)一步細(xì)化為:校驗(yàn)多個(gè)數(shù)據(jù)源信息是否一致,且校驗(yàn)該一致的數(shù)據(jù)源信息連接的數(shù)據(jù)庫是否為oracle數(shù)據(jù)庫。當(dāng)然,上述變量“rule”也可以賦值為其它類型的數(shù)據(jù)庫,如“oceanbase”以及“mysql”等??梢岳斫獾氖?,當(dāng)變量“rule”賦值為“default”時(shí),則不對(duì)上述預(yù)定義的校驗(yàn)算法進(jìn)行進(jìn)一步設(shè)置。
在另一個(gè)例子中,數(shù)據(jù)庫訪問接口的注釋信息可以為:@dbpathrule(checker=obchecker.class,rule="default"),對(duì)該注釋信息解析后,獲得的預(yù)定義的校驗(yàn)算法可以為:校驗(yàn)一個(gè)或多個(gè)數(shù)據(jù)源信息是否為oceanbase數(shù)據(jù)庫的數(shù)據(jù)源信息,也即用于校驗(yàn)一個(gè)或多個(gè)數(shù)據(jù)源信息是否與預(yù)定義類型的數(shù)據(jù)源信息一致,從而可以調(diào)用第二路徑校驗(yàn)器。當(dāng)然,還可以通過為變量“rule”賦值,而進(jìn)一步設(shè)置預(yù)定義類型的數(shù)據(jù)源信息連接的數(shù)據(jù)庫。
在再一個(gè)例子中,數(shù)據(jù)庫訪問接口的注釋信息可以為:@dbpathrule(checker=writedbchecker.class,rule="default"),對(duì)該注釋信息解析后,獲得的預(yù)定義的校驗(yàn)算法可以為:校驗(yàn)一個(gè)或多個(gè)數(shù)據(jù)源信息是否為寫數(shù)據(jù)庫的數(shù)據(jù)源信息,也即用于校驗(yàn)一個(gè)或多個(gè)數(shù)據(jù)源信息是否與預(yù)設(shè)的數(shù)據(jù)源信息一致,從而可以調(diào)用第三路徑校驗(yàn)器。
當(dāng)然,在實(shí)際應(yīng)用中,預(yù)定義的校驗(yàn)算法可以不限于如上三種,還可以包括事務(wù)狀態(tài)檢測寫庫強(qiáng)制以及白名單優(yōu)先等。其中,與每種預(yù)定義的校驗(yàn)算法對(duì)應(yīng)的注釋信息可以結(jié)合上述例子進(jìn)行編寫。此外,也可以在注釋信息中包含兩種以上預(yù)定義的校驗(yàn)算法,當(dāng)對(duì)數(shù)據(jù)庫訪問接口的注釋信息解析后,得到兩種以上預(yù)定義的校驗(yàn)算法時(shí),則可以根據(jù)預(yù)設(shè)的優(yōu)先級(jí),從兩種以上預(yù)定義的校驗(yàn)算法中選取優(yōu)先級(jí)較高的預(yù)定義的校驗(yàn)算法,之后調(diào)用與該優(yōu)先級(jí)較高的預(yù)定義的校驗(yàn)算法對(duì)應(yīng)的校驗(yàn)器進(jìn)行校驗(yàn)。
需要進(jìn)一步說明的是,上述例子只是給出了一種注釋信息的編寫方法,在 實(shí)際應(yīng)用中,也可以采用其它形式編寫,只要能夠與測試腳本中參與調(diào)試的代碼相區(qū)分,且規(guī)則解析器12能解析出相應(yīng)的預(yù)定義的校驗(yàn)算法即可。
步驟230,攔截所述數(shù)據(jù)庫訪問接口的一個(gè)或多個(gè)數(shù)據(jù)庫訪問操作,并獲取所述數(shù)據(jù)庫訪問操作對(duì)應(yīng)的一個(gè)或多個(gè)數(shù)據(jù)源信息。
具體地,可以在圖3所示的數(shù)據(jù)庫訪問接口的數(shù)據(jù)訪問層上攔截所述數(shù)據(jù)庫訪問接口的一個(gè)或多個(gè)數(shù)據(jù)庫訪問操作。
舉例來說,假設(shè)測試驅(qū)動(dòng)調(diào)用該數(shù)據(jù)庫訪問接口讀取用戶的用戶信息,也即當(dāng)步驟210中的調(diào)用請(qǐng)求用于讀取用戶的用戶信息時(shí),且假設(shè)該用戶信息包括登錄信息和身份信息,而用戶的該兩種信息分別記錄在兩張不同的表格中,則數(shù)據(jù)庫訪問接口的實(shí)現(xiàn)代碼可以將上述調(diào)用請(qǐng)求解析為兩個(gè)讀數(shù)據(jù)庫操作,之后由數(shù)據(jù)庫操作攔截器11在數(shù)據(jù)庫訪問接口的數(shù)據(jù)訪問層上攔截該兩個(gè)數(shù)據(jù)庫訪問操作;之后分別從該兩個(gè)數(shù)據(jù)庫訪問操作對(duì)應(yīng)的操作語句中獲取對(duì)應(yīng)的數(shù)據(jù)源信息。優(yōu)選地,該數(shù)據(jù)源信息可以為數(shù)據(jù)庫名稱。此處,數(shù)據(jù)庫訪問操作對(duì)應(yīng)的操作語句中包含數(shù)據(jù)源信息屬于現(xiàn)有技術(shù),本申請(qǐng)對(duì)此不復(fù)贅述。
當(dāng)然,在實(shí)際應(yīng)用中,也可以先執(zhí)行步驟230,再執(zhí)行步驟220,或者兩個(gè)步驟同時(shí)執(zhí)行,本申請(qǐng)對(duì)此不作限定。
步驟240,根據(jù)所述預(yù)定義的校驗(yàn)算法,對(duì)所述數(shù)據(jù)源信息進(jìn)行校驗(yàn),并獲得校驗(yàn)結(jié)果信息。
具體地,通過調(diào)用與預(yù)定義的校驗(yàn)算法對(duì)應(yīng)的路徑校驗(yàn)器13,對(duì)數(shù)據(jù)源信息進(jìn)行校驗(yàn),并獲得校驗(yàn)結(jié)果信息。
當(dāng)所述預(yù)定義的校驗(yàn)算法為校驗(yàn)多個(gè)數(shù)據(jù)源信息是否一致時(shí),步驟240具體可以為:
調(diào)用第一路徑校驗(yàn)器對(duì)所述一個(gè)或多個(gè)數(shù)據(jù)源信息進(jìn)行比對(duì),若比對(duì)一致,則獲得的所述校驗(yàn)結(jié)果信息為表示校驗(yàn)成功的信息;否則獲得的所述校驗(yàn)結(jié)果信息為表示校驗(yàn)不成功的信息。
如前述例子,調(diào)用第一路徑校驗(yàn)器將兩個(gè)讀數(shù)據(jù)庫操作對(duì)應(yīng)的兩個(gè)數(shù)據(jù)源信息進(jìn)行比對(duì),假設(shè)上述兩個(gè)表格分別屬于兩個(gè)讀數(shù)據(jù)庫,且上述兩個(gè)數(shù)據(jù)源信息息分別可以為“oracle1”和“oracle2”,因?yàn)閮蓚€(gè)數(shù)據(jù)源信息不一致,所以獲得的校驗(yàn)結(jié)果信息為表示校驗(yàn)不成功的信息。假設(shè)上述兩個(gè)表格分別屬于一個(gè)讀數(shù)據(jù)庫,如兩個(gè)讀數(shù)據(jù)庫操作對(duì)應(yīng)的數(shù)據(jù)源信息均為“oracle1”時(shí),因?yàn)閿?shù)據(jù)源信息一致,則獲得的校驗(yàn)結(jié)果信息為表示校驗(yàn)成功的信息;進(jìn)一步地,若前述例子中數(shù)據(jù)庫訪問接口對(duì)應(yīng)的注釋信息中還對(duì)變量“rule”進(jìn)行了賦值,如賦值為“oracle”時(shí),則在數(shù)據(jù)源信息一致時(shí),還可以校驗(yàn)該數(shù)據(jù)源信息連接的數(shù)據(jù)庫是否為oracle數(shù)據(jù)庫,若是,則獲得的校驗(yàn)結(jié)果信息才為表示校驗(yàn)成功的信息,否則獲得的校驗(yàn)結(jié)果信息仍為表示校驗(yàn)不成功的信息。
當(dāng)所述預(yù)定義的校驗(yàn)算法為校驗(yàn)一個(gè)或多個(gè)數(shù)據(jù)源信息是否與預(yù)設(shè)的數(shù)據(jù)源信息一致時(shí),步驟240還可以具體為:
調(diào)用第二路徑校驗(yàn)器對(duì)所述一個(gè)或多個(gè)數(shù)據(jù)源信息與預(yù)設(shè)的數(shù)據(jù)源信息進(jìn)行比對(duì),若任一數(shù)據(jù)源信息與預(yù)設(shè)的數(shù)據(jù)信息比對(duì)不一致,則獲得的所述校驗(yàn)結(jié)果信息為表示校驗(yàn)不成功的信息;否則獲得的所述校驗(yàn)結(jié)果信息為表示校驗(yàn)成功的信息。
如前述場景一中,希望讀數(shù)據(jù)庫操作訪問的數(shù)據(jù)庫為寫數(shù)據(jù)庫,也即可以調(diào)用第二路徑校驗(yàn)器校驗(yàn)一個(gè)或多個(gè)讀數(shù)據(jù)庫操作對(duì)應(yīng)的數(shù)據(jù)源信息是否為寫數(shù)據(jù)庫的數(shù)據(jù)源信息,如,在寫數(shù)據(jù)庫的數(shù)據(jù)源信息為“writedboracle”時(shí),則可以將獲取的數(shù)據(jù)源信息與“writedboracle”進(jìn)行比對(duì),若不一致,則獲得的校驗(yàn)結(jié)果信息為表示校驗(yàn)不成功的信息;否則獲得的校驗(yàn)結(jié)果信息為表示校驗(yàn)成功的信息。當(dāng)然,還可以通過為變量“rule”賦值,而進(jìn)一步設(shè)置連接的寫數(shù)據(jù)庫。
當(dāng)所述預(yù)定義的校驗(yàn)算法為校驗(yàn)多個(gè)數(shù)據(jù)源信息是否與預(yù)定義類型的數(shù)據(jù)源信息一致時(shí),步驟240還可以具體為:
調(diào)用第三路徑校驗(yàn)器對(duì)所述一個(gè)或多個(gè)數(shù)據(jù)源信息與預(yù)定義類型的數(shù)據(jù)源信息進(jìn)行比對(duì),若任一數(shù)據(jù)源信息與預(yù)定義類型的數(shù)據(jù)源信息比對(duì)不一致,則獲得的所述校驗(yàn)結(jié)果信息為表示校驗(yàn)不成功的信息;否則獲得的所述校驗(yàn)結(jié)果信息為表示校驗(yàn)成功的信息。
如前述場景三中,在數(shù)據(jù)從oracle類型的數(shù)據(jù)庫遷移至oceanbase類型的數(shù)據(jù)庫時(shí),可以調(diào)用第三路徑校驗(yàn)器校驗(yàn)一個(gè)或多個(gè)讀數(shù)據(jù)庫操作對(duì)應(yīng)的數(shù)據(jù)源信息是否為oceanbase類型數(shù)據(jù)庫的數(shù)據(jù)源信息,如,在oceanbase類型數(shù)據(jù)庫的數(shù)據(jù)源信息為“oboracle”時(shí),則可以將獲取的數(shù)據(jù)源信息與“oboracle”進(jìn)行比對(duì),若不一致,則獲得的校驗(yàn)結(jié)果信息為表示校驗(yàn)不成功的信息;否則獲得的校驗(yàn)結(jié)果信息為表示校驗(yàn)成功的信息。當(dāng)然,還可以通過為變量“rule”賦值,而進(jìn)一步設(shè)置預(yù)定義類型的數(shù)據(jù)源信息連接的數(shù)據(jù)庫。而當(dāng)oceanbase類型的數(shù)據(jù)庫有問題需要將數(shù)據(jù)切回至oracle類型的數(shù)據(jù)庫時(shí),若需要校驗(yàn)一個(gè)或多個(gè)讀數(shù)據(jù)庫操作對(duì)應(yīng)的數(shù)據(jù)源信息是否為oracle類型數(shù)據(jù)庫的數(shù)據(jù)源信息,只需要修改預(yù)設(shè)類型的數(shù)據(jù)源信息即可。
由此可見,本申請(qǐng)?jiān)跀?shù)據(jù)遷移后,只需要修改測試腳本中注釋信息中的部分信息,無需對(duì)修改后的數(shù)據(jù)庫訪問接口的測試腳本進(jìn)行重新調(diào)試,避免了現(xiàn)有技術(shù)中從校驗(yàn)oracle類型數(shù)據(jù)庫的數(shù)據(jù)源信息切換至校驗(yàn)oceanbase類型數(shù)據(jù)庫的數(shù)據(jù)源信息時(shí),需要修改測試腳本并重新調(diào)試而耗費(fèi)人力資源的問題。
步驟250,輸出所述校驗(yàn)結(jié)果信息。
路徑校驗(yàn)器13可以輸出校驗(yàn)成功與否的校驗(yàn)結(jié)果信息,開發(fā)人員可以根據(jù)該校驗(yàn)結(jié)果信息,對(duì)數(shù)據(jù)庫訪問操作對(duì)應(yīng)的數(shù)據(jù)源信息進(jìn)行修改,從而使數(shù)據(jù)庫訪問操作能夠訪問期望的數(shù)據(jù)庫。
綜上,本申請(qǐng)的數(shù)據(jù)源信息的校驗(yàn)方法與數(shù)據(jù)庫訪問接口的測試方法相結(jié)合的方式,只需要在數(shù)據(jù)庫訪問接口的測試腳本中新增注釋信息即可,并由數(shù)據(jù)源信息校驗(yàn)裝置對(duì)該注釋信息進(jìn)行解析,獲得預(yù)定義的校驗(yàn)算法,之后 根據(jù)預(yù)定的校驗(yàn)算法,對(duì)數(shù)據(jù)庫訪問接口的數(shù)據(jù)庫訪問操作對(duì)應(yīng)的數(shù)據(jù)源信息進(jìn)行校驗(yàn),而由于注釋信息不參加編譯,從而無需對(duì)添加注釋信息之后的測試腳本重新調(diào)試,由此可以避免現(xiàn)有技術(shù)中在對(duì)數(shù)據(jù)源信息進(jìn)行校驗(yàn)時(shí),需要在測試腳本中新增校驗(yàn)邏輯,且對(duì)新增校驗(yàn)邏輯后的測試腳本重新進(jìn)行調(diào)試時(shí)工作量大的問題。
本申請(qǐng)的數(shù)據(jù)源信息校驗(yàn)裝置可以插件的方式嵌入到已有的數(shù)據(jù)庫訪問接口的測試腳本中,在已有的數(shù)據(jù)庫訪問接口的測試基礎(chǔ)上,通過對(duì)數(shù)據(jù)庫訪問接口編寫注釋信息,自動(dòng)完成數(shù)據(jù)庫訪問接口上的數(shù)據(jù)庫訪問操作對(duì)應(yīng)的數(shù)據(jù)源信息的校驗(yàn)。通過攔截器的切面化思路,低成本的增加了數(shù)據(jù)源信息的校驗(yàn)。
與上述數(shù)據(jù)源信息的校驗(yàn)方法對(duì)應(yīng)地,本申請(qǐng)實(shí)施例還提供的一種數(shù)據(jù)源信息的校驗(yàn)裝置,如圖4所示,該裝置包括:讀取單元401、解析單元402、攔截單元403、校驗(yàn)單元404和輸出單元405。
讀取單元401,用于當(dāng)接收到對(duì)數(shù)據(jù)庫訪問接口的調(diào)用請(qǐng)求時(shí),讀取所述數(shù)據(jù)庫訪問接口的注釋信息。
解析單元402,用于對(duì)讀取單元401讀取的所述注釋信息進(jìn)行解析,獲得預(yù)定義的校驗(yàn)算法。
其中,所述預(yù)定義的校驗(yàn)算法包括:
校驗(yàn)多個(gè)數(shù)據(jù)源信息是否一致;和/或,
校驗(yàn)一個(gè)或多個(gè)數(shù)據(jù)源信息是否與預(yù)設(shè)的數(shù)據(jù)源信息或者預(yù)定義類型的數(shù)據(jù)源信息一致。
攔截單元403,用于攔截所述數(shù)據(jù)庫訪問接口的一個(gè)或多個(gè)數(shù)據(jù)庫訪問操作,并獲取所述數(shù)據(jù)庫訪問操作對(duì)應(yīng)的一個(gè)或多個(gè)數(shù)據(jù)源信息。
攔截單元403具體用于:
在所述數(shù)據(jù)庫訪問接口的數(shù)據(jù)訪問層上攔截所述數(shù)據(jù)庫訪問接口的一個(gè)或多個(gè)數(shù)據(jù)庫訪問操作。
校驗(yàn)單元404,用于根據(jù)解析單元402得到的所述預(yù)定義的校驗(yàn)算法,對(duì)所述數(shù)據(jù)源信息進(jìn)行校驗(yàn),并獲得校驗(yàn)結(jié)果信息。
輸出單元405,用于輸出校驗(yàn)單元404得到的所述校驗(yàn)結(jié)果信息。
可選地,校驗(yàn)單元404可以具體用于:
對(duì)所述一個(gè)或多個(gè)數(shù)據(jù)源信息進(jìn)行比對(duì),若比對(duì)一致,則獲得的所述校驗(yàn)結(jié)果信息為表示校驗(yàn)成功的信息;否則獲得的所述校驗(yàn)結(jié)果信息為表示校驗(yàn)不成功的信息。
可選地,校驗(yàn)單元404還可以具體用于:
對(duì)所述一個(gè)或多個(gè)數(shù)據(jù)源信息與預(yù)設(shè)的數(shù)據(jù)源信息進(jìn)行比對(duì),若任一數(shù)據(jù)源信息與預(yù)設(shè)的數(shù)據(jù)信息比對(duì)不一致,則獲得的所述校驗(yàn)結(jié)果信息為表示校驗(yàn)不成功的信息;否則獲得的所述校驗(yàn)結(jié)果信息為表示校驗(yàn)成功的信息;或者,
對(duì)所述一個(gè)或多個(gè)數(shù)據(jù)源信息與預(yù)定義類型的數(shù)據(jù)源信息進(jìn)行比對(duì),若任一數(shù)據(jù)源信息與預(yù)定義類型的數(shù)據(jù)源信息比對(duì)不一致,則獲得的所述校驗(yàn)結(jié)果信息為表示校驗(yàn)不成功的信息;否則獲得的所述校驗(yàn)結(jié)果信息為表示校驗(yàn)成功的信息。本申請(qǐng)實(shí)施例裝置的各功能模塊的功能,可以通過上述方法實(shí)施例的各步驟來實(shí)現(xiàn),因此,本申請(qǐng)?zhí)峁┑难b置的具體工作過程,在此不復(fù)贅述。
本申請(qǐng)?zhí)峁┑臄?shù)據(jù)源信息的校驗(yàn)裝置,讀取單元401當(dāng)接收到對(duì)數(shù)據(jù)庫訪問接口的調(diào)用請(qǐng)求時(shí),讀取所述數(shù)據(jù)庫訪問接口的注釋信息;解析單元402對(duì)所述注釋信息進(jìn)行解析,獲得預(yù)定義的校驗(yàn)算法;攔截單元403攔截所述數(shù)據(jù)庫訪問接口的一個(gè)或多個(gè)數(shù)據(jù)庫訪問操作,并獲取所述數(shù)據(jù)庫訪問操作對(duì)應(yīng)的一個(gè)或多個(gè)數(shù)據(jù)源信息;校驗(yàn)單元404根據(jù)所述預(yù)定義的校驗(yàn)算法,對(duì)所述數(shù)據(jù)源信息進(jìn)行校驗(yàn),并獲得校驗(yàn)結(jié)果信息;輸出單元405輸出得到的所述校驗(yàn)結(jié)果信息。由此,可以實(shí)現(xiàn)對(duì)數(shù)據(jù)源信息的自動(dòng)校驗(yàn),從而大大節(jié)約了人力成本和時(shí)間成本。
專業(yè)人員應(yīng)該還可以進(jìn)一步意識(shí)到,結(jié)合本文中所公開的實(shí)施例描述的各示例的對(duì)象及算法步驟,能夠以電子硬件、計(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)為超出本申請(qǐng)的范圍。
結(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ì)中。
以上所述的具體實(shí)施方式,對(duì)本申請(qǐng)的目的、技術(shù)方案和有益效果進(jìn)行了進(jìn)一步詳細(xì)說明,所應(yīng)理解的是,以上所述僅為本申請(qǐng)的具體實(shí)施方式而已,并不用于限定本申請(qǐng)的保護(hù)范圍,凡在本申請(qǐng)的精神和原則之內(nèi),所做的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本申請(qǐng)的保護(hù)范圍之內(nèi)。