4
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?

C#Advent Calendar 2024

Day 17

TestContainerを使ったテスト

Last updated at Posted at 2024-12-16

WebAPIが呼び出しているDomain Serviceのテストを行います。
WebAPIは架空のユーザデータのCRUDをDB(今回はPostgres)を利用しています。
テストはWebAPIに対して行い、Test Containersが用意したDBに接続し、毎回初期データが入った状態でテストをします

この時期は以前書いたTestContainer for .Netを使い、まっさらなDBでUnitTestを行うのアップデート版です

環境

  1. Vusla Studio 2022
  2. .NET9
  3. xUnit
  4. TestContainers
  5. Postgres
  6. EntityFrameworkCore
  7. A5:SQL Mk-2

今回紹介する方法のメリットは

  1. 本番と同様のDBを利用可能
  2. 初期データの作成、投入か簡単
  3. InsertやDeleteが可能(毎回データが初期化されるので)
  4. 初期データはGitで管理することにより共有が可能
  5. 開発、テストが楽
    といったところでしょうか。

ソースの準備

WebAPIを想定しサンプルソースを準備しました。
リポジトリ

ソースの構造

image.png

流れ

私は仕事で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に記載

テストデータ作成

image.png

insert文出力

A5:SQL Mk-2にて
テストデータを全選択し、Insert文を出力します

image.png

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を準備することができます。
まずはリポジトリをクローンしテストしてみてください

4
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
4
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?