【摘要】? ? 數(shù)據(jù)庫是指在按照一定的規(guī)則與數(shù)據(jù)結(jié)構(gòu),來組織、儲存、管理數(shù)據(jù)的倉庫,如今市面上常見的任何一款軟件應用程序都離不開數(shù)據(jù)庫的使用,而每一款軟件都必須要經(jīng)過數(shù)據(jù)庫測試通過后,才能正式投入使用?;诖耍疚闹饕菍τ嬎銠C軟件開發(fā)中,數(shù)據(jù)庫測試的內(nèi)容與測試方法進行簡要探究。希望此文能夠在開發(fā)測試上,帶給軟件工作者一點理論幫助。
【關(guān)鍵詞】? ? 計算機? ? 數(shù)據(jù)庫測試? ? 軟件開發(fā)
引言:
隨著人們在多種生活情景中對應用軟件的功能性需求越來越高,催生設(shè)計出了越來越多樣化的軟件應用程序。軟件程序的復雜程度增加之后,就需要功能更加穩(wěn)定、處理更加高效、安全系數(shù)更高的數(shù)據(jù)庫來支持。像是數(shù)據(jù)處理、信息配置、圖像管理這些功能若是完全放到程序中讓程序自行管理,那么將會是一個非常巨大的計算量,那軟件程序就不存在快速響應的優(yōu)勢了。而軟件開發(fā)中,數(shù)據(jù)庫測試正是其中一步關(guān)鍵的測試環(huán)節(jié)。
一、數(shù)據(jù)庫的基礎(chǔ)操作
如今市面上的數(shù)據(jù)庫工具多種多樣,舉幾個比較常見的例子,如MS SQL Server2008 r2、Oracle Financial、DB2、PostgreSQL等,在成本、功能性、安全性、穩(wěn)定性上表現(xiàn)各有千秋。但不論是哪種數(shù)據(jù)庫工具,普通用戶在使用軟件對應的數(shù)據(jù)庫時都只有四種操作:
Creat-創(chuàng)建用戶,建立一種與數(shù)據(jù)庫的映射關(guān)系,取得相應的數(shù)據(jù)庫管理權(quán)限、數(shù)據(jù)庫用戶也就是數(shù)據(jù)庫的使用者,擁有在當前數(shù)據(jù)庫中創(chuàng)建對象、調(diào)取數(shù)據(jù)、備份數(shù)據(jù)以及處理數(shù)據(jù)的權(quán)限。
Retrieve-檢索,為數(shù)據(jù)調(diào)用設(shè)置一條邏輯規(guī)則,以特定的信息需求為目的,在信息庫集合內(nèi)所有的信息元素中,找出對應的內(nèi)容并調(diào)用,通常情況下為視圖檢索。
Update-更新,數(shù)據(jù)表是數(shù)據(jù)庫中最基本的數(shù)據(jù)存儲單元,在舊的數(shù)據(jù)表結(jié)構(gòu)搭建完成后,根據(jù)某種特殊功能用途,將新的數(shù)據(jù)表以插入的形式來“頂替”舊的信息表,實現(xiàn)對已有數(shù)據(jù)的修改。
Delete-刪除,將已經(jīng)不需要的數(shù)據(jù)從數(shù)據(jù)庫的列表中清除,并且在原有的儲存位置允許其他新數(shù)據(jù)進行覆寫,此后在數(shù)據(jù)庫內(nèi)將不會再檢索到此信息。
二、數(shù)據(jù)庫測試的內(nèi)容
Atocity-原子性,它是數(shù)據(jù)庫能夠正常運行的基礎(chǔ)判定標準。在數(shù)據(jù)庫執(zhí)行某一事務時,它包含的所有數(shù)據(jù)操作,只有全部完成與全部未完成兩個動作,在數(shù)據(jù)處理的中間環(huán)節(jié)將不會突然意外終止,即使事務意外報錯未能完成,也會被自動恢復到事務未被執(zhí)行的狀態(tài)。數(shù)據(jù)庫中,事務必須是進程的最小量級單位,而軟件事務則是指由數(shù)據(jù)庫的操作所成立的一個完整邏輯事件。以銀行扣款為例,扣除款項后,還必須要有打款賬戶,而一扣一進完成兩個數(shù)據(jù)庫的對接,才能算作一個完整的邏輯事件,而這種邏輯事件就是軟件數(shù)據(jù)庫的事務[1]。
Consistency-一致性,當數(shù)據(jù)庫需要執(zhí)行某一事務時,期間與事務相關(guān)的數(shù)據(jù)完整性不能遭到破壞,在數(shù)據(jù)庫中后寫入的數(shù)據(jù),必須在預設(shè)規(guī)則上與此前保持一致。這樣才能確保數(shù)據(jù)庫檢索的數(shù)據(jù)是相對準確的,且由于數(shù)據(jù)執(zhí)行同一種預設(shè)規(guī)則,所以數(shù)據(jù)庫中具有相同特征的數(shù)據(jù)才會具有一定關(guān)聯(lián)性關(guān)系。
Isolation-獨立性,數(shù)據(jù)庫在執(zhí)行多種不同事務時,會同時對各自對應的數(shù)據(jù)進行調(diào)用與修改。而若是不能將它們完全獨立開來,就會因為事務交叉執(zhí)行導致同一組數(shù)據(jù)因前后不一出現(xiàn)邏輯錯誤。因此在數(shù)據(jù)庫中需要將多種并行事務以四個不同的管理級別進行隔離:讀未提交、讀提交、串行化和復讀。
Durability-永續(xù)性,軟件庫在執(zhí)行事務時,數(shù)據(jù)處理必須是永久性質(zhì)的改動。即使是數(shù)據(jù)刪除,也應當是將信息調(diào)出后再進行清除的過程,而不是數(shù)據(jù)丟失。哪怕是系統(tǒng)出現(xiàn)了故障,改動后的數(shù)據(jù)也應當是被存儲在數(shù)據(jù)庫中的。數(shù)據(jù)庫的穩(wěn)定性問題,正是來源數(shù)據(jù)修改儲存的永續(xù)性特點[2]。
三、數(shù)據(jù)庫測試的基本流程
(一)創(chuàng)建查詢
以SQL數(shù)據(jù)庫工具為例,創(chuàng)建查詢首先需要使用Transact-SQL語句創(chuàng)建信息庫的標識,而后將Transact-SQL語句描述的數(shù)據(jù)庫名稱與標識設(shè)置為第一key值,再保存該數(shù)據(jù)庫的信息作為第一value值,得到第一組KV數(shù)據(jù)記錄。然后在該數(shù)據(jù)庫中建立一個數(shù)據(jù)表,將數(shù)據(jù)表的名稱與數(shù)據(jù)庫的名稱設(shè)置為第二key值,再保存建立的數(shù)據(jù)表名稱作為第二value值,得到第二組KV數(shù)據(jù)記錄。最后再在上一步建立的數(shù)據(jù)表中寫入新的數(shù)據(jù),將數(shù)據(jù)表與數(shù)據(jù)的名稱設(shè)置為第三key值,保存這組寫入數(shù)據(jù)的信息作為第三value值,得到第三組KV數(shù)據(jù)記錄??晒㏒QL數(shù)據(jù)庫工具使用的查詢語句只有“Select”,在利用KV數(shù)據(jù)庫創(chuàng)建查詢時,還需要開發(fā)人員結(jié)合其他語句一同組成不同的查詢功能指令[3]。
(二)數(shù)據(jù)表查詢
查詢數(shù)據(jù)表是數(shù)據(jù)庫測試中最容易簡單理解的過程,它是通過對SQL數(shù)據(jù)庫的數(shù)據(jù)表形成來驗證應用程序GUI操作的結(jié)果是否合理,其主要操作分為單表查詢與多表查詢兩種:
單表查詢的工作相對于多表查詢來說工作量要少,但它需要開發(fā)人員足夠的細致耐心。首先要對數(shù)據(jù)表的所有字段的所以方式進行查詢,制定一個特定的字段條件后,查詢被制定的記錄。而后需要對帶有“in”與“l(fā)ike”字符的所有關(guān)鍵字符的匹配關(guān)系,進行查詢比對。接著需要查詢數(shù)據(jù)表的條件描述,查看“and”與“or”的邏輯關(guān)系是否嚴密,除此之外還要對數(shù)據(jù)庫的COUNT、SUM、MAX、MIN、AVG五類集合函數(shù)進行查詢[4]。最后是對數(shù)據(jù)表中的空值進行查詢,空值Null是一個不可用的,沒有被分配且無法得到的值,它與0和空格有著本質(zhì)上的區(qū)別,在數(shù)據(jù)表中空值可能會引起一些算法結(jié)構(gòu)發(fā)生改變,會使這組算法的快速訪問與索引功能失效。在完成單表的所有查詢工作后,需要將查詢結(jié)果全部分類排序后,使用LIMIT工具對查詢結(jié)果的數(shù)量進行修改與限制。
而多表查詢,則是在單表查詢的基礎(chǔ)上,展開對含有any、some、all、exists、in等關(guān)鍵字以及運算符的子查詢。除此之外還要對多表連接的形式進行查詢,以雙表連接為例,一共分為:內(nèi)連接查詢、外連接查詢與復合條件查詢?nèi)N形式。但該過程需要軟件開發(fā)人員投入大量的時間精力,對于數(shù)據(jù)容量龐大的數(shù)據(jù)庫,想要完成所有數(shù)據(jù)表的查詢工作也是非常困難的。
(三)開發(fā)人員查詢
開發(fā)人員查詢是測試數(shù)據(jù)庫最容易操作的方法,利用GUI工具在數(shù)據(jù)庫上運行任意CRUD操作與SQL查詢后,在開發(fā)人員中獲得它的驗證結(jié)果。若是在開發(fā)人員中找到了語句描述錯誤,或是與用戶需求不符的語句描述,就可以直接對不合適的語句進行修改了。
四、數(shù)據(jù)庫測試的內(nèi)容
(一)設(shè)計測試
為了使數(shù)據(jù)庫能夠更好地滿足于應用程序的CRUD操作,對數(shù)據(jù)庫中的數(shù)據(jù)表都是采用規(guī)范化設(shè)計的,常見的規(guī)范化范式有很多種,如第一范式到第五范式,和BCNF范式等。而常見類型的應用程序數(shù)據(jù)庫的邏輯設(shè)計,都以第三范式的要求規(guī)范為參考,這是一種將單個的數(shù)據(jù)表拆分為多表連接結(jié)構(gòu)的查詢管理規(guī)則,盡管犧牲了一定程度的查詢速度,但換來的卻是容易維護的表結(jié)構(gòu)。我們暫時將數(shù)據(jù)庫理解為一個有形實體,它的內(nèi)部主要是由表、視圖與儲存規(guī)則組成的,那么設(shè)計測試就是以數(shù)據(jù)庫的表、視圖、儲存規(guī)則三個實體結(jié)構(gòu)為對象,展開的測試,通過設(shè)計測試可以檢驗數(shù)據(jù)庫的三個組成元件是否在設(shè)計上合理、充分,是否存在邏輯紕漏,以及每個元件是否具備極佳的拓展性。設(shè)計測試主要是為了檢驗應用軟件在功能上存在的不足,以及刪去影響軟件響應效率的冗余數(shù)據(jù),而設(shè)計測試的過程并不是測試技術(shù)人員獨立完成的,一些存在著爭議的問題,還需要通過與軟件的設(shè)計人員的溝通了解來解決。
設(shè)計方面的測試通常情況下若無特殊需求,可以僅僅對數(shù)據(jù)一致性進行測試,其中主要包括了表主鍵測試、表與表主外鍵關(guān)系測試、刪除一致性測試三種:
1.表主鍵測試。表主鍵的測試應當遵循下列原則:一是測試人員必須要能夠?qū)?shù)據(jù)庫的表結(jié)構(gòu)擁有一定了解認識,并基于表結(jié)構(gòu)的特性展開相應的測試,如過程性表結(jié)構(gòu)與非過程性表結(jié)構(gòu)的測試邏輯方法和語句描述均有不同;二是在對數(shù)據(jù)庫內(nèi)部表主鍵進行測試時,必須是基于數(shù)據(jù)庫的實際運行基礎(chǔ)上的,以滿足測試結(jié)構(gòu)的精準性要求;三是按照各個不同的表信息規(guī)定,對測試結(jié)果對應的顯示記錄進行同步記錄,如果出現(xiàn)測試結(jié)果對應多種不同記錄的情況,應當重新對表主鍵進行測試,而如果顯示記錄未出現(xiàn),則說明在測試過程中,表主鍵始終保持一致性,無需進行下步優(yōu)化。在實際測試時,為了減少測試工作量,可以考慮找出一個SQL腳本,如SELECT * FROM information_schema.tables`類型的循環(huán)代碼,用于測試表內(nèi)主鍵的存在。
2.表與表外主鍵之間的關(guān)系測試。測試表主外鍵的要點在于建立搜索語句的邏輯,表主外鍵同樣是一種主鍵,應當以表主外鍵的語句字段長度與語句類別為突破口。這種通過檢查表與表主外鍵關(guān)系,來確認數(shù)據(jù)庫檢索邏輯一致性的方法被稱為Dbcc,它是通過兩個方面來實現(xiàn)的:一是利用checkstorage、checktable或checkdb工具,以頁級或行級為單位檢查頁鏈、行鏈以及指針的準確性,其中可供優(yōu)化的部分是指針的空間占用問題;二是利用checkstorage工具來檢查行或頁的分配關(guān)系。關(guān)于表與表外主鍵關(guān)系的一致性測試,通常在下列情況必須要進行:一是備份數(shù)據(jù)庫操作時,為了備份數(shù)據(jù)庫的完整性,必須進行Dbcc測試;二是當軟件系統(tǒng)出現(xiàn)報錯信息時,必須要檢查數(shù)據(jù)庫是否受到損壞;三是對數(shù)據(jù)庫運行有日常維護檢查需求的軟件,這種軟件的數(shù)據(jù)庫完整性完全取決于sa或dbo,需要定期運行Dbcc來進行測試;四是當出現(xiàn)單一某個表損壞時,提取該表的損壞信息,檢查同主鍵關(guān)系性質(zhì)的其他數(shù)據(jù)表是否同樣存在損壞。
3.刪除一致性測試。基于上文中的CRUD操作理論,出于保護隱私或者其它功能目的,數(shù)據(jù)刪除本身就是用戶經(jīng)常使用的一個訪問數(shù)據(jù)庫功能。因此在對存在級聯(lián)性質(zhì)數(shù)據(jù)表的數(shù)據(jù)庫進行測試時,必須要保證數(shù)據(jù)庫數(shù)據(jù)刪除的一致性。級聯(lián)關(guān)系的數(shù)據(jù)表我們可以簡單地理解為一種插入臨時表的性質(zhì),如數(shù)據(jù)表1是對包括數(shù)據(jù)表2在內(nèi)多種數(shù)據(jù)集合的描述,如果我們將數(shù)據(jù)表2全部刪除,那么數(shù)據(jù)表1中與之相關(guān)的所有數(shù)據(jù)描述都理應被一同刪除。但這種級聯(lián)關(guān)系的數(shù)據(jù)表經(jīng)常會使用的一種存在關(guān)系是依靠主鍵ID來記錄的,當將下一級表信息刪除后,因為數(shù)據(jù)庫本身在一致性上的邏輯設(shè)計上存在不足,而留下被刪除信息的主鍵ID。因此確保數(shù)據(jù)庫刪除的一致性,能夠為軟件用戶在處理海量無用數(shù)據(jù)時,帶來極大的便利。
(二)容量測試
鑒于數(shù)據(jù)庫容量對于數(shù)據(jù)庫功能實現(xiàn)的重要性,它的測試優(yōu)先級甚至還要高于性能測試。我們都知道數(shù)據(jù)庫所能存儲的數(shù)據(jù)量并不是無限大的,為了使數(shù)據(jù)庫能夠適應不斷激增的數(shù)據(jù)處理量,除了數(shù)據(jù)庫本身邏輯合理之外,還要對數(shù)據(jù)庫容量進行初步估算,為軟件程序的用戶提供可靠的參考。那么數(shù)據(jù)庫的容量測試,可以利用以下公式來進行簡單估算:數(shù)據(jù)庫容量=Sum所有表數(shù)據(jù)量;表數(shù)據(jù)量=每條記錄的單個數(shù)據(jù)量*總記錄目數(shù);記錄數(shù)據(jù)量=Sum單個記錄包含所有字段的占字節(jié)。其中需要注意的是,容量測試時需要分析單表單行的各種數(shù)據(jù)類型占字節(jié)情況,如char類型的字節(jié)是固定的;number類型字節(jié)可變長,但最多也只能占用22字節(jié);而varchar類型的是按照2/3總長度進行折算的。熟悉各個類型數(shù)據(jù)的占字規(guī)律后,利用數(shù)據(jù)字典指令來查詢每張表的占用空間似乎是一個不錯的選擇,具體代碼為:SELECT*FROM USER_TAB_COLUMNS WHERE TABLE_NAME=”。查詢數(shù)據(jù)字典的顯示結(jié)果中,在DATA_LENGTH一項中,就記錄了該數(shù)據(jù)表的最大占用字節(jié)。但數(shù)據(jù)表并不是數(shù)據(jù)庫容量的全部,還要考慮系統(tǒng)表、視圖表以及實體的存儲過程中所占用的實際容量。如何界定一個數(shù)據(jù)庫的容量是否合格,就是看它的容量是否擁有兩倍數(shù)據(jù)庫文件量的預留空間,來存放數(shù)據(jù)庫日志文件。
(三)性能測試
確認過數(shù)據(jù)庫的邏輯設(shè)計以及容量都能符合用戶需求實際后,還需要對數(shù)據(jù)庫的性能進行測試分析,軟件程序的性能,很大程度是由數(shù)據(jù)庫的性能來決定的。而應用軟件的性能問題,就是用戶最關(guān)注且最能直接反映程序應用體驗的參數(shù)。數(shù)據(jù)庫的性能測試由于計算量與操作量極大,無法完全由軟件開發(fā)測試人員以人工的方式來完成,需要應用一種DATA Factory數(shù)據(jù)產(chǎn)生器來自動對數(shù)據(jù)庫進行測試。在這個數(shù)據(jù)產(chǎn)生器中,可以以每秒上百萬行的數(shù)據(jù)生成量,來實際模擬數(shù)據(jù)庫投入使用后在長期運行的條件下對海量數(shù)據(jù)的存儲處理情況。這樣測試人員就能夠在性能測試過程中,及時發(fā)現(xiàn)數(shù)據(jù)庫的潛在問題,對數(shù)據(jù)庫進行性能優(yōu)化了。當然在性能測試中,需要開發(fā)人員注意使用數(shù)據(jù)產(chǎn)生器時,要注意環(huán)境變量條件始終與用戶端保持一致,如操作系統(tǒng)、軟件版本、硬件配置等。若從軟件的長期運行視角來看,在進行性能測試時,必須要能夠?qū)嶋H使用狀況進行有效模擬,用專業(yè)的測試技術(shù)與測試軟件來進行性能測試。軟件性能測試通常情況下,就是通過數(shù)據(jù)發(fā)生器,在正常的使用環(huán)境與系統(tǒng)條件下,通過重復性地物理驗證操作,來驗證軟件是否滿足了某些性能指標。
(四)壓力測試
數(shù)據(jù)庫的壓力測試就是一種對數(shù)據(jù)庫的訪問上限、并行事務上限以及響應速度展開的一種物理測試。假如某一軟件后臺同時登錄訪問數(shù)據(jù)庫的用戶過多,那么數(shù)據(jù)庫同一時間內(nèi)單次訪問操作的響應速率一定會慢于正常情況,一旦超過了軟件數(shù)據(jù)庫的壓力閾值,甚至會使軟件在訪問數(shù)據(jù)庫時出現(xiàn)卡頓甚至崩潰,而這是軟件開發(fā)的客戶所不愿意看到的。我們對軟件進行壓力測試的目的,就是假想一種理論上的該軟件最大用戶承載的情況,查看數(shù)據(jù)庫的壓力閾值是否能夠滿足一定比例的軟件用戶同時訪問數(shù)據(jù)庫操作的需求。該階段與性能測試一樣都無法由人工獨立操作完成,需要借助自動化測試軟件來對數(shù)據(jù)庫的索引、觸發(fā)器、實體存儲過程以及數(shù)據(jù)鎖進行承載性驗證。通過自動化測試軟件描述的測試結(jié)果,我們就可以間接地獲知SQL語句與數(shù)據(jù)存儲過程是否還存在繼續(xù)優(yōu)化的空間與必要了。進行壓力測試的自動化測試軟件的類型有很多,例如Jmeter適用于所有的JAVA基礎(chǔ)的軟件項目,而Net項目則在本身自有的開發(fā)環(huán)境中含有用于壓力測試的工具與方案。
五、結(jié)束語
綜上所述,數(shù)據(jù)庫測試是軟件開發(fā)中必不可少的重要環(huán)節(jié),它是指對軟件的數(shù)據(jù)庫結(jié)構(gòu)、與調(diào)用數(shù)據(jù)的方式和邏輯關(guān)系進行驗證、分析的過程。只有完成數(shù)據(jù)庫測試,找出邏輯設(shè)計與功能性上的缺陷并對其進行修改優(yōu)化,才能使軟件程序各項功能的正常使用,與程序本身的運行穩(wěn)定性得到保障。
參? 考? 文? 獻
[1]王天云.軟件開發(fā)中的數(shù)據(jù)庫測試技術(shù)研究[J].無線互聯(lián)科技,2013(2):69-69.
[2]周國裕.淺談計算機軟件開發(fā)的數(shù)據(jù)庫測試技術(shù)[J].網(wǎng)絡(luò)安全技術(shù)與應用,2021(05):62-63.
[3]郭俊杰.數(shù)據(jù)庫測試技術(shù)在計算機軟件開發(fā)中的應用[J].信息與電腦(理論版),2021,33(07):113-115.
[4]張赟.計算機軟件開發(fā)的數(shù)據(jù)庫測試技術(shù)[J].電子技術(shù)與軟件工程,2020(17):150-151.
作者單位:胡航語? ? 西北工業(yè)大學計算機學院
胡航語(2001.05-),男,漢族,陜西西安,本科,研究方向:數(shù)據(jù)庫、軟件。