Slide 1

Slide 1 text

Session Title Goによる SQLクエリテストの取り組み Yuki Mukasa / @a-r-g-v(batta) Marketplace IDP Team

Slide 2

Slide 2 text

Yuki Mukasa / @a-r-g-v IDP Team所属 2020年に新卒バックエンドエンジニアとしてメルペ イに入社 2023年4月までメルペイ加盟店管理のシステム開 発と運用に従事 現在はメルカリの認証・認可を担う IDPチームに所 属している Backend Engineer @ Marketplace IDP Team

Slide 3

Slide 3 text

アジェンダ ● 背景 ● 課題 ● 解決方法 ● デモ ● 効果 ● 今後の展望

Slide 4

Slide 4 text

背景 ● 複雑な条件を持つBigQuery SQLクエリが存在している ○ 外部環境により要件が定期的に変更される ○ システム化が困難 ● クエリは複雑さの他に、テスタビリティの問題も抱えていた ○ 改修契機の開発者テストの実施が困難になっていた ○ クエリの変更を安心して行えない状態

Slide 5

Slide 5 text

背景:クエリの複雑性 ● 契約条項に基づく複雑な条件 ○ (例) 審査通過日 、加盟店獲得後の決済情報、決済用QRコードの要否 ● 複数のマイクロサービス・データベースへの依存 ○ 業務ドメインで分割されているサービスを横断参照している ■ (例) 申し込み、審査、事業者情報、決済、加盟店精算、決済用QR コード配送など ● 最長で 600行の数十のクエリが存在している

Slide 6

Slide 6 text

課題 ● クエリに対する開発者テストが煩雑であること ○ テストデータの投入の煩雑さ ■ 依存テーブル数や必要テストパターン数の多さ ■ 手作業の多さ ● リグレッションテストスイートが存在しなかったこと ○ クエリの変更を安心して行えない状態

Slide 7

Slide 7 text

解決方法 ● Go言語でクエリのテストを簡単に書けるようにする方法の作成 ○ テストコード中でデータを投入・クエリ実行し、結果をアサーションする ○ 簡単に行うために、これを支援するライブラリを作成 ● CIで自動テストを実行しデグレード検知できるようにする

Slide 8

Slide 8 text

解決方法:クエリテストの動作イメージ Goのテストとしてテストケースを実装する。テストケースごとに以下を実行します。 入力:テスト対象クエリのパス、挿入したいテストデータ 1. テスト対象クエリが依存しているテーブルを抽出し、テスト用データセット配下にテーブル を1件ずつ作成します。 2. テストケースで指定されているテストデータを、テスト用テーブルに挿入 3. 作成したテーブルに使用するように、対象クエリのFROM句を書き換えます。 4. クエリを実行し、期待している結果と同じか確かめます。 5. テストケースのクリーンアップで、作成したテスト用テーブルをすべて削除

Slide 9

Slide 9 text

解決方法:コード生成でデータ作成支援 ● 依存テーブルをGoの構造体として生成する仕組みの作成 ○ https://github.com/ginokent/bqschema-gen-go を改造 ● 同一リポジトリに存在するすべてのSQLファイルを読み、コード生 成を行うコマンドを作成した ○ クエリが依存しているテーブル一覧を表す構造体 ○ 各テーブル定義に対応する Goの構造体

Slide 10

Slide 10 text

デモ実演

Slide 11

Slide 11 text

効果 ● テスト実施が容易になり安心してクエリを変更できるように ○ テストデータのコーディングに型の恩恵 ■ 誤指定の防止やコード補完 ○ テーブルテストや共通化による差分テストケース追加の容易化 ■ 境界値テスト・網羅的なテストがしやすくなった ● 開発者テストケースの蓄積によるデグレード検出の自動化

Slide 12

Slide 12 text

今後の展望 ● QAテストケースの置き換えの検討 ● クエリテストのケース網羅性可視化 ○ テストカバレッジなどを算出できるような仕組みの検討 ● 投入テストデータの正しさの検討

Slide 13

Slide 13 text

No content