Slide 1

Slide 1 text

機能が複雑化しても 頼りになる FactoryBotの話 2025.03.01 TokyoWomen.rb #1 Tamiko.f

Slide 2

Slide 2 text

T a m i k o . f 所 属         ユ ニ フ ァ 株 式 会 社 主 な 業 務     保 育 I C T プ ロ ダ ク ト ル ク ミ ー の             サ ー バ ー サ イ ド 開 発             主 な 開 発 言 語 は R u b y o n R a i l s                                   開 発 者 ブ ロ グ も と き ど き 執 筆 し て ま す                       h t t p s : / / t e c h . u n i f a - e . c o m / e n t r y / 2 0 2 4 / 1 2 / 1 4 / 0 8 0 0 0 0 居 住 地       山 梨 県 甲 府 市 ( 移 住 5 年 目 ) 好 き な こ と   食 べ 歩 き と 水 族 館 巡 り 推 し の 水 族 館 は 新 江 ノ 島 水 族 館 好 き な 魚 類 は サ メ

Slide 3

Slide 3 text

頼りになるFactoryBotとは?

Slide 4

Slide 4 text

いつでも期待値を満たすテストデータを アウトプットしてくれる

Slide 5

Slide 5 text

本日は期待値を満たす テストデータ出力を支える sampleとtraitについて

Slide 6

Slide 6 text

sampleとは? Rubyの配列からランダムに要素を取り出すメソッド これを活用し、FactoryBotで毎回異なる組み合わせのテストパターン生成させる 例

Slide 7

Slide 7 text

実装時に間違いをおこしやすい機能の例 管理者権限における記事の下書き一覧機能 管理者でアクセスすると、管理者ロールのすべての下書きの記事を表示できる 一般ロールの記事は「読み取り可/編集可」の下書きのみ表示できる 公開済みステータスの記事はどの権限でも表示しない 誤った実装例 orで結合した一般権限は、下書きの絞り込みが抜けている。一見すると最初の draft ですべての下書きに絞り込めているようにみえるのが厄介

Slide 8

Slide 8 text

テスト 各権限が「下書き」のデータのみ取得することをチェックしている 更に一般の場合は「読み込み」と「書き込み」のデータのみを取得することをチェック テストシナリオは期待値を満たすチェックを実施できている。

Slide 9

Slide 9 text

固定値とランダム値のFactoryでテスト結果を比較 ランダム 固定値 毎回同じ sampleを使って、status, role, permissionを毎回ランダムに生成

Slide 10

Slide 10 text

テスト結果 Factory固定値: Success Factoryランダム: Failed

Slide 11

Slide 11 text

Factoryが固定値の場合 Factoryがランダムの場合 下書き(draft)のテストパターンしか生成していない 結果、成功するテストパターンしかテストシナリオを通していない状態となった 固定値を使用した場合、テストが不十分なことに気づきにくい デフォルト値がないので、網羅的なパターンが生成できる テストを繰り返し実行することで 網羅性が高まる テストパターンの考慮漏れをカバーしてくれる specのコード変更していないのに、テストの精度が向上した

Slide 12

Slide 12 text

修正後 テストも無事にSuccess 🎉 正解の実装例とランダム値でのテスト結果

Slide 13

Slide 13 text

テスト(再掲) このテストパターンだと、条件が網羅されているかを読み取りにくい

Slide 14

Slide 14 text

すべてをランダムに任せない モデルのスコープなど、基本機能のテストは(特に)   明示的にパターンを網羅する

Slide 15

Slide 15 text

traitを活用して可読性と網羅性をあげる

Slide 16

Slide 16 text

traitとは? 特定の条件を定義したテストパターンを作成できるFactoryBotの機能 create(:post, :draft, :permission_read) のように簡潔に特定の状態を持つ テストパターンを作成できる。

Slide 17

Slide 17 text

元の実装 status と permission の traitを追加 パターンが網羅されていることが明確になった

Slide 18

Slide 18 text

(参考)traitありなしのテストパターンの比較(極端な例)  なし あり (追加実装でわりと連星してしまう)

Slide 19

Slide 19 text

まとめ 将来に機能が複雑化しても頼りになるテストパターンをいつでも書ける 🎉 副作用が起きにくいので次のテストを書くときにリファクタしやすい(かも) FactoryBotのsampleとtraitを効果的に活用すると sampleでランダムデータを生成することで 1. 実装漏れや予期せぬパターンを効果的に検出できる テストの網羅性が向上する 更にtraitを活用することで 2. 意図を伝えやすいテストパターンを量産できる コードを読むときの認知負荷も下げることができる

Slide 20

Slide 20 text

ご清聴ありがとうございました!!