tSQLt は SQL Serverにおける、ユニットテスト用の無料のオープンソースフレームワークである。 tSQLtテストケースを書くことによって、開発者は稼動しているデータに基づいた嘘のテーブルやビューを作成でき、テストで期待値と実際の結果を比較できる。テストはT-SQLで書かれので、 SQL Server Management Studioで直接作ることができる。
tSQLtを使うことによって、開発者はデータをテストケース自身によって作成できる。なので稼働中のデータベースのコピーや別にメンテされているテストデータベースに対してテストする必要はない。全てのテストはトランザクション内で走るので、クリーナップワークを減らすのに役立つ。 tSQLtテストは、テストクラスと呼ばれる、データベーススキーマで論理的なグループに分けることができる。
フレームワークをインストールするのは簡単である。 tSQLtをダウンロードしたら、ユーザーはデータベース上でCLRを有効にする必要がある。
EXEC sp_configure 'clr enabled', 1; RECONFIGURE;
tSQLtフォルダから Example.sqlスクリプトを走らせると、デモデータベースが作られる。(tSQLt を他のデータベースにインストールするには、 ALTER DATABASEを SET TRUSTWORTHY ONで走らせる)。
次に複数のテストケースを持つテストクラスをセットアップする。これによって新しいスキーマが作られる。
EXEC tSQLt.NewTestClass 'AcceleratorTests'; GO
それが終わると、テストケースを作ることができる。以下が例である。全てのテストケースの名前は、'test'で始まり、 SQL Serverストアドプロシージャの命名コンベンションに従わなければならない。これ例は、テストテーブルを作成し、値を挿入し、関数 GetStatusMessageを呼ぶ。 tSQLt 関数AssertEqualsは、期待値と実際の結果をチェックし、一致すればテストは成功する。
CREATE PROCEDURE [AcceleratorTests].[test status message includes the number of particles] AS BEGIN --Assemble:嘘の Particleテーブルを作って、それが空で、制約が問題ないことを確認する。 EXEC tSQLt.FakeTable 'Accelerator.Particle'; -- Put 3 test particles into the table INSERT INTO Accelerator.Particle (Id) VALUES (1); INSERT INTO Accelerator.Particle (Id) VALUES (2); INSERT INTO Accelerator.Particle (Id) VALUES (3); --Act: GetStatusMessageFunctionを呼ぶ DECLARE @StatusMessage NVARCHAR(MAX); SELECT @StatusMessage = Accelerator.GetStatusMessage(); --Assert:ステータスメッセージが正しいか確認t EXEC tSQLt.AssertEqualsString 'The Accelerator is prepared with 3 particles.', @StatusMessage; END;
テストケースが走ると、結果はテキストで表示される(オプションでXMLフォーマットの出力)。
+----------------------+ |Test Execution Summary| +----------------------+ |No|Test Case Name |Result +--+------------------------------------------------------------------------+-------+ |1|[AcceleratorTests].[test status message includes the number of particles]|Success| ------------------------------------------------------------------------------- Msg 50000, Level 16, State 10, Line 1 Test Case Summary: 1 test case(s) executed, 1 succeeded, 0 failed, 0 errored. -------------------------------------------------------------------------------
テストクラス内で、いくつかのテストケースが一旦作られると、 EXEC tSQLt.RunAllを使ってバッチとして走らせることもできる。 tSQLtを始めるための更なる情報は、 tSQLt Tutorialにある。
SQLユニットテストを継続的ビルドプロセスの一部にしたいと思う人は、tSQLtを Cruise Controlに統合できる。InfoQで以前報告したように、SQL Testと呼ばれる tSQLtのビジュアルインターフェース版もある。tSQLt はSQL Server 2005 SP2 以上と互換である。