Slide 1

Slide 1 text

FactoryBot The Right Way 2020.10.3 Kaigi on Rails

Slide 2

Slide 2 text

Self Introduction • GitHub: @toshimaru • Twitter: @toshimaru_e • Software Engineer at MedPeer Inc. • ࠷ۙͷٕज़తؔ৺ • Vue.js, TypeScript, Ruby3ͷܕγεςϜ

Slide 3

Slide 3 text

࠾༻৘ใ https://medpeer.co.jp/recruit/ ։ൃϒϩά https://tech.medpeer.co.jp/ 8FSF)JSJOH

Slide 4

Slide 4 text

FactoryBot The Right Way ࠓ೔͸ςετσʔλੜ੒ϥΠϒϥϦɺfactory_bot ͷਖ਼͍͠࢖͍ํ ʢRight Wayʣʹ͍͓ͭͯ࿩͠·͢ɻ

Slide 5

Slide 5 text

Why? • ͜Ε·Ͱʮਖ਼͍͠RailsΞϓϦέʔγϣϯͷॻ͖ํʯ΍ʮਖ਼͍͠RSpec ςετͷॻ͖ํʯ͸਺ଟ͘঺հ͞Ε͖ͯͨɻ • Ұํɺʮਖ਼͍͠ςετσʔλͷ࡞Γํʯ͸͋·Γٞ࿦͞Εͯ͜ͳ͔ͬ ͨΑ͏ʹࢥ͑Δɻ

Slide 6

Slide 6 text

Rails ඪ४తςετߏ੒ ϥΠϒϥϦ ςετର৅ 5FTUJOH'SBNFXPSL 34QFD NJOJUFTU 3BJMT"QQMJDBUJPO .PEFM $POUSPMMFS 7JFX 'JYUVSF 'BDUPSZ#PU 3BJMT'JYUVSFT .PEFM0CKFDU %BUBCBTF

Slide 7

Slide 7 text

Why Fixture Matters • ςετͷલఏͱͳΔঢ়ଶΛ࡞Γग़͢ͷ͕ Fixture • લఏ৚݅Λؒҧ͑͹ɺͦͷޙͷςετ΋ഁ୼͢Δ • Fixture Ͱਖ਼͍͠લఏঢ়ଶΛ࡞Γग़͢͜ͱ͕ॏཁ • ςετຖʹԿ౓΋܁Γฦ͠ݺ͹ΕΔ • ඇޮ཰ͳσʔλੜ੒Λ͍ͯͨ͠৔߹ɺςετΛ஗ͤ͘͞ΔཁҼʹ

Slide 8

Slide 8 text

࿩͢͜ͱ 1. FactoryBot: The Right Way / The Good Way • Right Way: ެࣜυΩϡϝϯτ͔ΒͷൈਮɾҾ༻ • Good Way: Right Way ͔Βநग़ͨ͠άουϓϥΫςΟε 2. FactoryBot: The Wrong Way (Bad Way) • FactoryBotͷޡͬͨ࢖͍ํɾྑ͘ͳ͍࢖͍ํ

Slide 9

Slide 9 text

ൃදͷߏ੒ ✅ The Right Way The Good Way The Wrong Way Կ͕μϝʁ/Ͳ͏͢Δʁ

Slide 10

Slide 10 text

ϕϯνϚʔΫʹ͍ͭͯ • ϕϯνϚʔΫ؀ڥ • factory_bot v6.1.0 / Ruby v2.7 • Database ͸ sqlite3 Λ࢖༻ (In-Memory DB, File DB ͷ2ͭΛݕূ) • GitHub Actions ্ͰϕϯνΛ૸ΒͤΔ • benchmark-ips Ͱ଎౓ൺֱ • Repository: toshimaru/factory-bot-the-right-way

Slide 11

Slide 11 text

✅ The Right Way factory_bot gemಋೖ Rails ͷ৔߹:

Slide 12

Slide 12 text

✅ The Right Way factory_bot methodಋೖ Ϋϥε໊Λলུͯ͠Factoryੜ੒ϝιουΛݺͼग़͢͜ͱ͕Ͱ͖ΔΑ͏ʹ:

Slide 13

Slide 13 text

✅ The Right Way Factoryఆٛ

Slide 14

Slide 14 text

The Wrong Way ڊେσϑΥϧτσʔλ

Slide 15

Slide 15 text

The Wrong Way ڊେσϑΥϧτσʔλ: Կ͕μϝʁ • ຊ౰ʹͦͷσʔλɺશ෦ඞཁͰ͔͢ʁ • ͦΕΛར༻͢ΔશͯͷςετέʔεͰ࠷খݶͷલఏঢ়ଶͷੜ੒ʹͳͬ ͍ͯΔ͔ʁ • ແବͳσʔλੜ੒ʹ͸ͳ͍ͬͯͳ͍͔ʁ • ແବͳσʔλੜ੒ • ؒҧͬͨલఏঢ়ଶΛ࡞Γग़͍ͯ͠Δ • ύϑΥʔϚϯεѱԽ

