Visual Studio 2013 讓資料庫專案也能輕鬆做單元測試

本文將介紹如何使用Visual Studio 2013進行資料庫單元測試。

前言

Visual Studio 2013內建資料庫單元測試工具,讓您在開發觸發程序、預存程序及函數時,能夠透過這個工具進行嚴謹的測試作業,藉以提升資料庫物件開發的品質。以下筆者將介紹如何Step by Step的建立資料庫單元測試的專案,並利用內建的幾項測試條件來對預存程序進行單元測試。

建立SQL Server資料庫專案

首先請開啟Visual Studio 2013,並於起始頁的開始區塊中按【新增專案】。

image

接著於【新增專案】視窗中點選【已安裝的>範本>SQL Server>SQL Server資料庫專案】,輸入專案名稱為【NorwhwindDB】然後按確定。

image

資料庫專案建立成功後您可以在SQL Server物件總管視窗中的專案資料夾,看到一個和您專案名稱相同的資料庫節點,它看起來跟您在SSMS的物件總管看到的樣子十分相似。

image

實際上在您建立資料庫專案同時,Visual Studio 2013會幫您在SQL Server LocalDB的Projects執行個體中,建立一個您在資料庫專案中所要使用的資料庫(如下圖)。

image

假設您是一個全新的資料庫要開發各項資料表、檢視、預存程序等資料庫物件,那麼可以在【方案總管】中資料庫專案上按滑鼠右鍵選擇【加入】,來建立您所要開發的資料庫物件項目。或是您跟筆者一樣,要從現有的資料庫中匯入資料物件,則選擇【匯入>資料層應用程式(*.dacpac)】或【資料庫】,本文以匯入資料層應用程式作為示範。

image

當您選擇匯入資料層應用程式時,只要在【資料層應用程式(.dacpac)】欄位中選擇您的dacpac檔案,然後按啟動。

image

Visual Studio 2013便會開始將您的dacpac檔案匯入至資料庫專案。

image

匯入成功後您在方案總管中可以看到所有資料庫物件都變成一個一個*.sql的檔案,而在SQL Server物件總管中您則可以看到將來部署到SQL Server中的邏輯檢視。

image

建立單元測試

要建立單元測試的所有動作都必須在【SQL Server物件總管】中進行,若您要對dbo.Sales by Year預存程序進行單元測試,請在該預存程序上按滑鼠右鍵選擇【建立單元測試】。

image

在【建立單元測試】視窗中您可以看到dbo.Sales by Year預存程序已經被勾選,接著您可以選擇測試專案要使用Visual C#或是VB.NET,然後指定測試專案及單元測試的類別名稱,輸入完畢後按確定。

image

資料庫單元測試必須仰賴一個實際部署的資料庫才能順利進行,因此請點選【新增連接】來設定資料庫連線,另外,您也可以在開始單元測試前先部署資料庫專案。

image

在【連接屬性】視窗中輸入伺服器名稱、驗證方式及資料庫名稱等資訊後按確定。

image

連接屬性設定完畢後您將以該資料連接來執行後面所要進行的資料庫單元測試。

image

當您按下上圖的確定後,Visual Studio 2013便開始幫您建立單元測試所需的環境,您可以在工具列上選擇【測試>視窗>測試總管】。

image

在測試總管中您可以看到您的測試(dbo_Sales_by_YearTest),於該項目上按滑鼠右鍵選擇【執行選取的測試】。

image

您會發現測試失敗的訊息,該如何排除,請見下一節。

image

建立測試條件

當您建立單元測試時,Visual Studio 2013會幫您產生一結果不明的測試條件,該測試條件是用來提醒您尚未實作您的測試驗證,因此您可以放心的將之刪除後加入自己的測試條件。

image

筆者加入一【非空白結果集】作為測試條件,其ResultSet屬性保留預設值1,代表只要結果集1至少要有一個資料列才能通過測試,接著再重新執行失敗的測試,您可能會發現還是測試失敗。

image

原因是測試所使用的T-SQL中,Beginning_Date和Ending_Date預設使用getdate(),而Northwind資料庫中沒有今年(2013)的資料,因此造成測試失敗,因此筆者將測試日期改為19970101。

image

接著在測試總管中點選【執行>執行失敗的測試】來重新進行預存程序的測試。

image

若設定都正常您將看到如下圖測試成功的畫面。

image

測試前

當您在進行單元測試時,還可以在【測試前】和【測試後】進行更多的測試作業,例如您可以在測試前先檢查預存程序是否存在,因為若預存程序不存在,那麼進行單元測試也不可能會成功。

image

當您選擇測試前,因為單元測試並未幫您建立測試前指令碼,因此請按【按一下此處已建立】的連結。

image

輸入下列T-SQL指令碼後,接著建立一【資料列計數】的測試條件,然後將資料列計數的屬性值設定為1,表示結果集1必須要回傳1列資料才能通過測試。


from sys.objects
where name = 'Sales by Year'
and type = 'P'

image

測試前條件建立完成後,到測試總管視窗中點選【執行>執行通過的測試】。

image

由於測試前dbo.Sales_by_Year預存程序已經存在Northwind資料庫中,因此測試結果為測試成功。

image

測試後

和測試前概念相同,您可以在單元測試後進行更多的測試工作,本文示範的是在測試後進行【執行時間】的測試,並設定當執行時間小於1秒才算測試成功。

image

設定完畢後重新執行通過的測試。

image

您可以在測試結果中看到測試前、測試及測試後都順利通過。

image

結論

本文介紹了使用Visual Studio 2013進行資料庫單元測試,利用內建的單元測試工具可以讓您做到測試前中後都可以依照實際的需求來設計測試條件,即使您不懂Visual C#或VB.NET,依然可以對您的資料庫物件進行嚴謹的測試。另外,內建的測試條件可以滿足大部分的測試需求,若真的現有的測試條件無法符合您的測試需求,您也可以自行建立資料庫單元測試的測試條件,實際做法請見參考資料。

參考資料

Introducing Unit Testing for SQL Server Database Projects

使用單元測試驗證資料庫

資料庫單元測試檔案

在 Visual Basic 或 Visual C# 中自訂資料庫單元測試

如何:建立資料驅動型單元測試

HOW TO:將測試條件加入到資料庫單元測試

HOW TO:建立資料庫單元測試設計工具的測試條件