PrismaからPGliteに繋げてリポジトリ層のテストをお手軽にやってみた
こんにちは、エンジニアの籏野です。
今回はPGliteとPrismaを用いて、実際にデータベースに接続して行うリポジトリ層のテストについて紹介します。
作成したサンプルプロジェクトは以下のリポジトリに置いていますので、合わせてご確認ください。
リポジトリ層におけるテストの課題
クリーンアーキテクチャのようなデザインパターンを利用する場合、リポジトリ層を利用してビジネスロジックとデータアクセス層を分離することはよくあるかと思います。
これにより、ビジネスロジック層においてはリポジトリ層をモックしてデータベースに依存することなくテストを行うことが可能になります。
一方、リポジトリ層についてはデータベース接続に用いているライブラリをモックしてテストすることも考えられますが、なるべく実際の動作に近い形でテストを行いたいためデータベースを用意してテストをしたいと考えました。
この場合、これまでだとDockerでPostgreSQLコンテナを立ち上げる必要がある等煩雑な手段が必要となっていました。
これらの課題を解決するために、WebAssembly(Wasm)で動作するPGliteを利用し、より手軽にテストできる環境を構築してみました。
PGliteについて
PGliteは、PostgreSQLをWasmにコンパイルした軽量なデータベースエンジンです。
主な特徴は以下の通りです:
- 軽量: Wasmベースで約3MBという軽量サイズ
- 環境非依存: Node.js、ブラウザ、Deno等様々な環境でPostgreSQLを動作させることが可能
- 拡張性: PostgreSQLの拡張機能が適用可能
Prisma Driver Adaptersについて
Prismaでは、データベース接続にカスタムのドライバを使用できるDriver Adaptersという仕組みがあります。
この機能を利用することで、標準的なPostgreSQL接続の代わりにPGliteを使用してPrismaクライアントを動作させることができます。
PGlite Prisma Adapterの実装
実際のコード例を見ながら、セットアップ方法を紹介していきます。
依存関係のインストール
標準的なprismaの依存関係に加えて、PGliteとPrisma用のアダプターをインストールします。
pnpm install @electric-sql/pglite pglite-prisma-adapter
Prismaスキーマの設定
schema.prisma
ファイルにてdriverAdapters
機能を有効にします。
Prismaの設定ファイル
prisma db push
でPGliteでデータベースをセットアップできるように設定ファイルを作成します。
PGliteを用いたPrismaClientのセットアップ
上記で作成したPrismaClientをリポジトリ層に渡すことでテストを実行できるようにします。
テストの実行
実際のテストコードはこちらをご覧ください。
これまでの繰り返しになりますが、PGliteを利用することで簡単にデータベースを用意した上で、実際にPostgreSQLの機能を利用したテストが可能になっています。
まとめ
PGliteとPrisma Driver Adaptersを組み合わせることで、以下にまとめるように手軽にリポジトリ層のテストを行うことが可能になりました。
- セットアップが簡単: Docker不要で瞬時にPostgreSQLテスト環境が立ち上がる
- 依存の少なさ: Node.jsさえあれば動作するため、構築済みのCI環境への導入も容易
- 信頼性の高さ: 実際のPostgreSQLエンジンを使用してテストが可能
リポジトリ層のテストで悩んでいる方は、ぜひPGliteを試してみてください!
この記事を書いた人
籏野 拓
2018年新卒入社
Discussion