tSQLtでプロダクトコードをテストする

# 概要

前回の続きです。
https://qiita.com/RYA234/items/1236a6b31b87d71684ea

今回はプロダクトコードのプロシージャをテストする方法を投稿します。

# 対象読者
・tSQLtのテストコードからプロダクトコードのストアド・プロシージャを呼んでテストしたい
・プロダクトコードとテストコードのプロシージャの配置場所を分離したい方

# 配置図

```plantuml
@startuml
title:プロダクトコードとテストコードの配置場所について
database SQL_server{ 
rectangle "DATABASE：main\nプロダクトコードを配置する"{
            rectangle "ストアド_"{
            file input_pass_output
            }
        }
rectangle "DATABASE：tSQLt_Sample\nテストコードを配置する"{
            rectangle "ストアド"{
            file test_input_pass_output
            collections tSQLt_Procedures
            }
        }
}
agent client

}


test_input_pass_output --> input_pass_output :use
test_input_pass_output --> tSQLt_Procedures :use
client -->test_input_pass_output : call procedure(USE [tSQLt_Example] EXEC tSQLt.Run 'testApp')
@enduml



```



# コード

## プロダクトコード
```sql: /usr/src/docker/src/main/sample/input_output.sql
-- Create Date: 2020-12-22 16:00:00
-- 第一引数の入力値を第二引数の出力値に設定するストアド
-- ストアドに追加する方法
-- /opt/mssql-tools18/bin/sqlcmd -U sa -P user@12345 -C -i /usr/src/docker/src/main/sample/input_output.sql
-- ↓↓テストの実行コマンド
-- /opt/mssql-tools18/bin/sqlcmd -U sa -P user@12345 -C -Q "USE [tSQLt_Example] EXEC tSQLt.Run 'testApp'"
-- 

USE [main]
GO

CREATE OR ALTER PROCEDURE dbo.input_pass_output
    @inputValue int,
    @outputValue int OUTPUT
AS
BEGIN
 SET @outputValue = @inputValue;
END
GO


```


## テストコード
```sql:/usr/src/docker/src/test/sample/test_input_output.sql
-- Create Date: 2020-12-22 16:00:00
-- 別データベース名のプロダクトコードを呼んでテストするためのスクリプト
-- ストアドに追加する方法
-- /opt/mssql-tools18/bin/sqlcmd -U sa -P user@12345 -C -i /usr/src/docker/src/test/sample/test_input_output.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_input_output_success]
AS
BEGIN
	DECLARE	@expected int; SET @expected =1;
	DECLARE	@actual int;

	EXEC	productg.dbo.[input_pass_output]
			@inputValue = 1,
			@outputValue = @actual OUTPUT

	EXEC tSQLt_Example.tSQLt.AssertEquals @expected, @actual;
END
GO


USE [tSQLt_Example]
GO

CREATE OR ALTER PROCEDURE testApp.[test_input_output_failure]
AS
BEGIN
	DECLARE	@expected int; SET @expected =0;
	DECLARE	@actual int;

	EXEC	productg.dbo.[input_pass_output]
			@inputValue = 1,
			@outputValue = @actual OUTPUT

	EXEC tSQLt_Example.tSQLt.AssertNotEquals @expected, @actual;
END
GO

```

# 実行方法
docker コンテナの中で実行する方法を書きます。

## ストアドの登録
```bash
# product code
/opt/mssql-tools18/bin/sqlcmd -U sa -P user@12345 -C -i /usr/src/docker/src/main/sample/input_output.sql

# test code
/opt/mssql-tools18/bin/sqlcmd -U sa -P user@12345 -C -i /usr/src/docker/src/test/sample/test_input_output.sql
```

## テストコードの実行と結果

```bash
/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]           |     17|Success|
|2 |[testApp].[test_input_output_failure]|     34|Success|
|3 |[testApp].[test_input_output_success]|     17|Success|
----------------------------------------------------------------------------------------
Test Case Summary: 3 test case(s) executed, 3 succeeded, 0 skipped, 0 failed, 0 errored.
----------------------------------------------------------------------------------------


```

# MSSMSから見たストアドの状態
データベース名でプロダクトコードとテストコードを分けられていることを確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/5bc35826-2c7a-01a8-c768-5060836d54ec.png)


# 参考　
tSQLt　公式
https://tsqlt.org/
github 差分

https://github.com/RYA234/SQL_Server_on_docker/commit/9aedf5c1a29952fc86e06f5e1b1c96a485f426b1