2024-12
2024-12-17
正規表現使ってなんとかどうにかした
https://scrapbox.io/files/676185139bd4336aed3a4c59.png
2024-12-11
全く書いてないしいらないんじゃないかという気がしてきました
最近はひたすら Go アプリケーションの基盤整備的なことをしているが
今日は DB をテストする回
気持ちとしては可能な限りモックを使いたくないので,効率的に DB を使ったテストができると最高
go testで動いてほしい
t.Parallelしてもうまく,かつ高速に動いてほしい
txdb の後ろで動かすためや,pgx.Connが必要などの何らかの理由で本物の DB が必要という場面で使う
コンテナなので実際重く,ローカルで起動したくはなるがバージョン固定とかがしんどいので採用した
実際にはCREATE DATABASEすればいいのでインスタンスは1つでいいはずだが,Go のテストはパッケージごとに別プロセスとして実行されるのでこれらを共有するのは難しい
闇のプロセス間通信をすれば可能だとは思うけどできたとしてライフサイクルの管理などの問題が発生する
TestMainの全体版が欲しいけど,fork してるわけじゃない(Go のランタイムは fork をサポートしてない)からどういう I/F にするのかから厄介そう
txdb はトランザクションを使って仮想的にベースの DB を shallow copy した DB を作り出す
新たなsql.DBインスタンスが要求されたとき,ベースの DB 上でトランザクションを開始する
終了するときにトランザクションをロールバックする
(仮想的な)トランザクションはセーブポイントの機能を使って実現している
テストごとに DB を分離するのに使う
txdb より早い段階で仮想トランザクションの機能をサポートしていたが,txdb も実装しているので機能上の差異はほとんどないように見える
セーブポイントを使ったトランザクションの実装に差異がある
txdb はトランザクションのコミット時にセーブポイントを開放しているが,pgtxdb は何もしていない
開放したほうが誤ったロールバックを防げるので良さそうに見える
DB を計装したい
要件としては
ドライバーのコネクション(pgx.Conn など)が取り出せる
db.query.summaryとか難しいけど……
だいたい2つ実装がある
github.com/uptrace/opentelemetry-go-extra/otelsqlとgithub.com/XSAM/otelsql
conn.Raw()をサポートしてるのはXSAM/otelsqlのほうだけなので選択肢がない
ちなみにどっちも semconv のサポートはあんまりです