Slide 16

Slide 16 text

The Wrong Way ڊେσϑΥϧτσʔλ: Ͳ͏͢Δʁ • ࠷খݶͷσʔληοτఆٛΛσϑΥϧτFactoryͱͯ͠ఆٛ͠·͠ΐ ͏ʢref. Defining factories > Best practicesʣ

Slide 17

Slide 17 text

✅ The Right Way Factory ϑΝΠϧ഑ஔ • Լهύεʹఆٛ͞ΕͨFactoryϑΝΠϧ͸ࣗಈతʹϩʔυ͞ΕΔ • test/factories.rb • spec/factories.rb • test/factories"/*.rb • spec/factories"/*.rb

Slide 18

Slide 18 text

The Good Way Factory ϑΝΠϧ഑ஔ

Slide 19

Slide 19 text

✅ The Right Way Factory ੜ੒

Slide 20

Slide 20 text

The Wrong Way ແବcreate • build ͰࡁΉͱ͜ΖΛͳΜͰ΋͔ΜͰ΋ create Λ࢖࣮ͬͯϨίʔυΛ ੜ੒ͯ͠͠·͏͜ͱ

Slide 21

Slide 21 text

The Wrong Way ແବcreate: Կ͕μϝʁ • Ϣχοτςετͷඞཁ࠷௿ݶͳલఏ৚݅ʹͳ͍ͬͯͳ͍ • DBʹσʔλ͕ create ͞Ε͍ͯΔ͜ͱ͸ඞཁ৚݅Ͱ͸ͳ͍ • όϦσʔγϣϯͷςετͷ৔߹ɺvalid/invalidͳRubyΦϒδΣΫτͷঢ়ଶ ͑͞࡞͍ͬͯΕ͹Α͍ • SQL͕૸Δ෼ɺύϑΥʔϚϯεѱԽ • ςετ୯ମͰ͸໰୊ʹͳΔ͜ͱ͕ͳ͍͕ɺνϦπϞͰςετΛ஗ͤ͘͞Δ ཁҼʹͳΔ

Slide 22

Slide 22 text

The Wrong Way ແବcreate: Կ͕μϝʁ • create, build ͦΕͧΕΛ࢖ͬͨ৔߹ͷSQLൺֱɿ

Slide 23

Slide 23 text

The Wrong Way ແବcreate: Ͳ͏͢Δʁ • buildΛ࢖͍·͠ΐ͏

Slide 24

Slide 24 text

The Wrong Way ແବcreate: ϕϯνϚʔΫ • In-Memory DB • File DB

Slide 25

Slide 25 text

The Good Way build_stubbed ׆༻ • Լهͷ৔߹ͷςετ • ʮcreated_at ͸ build ͡Όੜ੒͞Εͳ͍ͧ ʯ

Slide 26

Slide 26 text

The Good Way build_stubbed ׆༻ • build_stubbed Λ׆༻͢Ε͹ɺελϒ͞Εͨid, timestampͱͱ΋ʹΦ ϒδΣΫτ͕ੜ੒͞ΕΔ

Slide 27

Slide 27 text

✅ The Right Way Trait (1)

Slide 28

Slide 28 text

✅ The Right Way Trait (2)

Slide 29

Slide 29 text

The Wrong Way Too Many Traits • ྫ֎తͳ஋ɺڥք஋ͳͲΛtrait Ͱ΋Εͳ͘શ෦ఆٛ͠Α͏ͱ͢ Δ͜ͱ

Slide 30

Slide 30 text

The Wrong Way Too Many Traits: Կ͕μϝʁ • traitఆٛ രൃ • Fat Model ͳΒ͵ Fat Factory ͷग़དྷ্͕Γ • Fat Factory • ຊ౰ʹඞཁͳ trait ͕ݟ͚ͭʹ͘͘ͳΔ • ͳΜͰ΋͔ΜͰ΋શͯͷύλʔϯΛ trait ʹدͤͯॻ͖ͨ͘ͳͬͪΌ ͏පؾ͕ൃ঱͢Δ

Slide 31

Slide 31 text

The Wrong Way Too Many Traits: Ͳ͏͢Δʁ • ࢖͍ճͤΔ൚༻తͳৼΔ෣͍ͷΈΛ trait ʹఆٛ͢Δ • ྫ֎తͳ஋͸ݸผͷςετʹدͤΔ • ྫ: ϞσϧͷόϦσʔγϣϯςετ

Slide 32

Slide 32 text

The Wrong Way DRY͡Όͳ͍traits • DRY (Don't repeat yourself) Ͱ͸ͳ͍ traitɺॏෳͨ͠ trait ͕ଟ͘ఆٛ͞Ε͍ͯ Δঢ়ଶͷ͜ͱ

Slide 33

Slide 33 text

The Wrong Way DRY͡Όͳ͍traits: Կ͕μϝʁ • traitఆٛ ૊Έ߹Θͤരൃ • Fat Model ͳΒ͵ Fat Factory ͷग़དྷ্͕Γʢref. Too Many Traitsʣ

Slide 34

Slide 34 text

The Wrong Way DRY͡Όͳ͍traits: Ͳ͏͢Δʁ • ಈ࡞͢ΔσϑΥϧτͷঢ়ଶΛ Factory ͱͯ͠γϯϓϧʹఆٛ͠ɺͦΕ ʹಛघͳঢ়ଶΛఆٛ͢ΔtraitΛॏͶ͍ͯ͘

Slide 35

Slide 35 text

The Wrong Way DRY͡Όͳ͍traits: Ͳ͏͢Δʁ •࡟আ͞Ε͍ͯΔAdminϢʔβʔ࡞੒ ߏஙύλʔϯɿ

Slide 36

Slide 36 text

✅ The Right Way sequence • sequence Λ࢖͏͜ͱͰσʔλʹγʔέϯγϟϧͳφϯόϦϯά͕Մ ೳʹ

Slide 37

Slide 37 text

The Wrong Way ಠࣗsequence id • DBͰ࠾൪͞ΕΔidΛಠࣗͷidͰΦʔόʔϥΠυͯ͠͠·͏͜ͱ

Slide 38

Slide 38 text

The Wrong Way ಠࣗsequence id: Կ͕μϝʁ • Ϩίʔυ࡞੒ͤͣͱ΋id࠾൪͕ߦΘΕΔ • ࣮ࡍͷDBͷڍಈͱҟͳΔͷͰɺϦΞϧͳςετʹͳΒͳ͍

Slide 39

Slide 39 text

The Wrong Way ಠࣗsequence id: Ͳ͏͢Δʁ • ID࠾൪͸DBʹ೚ͤ·͠ΐ͏ • Stub͞Εͨ id ͕ཉ͍͠ͷͰ͋Ε͹ɺ build_stubbed Λར༻͠·͠ΐ ͏ʢref. build_stubbed ׆༻ʣ

Slide 40

Slide 40 text

The Wrong Way ಉ͡஋ͷςετ

Slide 41

Slide 41 text

The Wrong Way ಉ͡஋ͷςετ: Կ͕μϝʁ • name ͕ಉ͡஋Λੜ੒͍ͯ͠ΔͷͰɺuser1.name ͕ user2.name Ͱ ΋ user3.name Ͱ΋ςετ͕௨ͬͯ͠·͏

Slide 42

Slide 42 text

The Wrong Way ಉ͡஋ͷςετ: Ͳ͏͢Δʁ • sequence Λ࢖ͬͯϢχʔΫੑͷ͋ΔσʔλΛੜ੒͢Δ • ϦΞϧϫʔϧυʹ͍ۙσʔλΛ faker Λ࢖ͬͯੜ੒͢Δ

Slide 43

Slide 43 text

✅ The Right Way build_list, create_list • build_list: ࢦఆճ਺ build ͨ͠ίϨΫγϣϯΛฦ͢ • create_list: ࢦఆճ਺ create ͨ͠ίϨΫγϣϯΛฦ͢

Slide 44

Slide 44 text

The Wrong Way ແବlistੜ੒ • ෆඞཁʹ create_list ͯ͠ແବͳσʔλੜ੒Λߦ͏͜ͱ

Slide 45

Slide 45 text

The Wrong Way ແବlistੜ੒: Կ͕μϝʁ • ͦͷσʔλɺશ෦ඞཁͰ͔͢ʁ (ref. ڊେσϑΥϧτσʔλ) • ແବͳσʔλੜ੒ʹ͸ͳ͍ͬͯͳ͍͔ʁ

Slide 46

Slide 46 text

The Wrong Way ແବlistੜ੒: Ͳ͏͢Δʁ • transient + evaluator ͷػ ೳΛ࢖͍ؔ࿈ઌϨίʔυੜ ੒਺Λίϯτϩʔϧ͢Δ • ຊ౰ʹඞཁͳ਺͚ͩࢦఆ͠ ͯϨίʔυੜ੒͢ΔΑ͏ʹ ͢Δ

Slide 47

Slide 47 text

✅ The Right Way Association ఆٛ ↓ ্ड़ͷ post Factory͸ Լهͱಉҙ ↓

Slide 48

Slide 48 text

The Wrong Way Always Create Association • association ઌΛ create Ͱ࡞੒ͯ͠͠·͏͜ͱ

Slide 49

Slide 49 text

The Wrong Way Always Create Association: Կ͕μϝʁ • build ͨ͠৔߹Ͱ΋ৗʹ createʢϨίʔυੜ੒ʣ͕൐͏

Slide 50

Slide 50 text

The Wrong Way Always Create Association: Ͳ͏͢Δʁ • ૉ௚ʹ association ఆٛ͢Δ

Slide 51

Slide 51 text

The Wrong Way Always Create Association: ϕϯνϚʔΫ • In-Memory DB • File DB

Slide 52

Slide 52 text

✅ The Right Way FactoryBot.lint • factory_bot ެ͕ࣜఏڙ͢ΔLintπʔϧ • FYI: rubocop-rspec ʹ FactoryBot ༻ͷϧʔϧ΋ಉࠝ͞Ε͍ͯΔ • ref. RuboCop"::Cop"::RSpec"::FactoryBot

Slide 53

Slide 53 text

✅ The Right Way FactoryBot.lint: how it works • ఆٛ͞Εͨ Factory ΛҰ௨Γ create ͯ͠ɺinvalid ͳ Factory ఆٛΛ ݕ஌͢Δ • traits: true ΦϓγϣϯͰ trait ΋ؚΊͯݕࠪ͢Δ

Slide 54

Slide 54 text

• rakeλεΫԽͯ͠ଞLintπʔϧ ʢrubocop౳ʣͱಉ༷ʹCIͷλε Ϋͷ̍ͭͱͯ͠৐͓ͤͯ͘ The Good Way FactoryBot.lint: rakeλεΫԽ

Slide 55

Slide 55 text

✅ FactoryBot The Right Way ·ͱΊ • ਖ਼͍͠લఏঢ়ଶΛਖ਼͘͠࡞Δ • ؆୯ʹσʔλఆٛɾϨίʔυੜ੒Ͱ͖ͯ͠·͏ނʹɺ؆୯ʹແବσʔλ Λ࡞Γग़͠΍͍͢ • ԼهΛҙࣝͯ͠ facotry_bot Λ࢖͍͜ͳͦ͏ • Factory ͷσϑΥϧτఆٛ͸ϛχϚϧͳσʔληοτʹͳ͍ͬͯΔ͔ʁ • ֤ʑͷςετέʔεͰ࢖͍ͬͯΔ Factory ͸࠷௿ݶͷલఏঢ়ଶΛ࡞Γग़ͤ ͍ͯΔ͔ʁ

Slide 56

Slide 56 text

Happy Testing Life!

Slide 57

Slide 57 text

Tips: FactoryGirl→FactoryBot • 2008೥ FactoryGirl஀ੜ • 2017೥ FactoryGirl͔ΒFactoryBotʹϦωʔϜ • ref. Project Naming History ⾠ OSS ͷ Naming ͸ؾΛ͚ͭΑ͏ʂ

Slide 58

Slide 58 text

Tips: ςετσʔλͷϞοΫ/ελϒʹ͍ͭͯ “ϞοΫ/ελϒʹΑͬͯςετίʔυͷ࣮ߦεϐʔυ͕ૣ͘ͳΓςετ ͷ෼཭ੑ͸ߴ·ΔҰํɺϞοΫ/ελϒ͸ʻࣗ෼ͷໝ૝ɾئ๬͕࡞Γग़ ͨ͠ৼΔ෣͍ʼʹͳΔͷͰɺ࣮ࡍͷৼΔ෣͍ͱ͸ҟͳΔͱ͍͏ϦεΫ ΛሃΉɻ·ͨϞοΫ/ελϒΛ࡞Δ͜ͱͰɺϝϯςϯφϯεର৅ͱͳΔ ίʔυͷྔɾॏෳ͕ଟ͘ͳΔɻ ϩʔΧϧ؀ڥͰ࠶ݱͰ͖ΔRDB΍KVS͸ՄೳͳݶΓຊ෺Λ࢖͏ɻ” ʢfukabori.fm 13. ϖΞϓϩ΍ςετͷٙ໰ͱ͔ɺιϑτ΢ΣΞΤϯδχΞͷҭ੒ͱ͔ ͷtwada ͞ΜͷൃݴΑΓཁ໿ʣ

Slide 59

Slide 59 text

ࢀߟจݙ • ެࣜυΩϡϝϯτ • thoughtbot/factory_bot Getting Started • ϕϯνϚʔΫιʔείʔυ • toshimaru/factory-bot-the-right-way • ͦͷଞ • Rails Ξϯνύλʔϯ - Ḋͼ͍ͭͨϑΝΫτϦʔ (factory_girl) - ΞδϟΠ ϧSEͷ༕ᓔ