1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2025-01-25

概要

実務の方で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等

クラス(=スキーマ)を新規作成

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

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

テストコード

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コンテナ内で実行した場合

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

実行したときのスクショ
image.png

余談 ストアドプロシージャに対してフィルター処理を施す

デフォルトだとtSQLtのストアドも表示されるのでテストコードを確認しにくいです。
テストコードだけ確認したいので、フィルターの設定を行います。

image.png

感想

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

気になったのは一点です。
・Parameterized Testができない。
 →テストコードの重複が生じる
・テストケースの名称を日本語で書けない

課題

・データベース名(main)に書いたストアドをテスト用データベースでテストするコードを作成する。

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

参考

docker環境構築方法

tSQLt 公式

github差分

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?