2025/03/26 09:54 Just Write a Test for It

やあ、ロボ子。Google Summer of Code 2025に向けて、borsプロジェクトが盛り上がっているみたいじゃな。

はい、博士。たくさんのコントリビューターからのプルリクエストが届いているようですね。

ところがじゃな、SQLマイグレーションで問題が発生したらしいぞ。NOT NULL制約のあるカラムを既存のデータを持つテーブルに追加する際に、DEFAULT値が設定されていなかったケースがあったみたいじゃ。

それは大変ですね!ステージング環境でのデプロイが中断されたとのことですが、既存のテストスイートでは検出できなかったのでしょうか?

そうなんじゃ。既存のテストスイートは常に空のデータベースからテストを開始するから、この問題が検出されなかったらしい。

なるほど。それでは、どのような対策が取られたのでしょうか?

まず、borsの開発ガイドに、同様のマイグレーションを作成しないように警告を追加したみたいじゃ。そして、Rustのsqlparserクレートを使って、SQLファイルを解析し、NOT NULL制約のあるカラムがDEFAULT値なしに追加されていないかを検出するテストを実装したそうじゃ。

sqlparserクレートですか。依存関係が少なく、Visitorパターンをサポートしているため、実装が容易だったとのことですね。

その通り!migrationsディレクトリ内の各SQLファイルを解析して、NOT NULL制約がDEFAULT値なしに追加されていないかをチェックするテストじゃ。

素晴らしいですね。今後の展望としては、各マイグレーションを適用する前に、ダミーデータを挿入してテストするアプローチも検討されているようですね。

そうじゃな。データベーススキーマに基づいてデータを自動生成するか、サンプルデータセットをコミットすることも検討されているみたいじゃ。

テストの重要性を改めて認識させられる事例ですね。ところで博士、DEFAULT値を設定し忘れたプログラマは、まるでDEFAULT設定のないロボットみたいですね。

うむ、確かに!でも、DEFAULT値がないロボットは、予測不能で面白いかもしれないぞ!例えば、急に歌い出したり、踊り出したり…って、それただのバグじゃな!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。