Slide 1

Slide 1 text

PostgreSQL開発とテスト
 吉田 侑弥 @フォルシア株式会社
 2022.02.15 FORCIA Meetup#4


Slide 2

Slide 2 text

自己紹介 ● 吉田 侑弥 (Yuya Yoshida) ● ソフトウェアエンジニア@フォルシア株式会社 ○ webアプリケーション (TypeScript, Node.js, React, Next.js, NestJS, PostgreSQL) ○ 大規模アプリ開発 ○ パフォーマンスチューニング 2

Slide 3

Slide 3 text

DB関連のテストは(比較的)大変 ● 一般的には ○ アプリと比較して環境構築のコストが高い ○ 作業者間の差異がない環境下のテスト(再現性の担保)が難しい ● フォルシアでは以下のような工程が多い ○ 元のデータを検索用データに加工する(バッチSQL) ○ データから必要なデータを高速に抽出する(オンラインSQL) ○ 汎用的なモジュール開発(拡張機能やユーザー定義関数) →比較的テストの実施が容易な環境 3

Slide 4

Slide 4 text

テスト観点① ● バッチSQL ○ バッチ処理が正常終了するか ○ 処理が意図した通りか ● オンラインSQL ○ 正しいSQL文が生成されるか ○ クエリが意図した通りか 4

Slide 5

Slide 5 text

テスト観点①…実施パターン ● バッチSQL ○ バッチ処理が正常終了するか  → テストデータでバッチ実行 ○ 処理が意図した通りか  → 結合テスト ● オンラインSQL ○ 正しいSQL文が生成されるか  → スナップショットテスト ○ クエリが意図した通りか  → 結合テスト 5

Slide 6

Slide 6 text

6 (補足)JSのテスト環境(Jest + Frisby) 6 ● Jest: JSのテストフレームワーク ● Frisby: Jest上で動くAPIテスト フレームワーク ● SQL文の生成はJest単体、結合テス トはJest + Frisbyで実施

Slide 7

Slide 7 text

拡張機能とは ● postgreSQLは拡張性の高いRDBMS ● フォルシアでも多くの拡張機能を活用 ● 外部ツール ○ pg_bigm, pg_bulkload etc… ● 自社ツール ○ ユーザー定義関数(C言語) etc… 7

Slide 8

Slide 8 text

テスト観点② ● 拡張機能・ユーザー定義関数 ○ 正しく導入できるか ○ 意図した結果を得られるか 8

Slide 9

Slide 9 text

テスト観点②…実施パターン ● 拡張機能・ユーザー定義関数 ○ 正しく導入できるか  →仮想環境 (docker) でのビルド、インストール ○ 意図した結果を得られるか  →リグレッションテスト 9

Slide 10

Slide 10 text

仮想環境 (docker) でのビルド ● 新規プロジェクトの多くは仮想環境でDBサーバーを用意 →社内共通のpostgreSQLイメージを利用 ● 汎用モジュール開発時 ○ 共通イメージ環境下でのビルド、テスト(推奨) 10

Slide 11

Slide 11 text

pg_regress ● postgreSQL標準のリグレッションテストツール ● 実行すると一時的にサーバーが起動し、テスト用のDBが生成される ● 予めSQL文と実行結果の準備が必要 11

Slide 12

Slide 12 text

DBテストとCI ● これまで挙げたテストは全て手元だけでなくCIでも実行 ○ DB周りの処理はどうしても環境の差異が出やすい CIでエラー検知するケースは体感かなり多い ● ただし、ある程度マシンパワーと時間が必要 →時には実行タイミングをある程度制御することも e.g. ビルドはmaster merge時のみ、バッチ処理は定時実行 等々… 12

Slide 13

Slide 13 text

現在議論中の内容 ● SQLのsyntax check ○ DBサーバーを介さずにチェックができると嬉しい ○ pglast等を活用して実現できそう? ● パフォーマンステスト ○ 拡張や関数の効果を定量的に測定したい ○ 実現方法を模索中 13

Slide 14

Slide 14 text

EOF