Docker上のSQLServerにテストフレームワークtSQLtを導入


# 概要
実務の方でSQLServerを使う機会があり、テストフレームワークtSQLtを導入してみました。

# 想定読者
SQLServerに単体テストを導入したい方

# tSQLtとは

SQLServer用のユニットテストフレームワーク

https://tsqlt.org/

# 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等

## クラス（＝スキーマ）を新規作成
テストコードを配置するスキーマを作成します。
オブジェクト指向のクラスをスキーマで再現してるのか？？


```sql:src/tSQLt_setting/createClass.sql
-- test用のスキーマを作成する
EXEC tSQLt_Example.tSQLt.NewTestClass 'testApp';
GO

```


# テストコード
```sql:src/test/sample/assertion.check.sql
-- 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コンテナ内で実行した場合

```bash
# 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でも可)から実行した場合
クエリを実行するとテストできます。
```sql
EXEC tSQLt.Run 'testApp'
```

実行したときのスクショ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/fe71e6d4-26f0-53bf-bbf7-fab3466f8e00.png)


### 余談　ストアドプロシージャに対してフィルター処理を施す
デフォルトだとtSQLtのストアドも表示されるのでテストコードを確認しにくいです。
テストコードだけ確認したいので、フィルターの設定を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/67485af0-795b-261e-de08-77181ca56ce3.png)





# 感想
以下の４点が良いと思いました。
・githubの更新頻度が高い
・ドキュメントがわかりやすく書かれている。
・docker上に作成したSQLServerでも動く。
・導入がsqlのみでできるのでシンプル
　ミドルウェアの依存関係とか調べなくて済んだので詰む箇所が少なかったです。

気になったのは一点です。
・Parameterized Testができない。
　→テストコードの重複が生じる
・テストケースの名称を日本語で書けない
 
# 課題
・データベース名(main)に書いたストアドをテスト用データベースでテストするコードを作成する。

・CI環境を作成する。github Actionを使う???

# 問題点
## ストアドのデバッグができない
Linux版はできないみたいですね＞＜

https://github.com/microsoft/mssql-docker/issues/410

# 参考
docker環境構築方法

https://qiita.com/nozakita/items/c55e5fac3fc0364f42f5


tSQLt　公式

https://tsqlt.org/


github差分

https://github.com/RYA234/SQL_Server_on_docker/commit/094ec3e4490140147a9a9b00b3bbaf3ebda96ff8