概要
実務の方でSQLServerを使う機会があり、テストフレームワークtSQLtを導入してみました。
想定読者
SQLServerに単体テストを導入したい方
tSQLtとは
SQLServer用のユニットテストフレームワーク
tSQLtを導入する背景
アプリケーション側がローコード開発ツールのため、DB側のストアドや関数にビジネスロジックや、例外処理などを記述したいからです。
if文の分岐や例外処理をテストしたことを明示に示したいため、tSQLtを導入しました。
開発環境
名称 | version | 説明 |
---|---|---|
Windows | 10 | 開発環境のOS |
Docker | -- | コンテナ型仮想環境 |
SQLServer | 2022 developper Edition | データべース |
tSQLt | V1.0.8083.3529 | SQLServerのテストフレームワーク |
VisualStudio | 2022 community | IDE ステップ実行のデバッグができる |
MSSMS | v18.9.2 | SQLServerのGUIクライアント |
インストール方法
下から最新版をダウンロードする
https://tsqlt.org/downloads/
ダウンロードしたフォルダに含まれているsqlを実行
PrepareServer.sql
Example.sql
tSQLt.class.sql
の順で実行
Example.sqlを実行すると データベース名tSQLt_Exampleが生成される
tSQLt.class.sqlを実行すると、tSQLt_Exampleのストアドにclass関係のストアドが追加される。例 dropClass NewClass等
クラス(=スキーマ)を新規作成
テストコードを配置するスキーマを作成します。
オブジェクト指向のクラスをスキーマで再現してるのか??
-- test用のスキーマを作成する
EXEC tSQLt_Example.tSQLt.NewTestClass 'testApp';
GO
テストコード
-- Create Date: 2020-12-22 16:00:00
-- Assertionのみのテスト tSQLtが実行できるかを確認するためのスクリプト
-- ストアドに追加する方法
-- /opt/mssql-tools18/bin/sqlcmd -U sa -P user@12345 -C -i /usr/src/docker/src/test/sample/assertion_check.sql
-- ↓↓テストの実行コマンド
-- /opt/mssql-tools18/bin/sqlcmd -U sa -P user@12345 -C -Q "USE [tSQLt_Example] EXEC tSQLt.Run 'testApp'"
-- ;
USE [tSQLt_Example]
GO
CREATE OR ALTER PROCEDURE testApp.[test_give_test]
AS
BEGIN
DECLARE @expected int; SET @expected =0;
DECLARE @actual int;SET @actual =0;
EXEC tSQLt_Example.tSQLt.AssertEquals @expected, @actual;
END
GO
テスト実行
dockerコンテナ内で実行した場合
# dockerコンテナに入っている前提
/opt/mssql-tools18/bin/sqlcmd -U sa -P user@12345 -C -Q "USE [tSQLt_Example] EXEC tSQLt.Run 'testApp'"
## ------------結果---------
+----------------------+
|Test Execution Summary|
+----------------------+
|No|Test Case Name |Dur(ms)|Result |
+--+--------------------------+-------+-------+
|1 |[testApp].[test_give_test]| 32|Success|
----------------------------------------------------------------------------------------
Test Case Summary: 1 test case(s) executed, 1 succeeded, 0 skipped, 0 failed, 0 errored.
----------------------------------------------------------------------------------------
MSSMS (visualStudioでも可)から実行した場合
クエリを実行するとテストできます。
EXEC tSQLt.Run 'testApp'
余談 ストアドプロシージャに対してフィルター処理を施す
デフォルトだとtSQLtのストアドも表示されるのでテストコードを確認しにくいです。
テストコードだけ確認したいので、フィルターの設定を行います。
感想
以下の4点が良いと思いました。
・githubの更新頻度が高い
・ドキュメントがわかりやすく書かれている。
・docker上に作成したSQLServerでも動く。
・導入がsqlのみでできるのでシンプル
ミドルウェアの依存関係とか調べなくて済んだので詰む箇所が少なかったです。
気になったのは一点です。
・Parameterized Testができない。
→テストコードの重複が生じる
・テストケースの名称を日本語で書けない
課題
・データベース名(main)に書いたストアドをテスト用データベースでテストするコードを作成する。
・CI環境を作成する。github Actionを使う???
参考
docker環境構築方法
tSQLt 公式
github差分