Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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