【IT168 技術文檔】許多基於Windows的系統都使用了SQL Server作為後臺組件。待測程序(AUT:Application Under Test)或者待測系統(SUT:System Under Test)經常通過存儲過程來訪問資料庫。對於這些應用場景,可以把SQL存儲過程想像成應用程式的輔助函數。有兩種基本的方法可以用來編寫針對SQL存儲過程的輕量級的自動化測試。
第一種方法是在原始的SQL環境中編寫自動化測試代碼,也就是說測試套件代碼(harness code)用於T-SQL語言來編寫的,並且在類似於查詢分析器(QueryAnalyzer)或者Management Studio這樣的程序裡被執行。
第二種方法是在.NET環境下編寫自動測試代碼,測試套件代碼是用C#或者其他.NET語言來編寫的,並且在諸如命令行程序等常規的Windows環境下被執行。
此次介紹如何使用原始的SQL環境來測試SQL存儲過程。
問題
如何創建SQL資料庫以及表結構以用來保存測試用例的輸入數據和測試結果。
設計
編寫T-SQL腳本,創建一個資料庫然後創建一些表用來保存測試用例的輸入數據和測試結果。如果想通過SQL認證的方式連接到上一步創建的資料庫,則要創建一個專用的SQL登錄帳號,然後在查詢分析器裡或者通過osql.exe運行T-SQL腳本。
方案
下面的腳本創建了一個叫dbTestCasesAndResults的資料庫,它包括一個用於存儲測試用例數據的表和一個勝於存儲測試結果的表,以及一個專用的SQL登錄帳號,這個帳號便於程序通過Windows認證或者SQL認證的方式連接資料庫。下面來看代碼。
第一步設定當前的資料庫為SQLServer的主資料庫(master database)。當創建一個新的用戶資料庫的時候,這一步是必不可少的。如果要創建的資料庫已經存在,系統就會給一個錯誤,為了防止這種錯誤,可以在試圖刪除新資料庫的舊版本之前通過查詢sysdatabases表來檢查舊版的資料庫是否存在。然後可以通過資料庫創建用於測試用例存儲的資料庫。用於創建資料庫的語句有許多可選的參數,但是對於輕量級的自動測試來說,接受這些參數的默認值通常就可以滿足需要了。
--makeDbTestCasesAndResults.sql
use master
go
if exists(select * from sysdatebases where name = 'dbTestCasesAndResults')
drop database dbTestCasesAndResults
go
if exists(select * from sysxlogins where name = 'testLogin')
exec sp_droplogin 'testLogin'
go
create database dbTestCasesAndResults
go
use dbTestCasesAndResults
go
create table tblTestCases
(
caseID char(4) primary key,
input char(3) not null,-- an empID
expected int not null
)
go
--下面插入的是用於usp_StatusCode的測試用例數據
--也可以通過BCP,DTS,或者C#程序從文本文件讀入
insert into tblTestCases values('0001','e11',77)
insert into tblTestCases values('0002','e22',77) ——should be 66
insert into tblTestCases values('0003','e33',99)
insert into tblTestCases values('0004','e44',88)
go
create table tblResults
(
caseID char(4) not null,
result char(4) null,
whenRen datetime not null
)
go
exec sp_addlogin 'testLogin','secret'
go
exec sp_grantdbaccess 'testLogin'
go
grant select,insert,delete on tblTestCases to testLogin
go
grant select,insert on tblResult to testLogin
go
註解
SQL資料庫支持兩種不現的安全模式:使用Windows認證可以通過Windows帳號ID和密碼連接資料庫,使用混合模式認證可以通過SQL登錄ID 和SQL密碼來連接資料庫。如果想要通過SQL認證來連接資料庫,應該使用系統存儲過程sp_addlogin()創建一個SQL登錄帳號以及相應的密碼。如果要刪除一個SQL登錄帳號,可以先查詢sysxlogin()表檢查相應的帳號是否存在,然後調用sp_droplogin()來刪除這個帳號。創建好一個SQL登錄帳號以後,應該賦予登錄帳號連接資料庫的許可。然後需要針對資料庫裡的表,賦予登錄帳號與SQL語句相關的權限許可,比如:SELECT,INSERT,DELETE以及UPDATE。
SQL登錄帳號很容易與SQL用戶搞混。SQL登錄帳號是伺服器範圍的對象,它用來控制針對裝有SQL Server的機器的連接許可。而SQL用戶是資料庫範圍的對象,它用來控制資料庫以及它所包含的表,存儲過程和其他一些對象的權限許可。當為一個SQL 登錄帳號分配權限的時候,會自動創建一個同名的SQL用戶。所以最終會有一個SQL登錄帳號和一個SQL用戶,兩個名字相同並且相互關聯。儘管也可以上讓不同名的帳號和用戶相互關聯,但是這太容易讓人迷惑了,所以最好還是使用名字相同的默認機制。
為了測試存儲過程而測試用例存儲結構的時候,必須決定在什麼時候以及如何往表中插入勝於測試用例的那些數據。最簡單的辦法是在創建表的時候直接加入用於測試用例的數據。使用本解決方案所演示的INSERT語句可以很快的完成這件事情。但是,在測試的過程中幾乎肯定要在很多地方碰上需要添加或者移除測試用例數據的情況,所以更靈活的方法是在後面使用BCP(Bulk Copy Program),DTS(Data Transformation Services)或者一個輔助的C#程序來插入數據。如果想要插入以及刪除測試用例數據,那麼就應當針對存儲測試用例數據的那張表為SQL登錄帳號賦予 INSERT和DELETE的權限許可。
這個用於創建測試用例和存儲測試結果的腳本可以通過幾種方法來運行,一種方法是在查詢分析器程序裡打開並通過Excute命令。第二種方法是使用OSQL.EXE程序來執行這個SQL腳本。