🐘

PrismaからPGliteに繋げてリポジトリ層のテストをお手軽にやってみた

こんにちは、エンジニアの籏野です。

今回はPGlitePrismaを用いて、実際にデータベースに接続して行うリポジトリ層のテストについて紹介します。
作成したサンプルプロジェクトは以下のリポジトリに置いていますので、合わせてご確認ください。

https://github.com/taku-hatano/pglite-prisma-test

リポジトリ層におけるテストの課題

クリーンアーキテクチャのようなデザインパターンを利用する場合、リポジトリ層を利用してビジネスロジックとデータアクセス層を分離することはよくあるかと思います。
これにより、ビジネスロジック層においてはリポジトリ層をモックしてデータベースに依存することなくテストを行うことが可能になります。
一方、リポジトリ層についてはデータベース接続に用いているライブラリをモックしてテストすることも考えられますが、なるべく実際の動作に近い形でテストを行いたいためデータベースを用意してテストをしたいと考えました。

この場合、これまでだと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機能を有効にします。

https://github.com/taku-hatano/pglite-prisma-test/blob/main/prisma/schema.prisma#L7-L11

Prismaの設定ファイル

prisma db pushでPGliteでデータベースをセットアップできるように設定ファイルを作成します。

https://github.com/taku-hatano/pglite-prisma-test/blob/main/prisma.test.config.ts#L12-L18

PGliteを用いたPrismaClientのセットアップ

上記で作成したPrismaClientをリポジトリ層に渡すことでテストを実行できるようにします。

https://github.com/taku-hatano/pglite-prisma-test/blob/main/src/test-utils/database.ts#L9-L13

テストの実行

実際のテストコードはこちらをご覧ください。

これまでの繰り返しになりますが、PGliteを利用することで簡単にデータベースを用意した上で、実際にPostgreSQLの機能を利用したテストが可能になっています。

まとめ

PGliteとPrisma Driver Adaptersを組み合わせることで、以下にまとめるように手軽にリポジトリ層のテストを行うことが可能になりました。

  • セットアップが簡単: Docker不要で瞬時にPostgreSQLテスト環境が立ち上がる
  • 依存の少なさ: Node.jsさえあれば動作するため、構築済みのCI環境への導入も容易
  • 信頼性の高さ: 実際のPostgreSQLエンジンを使用してテストが可能

リポジトリ層のテストで悩んでいる方は、ぜひPGliteを試してみてください!

この記事を書いた人

籏野 拓
2018年新卒入社

FORCIA Tech Blog

Discussion