WebAPIが呼び出しているDomain Serviceのテストを行います。
WebAPIは架空のユーザデータのCRUDをDB(今回はPostgres)を利用しています。
テストはWebAPIに対して行い、Test Containersが用意したDBに接続し、毎回初期データが入った状態でテストをします
この時期は以前書いたTestContainer for .Netを使い、まっさらなDBでUnitTestを行うのアップデート版です
環境
- Vusla Studio 2022
- .NET9
- xUnit
- TestContainers
- Postgres
- EntityFrameworkCore
- A5:SQL Mk-2
今回紹介する方法のメリットは
- 本番と同様のDBを利用可能
- 初期データの作成、投入か簡単
- InsertやDeleteが可能(毎回データが初期化されるので)
- 初期データはGitで管理することにより共有が可能
- 開発、テストが楽
といったところでしょうか。
ソースの準備
WebAPIを想定しサンプルソースを準備しました。
リポジトリ
ソースの構造
流れ
私は仕事でC#を使い、受注開発を行っています。
納品物としてデータベース定義書が求められる事から、コードファーストではなくER図ファーストでDBの開発を行っていきます。
TestContainers
TestContainersは実行時に指定したコンテナを実行。使い終わったら破棄を行ってくれます。
Postgresもサポートしています。
Postgres実行時にdocker-entrypoint-initdb.dにあるsqlファイルを実行してくれるので、ここにinit.sqlファイルを置きテーブル作成および初期データ投入をします。
サンプルソースの
db/tctest-postgresql/init/init.sql
にあります
init.sqlの最初には
\c postgres
と記述しDatabaseを指定します
ER図作成
A5:SQL Mk-2を使い
テーブル:user_info
論理名 | 物理名 | 型 |
---|---|---|
ユーザID | user_id | varchar(100) |
名前 | name | varchar(100) |
年齢 | age | integer |
を作成 |
DDL出力
A5:SQL Mk-2を使いDDLを出力
-- ユーザ
-- * RestoreFromTempTable
create table user_info (
user_id varchar(100)
, name varchar(100) not null
, age integer not null
, constraint user_info_PKC primary key (user_id)
) ;
comment on table user_info is 'ユーザ';
comment on column user_info.user_id is 'ユーザID';
comment on column user_info.name is '氏名';
comment on column user_info.age is '年齢';
上記のようなコードが出力されます。
これをinit.sqlの"\c postgres"より下にコピーします。
DB起動
PowerShellなりでdbフォルダに移行し
docker compose up
で起動します。
A5:SQL Mk-2で接続します
設定項目 | 設定値 | 備考 |
---|---|---|
サーバ名 | localhost | |
ポート番号 | 51557 | docker-compose.ymlに記載 |
データベース名 | postgres | |
ユーザ名 | user | docker-compose.ymlに記載 |
パスワード | pass | docker-compose.ymlに記載 |
テストデータ作成
insert文出力
A5:SQL Mk-2にて
テストデータを全選択し、Insert文を出力します
init.sql追記
Insert文をinit.sqlのDDLの下にコピー
DBの再起動
init.sqlにDDL + 初期データ投入SQLが記載された段階でPostgresを起動しなおします。
docker-compose.ymlがあるフォルダにて
docker compose down
Postgresを削除
docker compose up
で起動
A5:SQL Mk-2にて、作り直したPostgresに初期データが入っていることを確認します
TestContainerテスト
Visual StudioにてxUnitでテストを実行します。
Testファイルを実行するたびに、TestContainersがPostgresを起動しテストコードを実行します。
おわりに
デバッグ、テストで同じ初期データを使えるので、開発、テストが楽になりました。
テーブル、初期データを追加した場合でも、他のメンバーはコンテナを作成し直すことで、ソースと同期したDBを準備することができます。
まずはリポジトリをクローンしテストしてみてください