Slide 1

Slide 1 text

ͪΐ͏ͲΑ͍
 3BJMT&&ςετ 
 #VSJ,BJHJ ॾڮګհ!NPSP

Slide 2

Slide 2 text

‣ ࣸਅ

Slide 3

Slide 3 text

Kyosuke MOROHASHI @moro

Slide 4

Slide 4 text

4 SMS? What's SMSってなにをやってる会社なの?

Slide 5

Slide 5 text

https://twitter.com/sunaot/status/1002392476492038144

Slide 6

Slide 6 text

“ 情報インフラを構築することで、⾼齢社会を
 取り巻く⼈びと、⾼齢社会で働く⽅や事業者の⽅、 ⾼齢者ご⾃⾝やそのご家族などがイキイキと
 ⽣活できる社会の実現を⽬指しています。 — https://www.bm-sms.co.jp/philosophy/

Slide 7

Slide 7 text

7 &

Slide 8

Slide 8 text

吳䒭⠓爡ؒأ ٥ ؒي ٥ ؒأ 匌❨鿪庥⼒蓎Ⱅ㕦⡝⿼♶⹛欵蓎Ⱅ㕦ةٙ٦ https://www.bm-sms.co.jp ؒٝآص،䱰欽؟؎ ز https://careers.bm-sms.co.jp/engineer/ join us!

Slide 9

Slide 9 text

ͪΐ͏ͲΑ͍
 3BJMT&&ςετ

Slide 10

Slide 10 text

‣ ͪΐ͏ͲΑ͍&&ςετͱ͸ ‣ ͪΐ͏ͲΑ͘͢ΔͨΊͷ޻෉ ‣ $VDVNCFSͷ͜ͱ ‣ ·ͱΊ

Slide 11

Slide 11 text

ͪΐ͏ͲΑ͍&&ςετͱ͸

Slide 12

Slide 12 text

ࣗಈςετॻ͍ͯ·͔͢

Slide 13

Slide 13 text

‣ 3BJMTతϢχοτςετ ‣ PS%#ʹ΋ґଘ͠ͳ͍ϩδοΫͷςετ ‣ ϦΫΤετςετ ‣ γεςϜςετ ‣ PS34QFDͷTQFD ‣ #%%͸ςετ͔ɺΈ͍ͨͳͷ࿩͸ࠓ೔͸ԣʹ͓͍͓͖ͯ·͢Ͷ ςετʹ΋৭Μͳछྨ͕͋Δ

Slide 14

Slide 14 text

‣ ࣮૷͢Δલ ‣ ࣮૷ͨ͋͠ͱ ‣ ͣͬͱલʹ࣮૷͞ΕͨίʔυʹςετΛ଍͍ͯ͠Δ ςετΛॻ͘λΠϛϯά

Slide 15

Slide 15 text

‣ ։ൃΛυϥΠϒ͍ͨ͠ ‣ ॻ͍ͨίʔυ͕ಈ͔֬͘ೝ͍ͨ͠ ‣ 1VMM3FRVFTU࡞Δͷʹඞਢͱ͍͏ϧʔϧͳͷͰ ςετΛॻ͘ͱ͖ͷؾ࣋ͪ

Slide 16

Slide 16 text

‣ ςετۦಈ։ൃɺͷςετ ‣ ۦಈυϥΠϒײ ‣ ઌʹ͔͚Ε͹͍͍͚ͲɺͦΕΛڧ͍͍ͨΘ͚Ͱ͸ͳ͍ ‣ ͦͷͨΊͷͪΐ͏ͲΑ͍ͱ͜ΖΛ୳Δ ࠓ೔ͷʮςετͷ໨తʯ

Slide 17

Slide 17 text

ʮͪΐ͏ͲΑ͍ʯͱ͸ 
 ʮ&&ςετʯͱ͸

Slide 18

Slide 18 text

‣ ։ൃΛυϥΠϒ͢Δ ‣ ॻ͍ͯͯർΕͳ͍ ‣ ϓϩμΫτίʔυͷमਖ਼Λअຐ͠ͳ͍ ͪΐ͏ͲΑ͍

Slide 19

Slide 19 text

‣ &OEᶃϒϥ΢β͔Βɺ&OEᶄಡΈॻ͖͞ΕΔ
 σʔλ·ͰΛશ෦ͭͳ࣮͛ͯߦ͢Δςετ ‣ ݫີͳΤϯυΛܾΊΔͷ͸೉͍͠ɻ֎෦αʔϏε࿈ܞͱ͔ ‣ ֤ίϯϙʔωϯτ͕ɺ૊Έ߹Θͤͨͱ͖ʹ
 ͪΌΜͱಈ࡞͢Δ͔Λݕূ͢Δɻ ‣ 3BJMTతʹ͸ɺ4ZTUFN\5FTU 4QFD^͕֘౰͢Δɻ &&ΤϯυπʔΤϯυςετ

Slide 20

Slide 20 text

‣ ૊Έ߹Θͤͯಈ͘͜ͱΛݕূͰ͖Δ ‣ +4Ͱͭͬͨ͘6*͔Β+40/ϦΫΤετ͖͚ͨͲɺαʔόଆ3BJMTͷ૝ఆ͍ͯ͠Δ ߏ଄ͱҧͬͯͨɺͳͲΛݕग़Ͱ͖Δ ‣ ར༻ऀͷ໨ઢͰهड़ɾݕূͰ͖Δ ‣ ಺෦ߏ଄ʹґଘ͠ͳ͍ ‣ ࣮૷͕ແ͍ঢ়ଶͰ΋ςετγφϦΦΛߟ͑ΒΕΔ &&ςετͷϝϦοτ

Slide 21

Slide 21 text

‣ ίʔυྔ͕ଟ͘ɺϝϯςφϯε͕େม ‣ ը໘ͷ%0.Λͪΐͬͱม͑Δͱେྔʹࣦഊ͢Δ ‣ ςετίʔυ͕େྔͰϝϯςφϯε͕ͭΒ͍ ‣ ࣮ߦ͕࣌ؒ௕͘ͳΓ΍͍͢ ‣ ಛʹ࣮ϒϥ΢βΛಈ͔͢λΠϓ &&ςετͷσϝϦοτ

Slide 22

Slide 22 text

ͪΐ͏ͲΑ͍&&ςετ σϝϦοτͷӨڹΛݮΒͭͭ͠ɺ
 ϝϦοτΛڗडͰ͖ΔΑ͏ͳ&&ςετ

Slide 23

Slide 23 text

ͪΐ͏ͲΑ͘͢ΔͨΊͷ޻෉

Slide 24

Slide 24 text

‣ ը໘ͷ%0.Λͪΐͬͱม͑Δͱେྔʹࣦഊ͢Δ ‣ ςετίʔυ͕େྔͰϝϯςφϯε͕ͭΒ͍ bͪΐ͏ͲΑ͞`ΛݮͣΔσϝϦοτͨͪ

Slide 25

Slide 25 text

‣ 3BJMTʹ͸γεςϜςετͷ࢓૊Έ͕͋Δɻ ‣ 34QFDͰ΋΄΅ಉ͡ɺ4ZTUFN4QFD͕͋Δɻ ‣ όοΫΤϯυ͸$BQZCBSB ‣ ଞݴޠͰݴ͏1VQQFUFFS ͺ΃ͯ͌͋ ͳͲʹ͍ۙ ‣ 4FMFOJVNΑΓߴϨϕϧ $BQZCBSBͷυϥΠόͱͯ͠4FMFOJVNΛ࢖͑Δ ಓ۩Λ஌Ζ͏

Slide 26

Slide 26 text

ը໘ͷ%0.Λͪΐͬͱ ม͑Δͱେྔʹࣦഊ͢Δ

Slide 27

Slide 27 text

‣ ͜͏͍͏ͷʹɺσβΠϯ౎߹ͰEJWΛҰݸ଍͚ͩ͢Ͱ ΤϥʔʹͳΔɻ ঱ঢ় css = 'form.post-wrapper > input[name="user[nickname]"]' fill_in css, with: 'moro'

Slide 28

Slide 28 text

‣ $BQZCBSB͸ɺϥϕϧ΍ϓϨʔεϗϧμจݴ͔Β JOQVUΛ୳ͤΔɻ ιϦϡʔγϣϯར༻ऀͷ໨ઢʹཱͭ fill_in 'ニックネーム', with: 'moro'

Slide 29

Slide 29 text

‣ αʔϏεར༻ऀ͕໨ʹ͢Δ΋ͷ͸ϥϕϧ΍
 ϓϨʔεϗϧμจݴͰ͋Δ ‣ ໨ʹ͢Δ΋ͷ͕มΘͬͨΒςετ͢Δ߲໨΋มΘΔ ‣ ೲಘײ͋Γ·ͤΜ ‣ MBCFMͷGPSଐੑ͕͍ͭͯͳ͍ͳͲɺ6*ͷඍόάൃݟͰ͖ͯศར ‣ ܦݧ্ɺҙ֎ͱมΘΒͳ͍ ϥϕϧςΩετมΘͬͨΒࣦഊ͠ͳ͍

Slide 30

Slide 30 text

ςετίʔυ͕େྔͰɺ
 ϝϯςφϯε͕ͭΒ͍

Slide 31

Slide 31 text

‣ ࡉ͔͍ૢ࡞Λεςοϓͣͭهड़͢Δ͜ͱͰ൥ࡶʹͳΔ ঱ঢ় # ログインが必要なテストケースのたびにコピペされる visit signup_or_signin_path click_on '登録済みの方はログイン' fill_in 'メールアドレス', with: 'moro@example.test' fill_in 'パスワード', with: 'P@ssword00!' 
 click_on 'ログイン'

Slide 32

Slide 32 text

‣ ߴϨϕϧͳϔϧύʔϝιουΛ༻ҙ͢Δɻ ‣ ʮϩάΠϯϑΥʔϜʹ஋ΛೖΕͯαϒϛοτʯ͔ΒʮϩάΠϯ͢Δʯͱ͍͏ؾ࣋ͪ ιϦϡʔγϣϯར༻ऀͷ໨ઢʹཱͭ def login_as(user) visit signup_or_singin_path click_on '登録済みの方はログイン' fill_in 'メールアドレス', with: user.auth.email fill_in 'パスワード', with: COMMON_TEST_PASSWORD 
 click_on 'ログイン' end

Slide 33

Slide 33 text

‣ ·ͣ͸ؾܰʹநग़͠ɺίʔυͷ༷ࢠΛݟͳ͕Β੔ཧ͢Δ ‣ ·ͣ͸ɺಉ͡ςετέʔε಺ʹɺҙਤΛࠐΊ໊ͨલΛ͚ͭͯϝιουநग़͢Δɻ ‣ ಉ͡ϑΝΠϧͷଞͷςετέʔε͔Β΋࢖͍ͨ͘ͳͬͨΒɺݟ͑Δ
 είʔϓʹҠಈ͢Δɻ ‣ ߋʹଞͷϑΝΠϧ͔Β΋ࢀরͨ͘͠ͳͬͨΒɺڞ௨ϔϧύʔஔ͖৔ʹஔ͘ɻ ‣ $BQZCBSB"1*·ͱΊΔ͚ͩͰͳ͘ɺந৅Խͷ࿙ΕΛ
 ہॴԽ͢ΔͨΊʹ΋໾ཱͭ ͍ͭɺͲ͏΍ͬͯϔϧύʔϝιουʹ͢Δ͔

Slide 34

Slide 34 text

‣ ͱ͍͏Πϝʔδ͕͋Δ͕ɺҙ֎ͱͳ͍ ‣ ݱࡏͷ࢓ࣄ3BJMTΞϓϦͰ΋AHJUHSFQTMFFQA͕݅ͩͬͨ ‣ $BQZCBSBͷߴϨϕϧϝιουΛ࢖͏ͱɺΫϦοΫର৅΍
 ݕূ͢ΔςΩετ͕ݱΕΔ·ͰࣗಈͰ଴ͬͯ͘ΕΔ ‣ DMJDL@PO΍IBT@DPOUFOUͳͲɺ$BQZCBSB"1*Λ࢖͏ ‣ ೥ ݪจ೥ ͷهࣄ͕ͩɺߟ͑ํ͸ࠓͰ΋௨༻͢Δ ‣ IUUQTQPTUEDDXSJUFSFMJBCMFBTZODISPOPVTJOUFHSBUJPOUFTUTXJUIDBQZCBSB ൪֎+4ඇಉظॲཧͷλΠϛϯάͰࣦഊ͠TMFFQ͢Δͷ͕ۤ௧

Slide 35

Slide 35 text

‣ ࣮ߦ͕͔͔࣌ؒΓ͗͢Δ ‣ ศར͗ͯ͢όϦσʔγϣϯͳͲ΋ςετ࢝͠Ίɺςετέʔε͕૿͑͗͢Δ ‣ ֎෦ϓϩηεͱ ϒϥ΢βͳͲ ͷ௨৴͕ൃੜ͢ΔͷͰͲ͏ͯ͠΋஗͍ ‣ ϞσϧͷϢχοτςετͰͰ͖Δ΍ͭ͸ͦͬͪͰ΍ͬͨ΄͏͕͍͍Ͱ͢Ͷ ‣ σʔληοτΞοϓ͕େมʹͳΓ͕ͪɺͱ͔ ‣ શ෦ͭͳ͛ΔͨΊɺσʔλҰࣜ·Δ͝ͱඞཁʹͳΓ͕ͪ ‣ ݸผͷืΔ࿩͸࠙਌ձͰ ͦΕҎ֎ʹ΋৭ʑେม͚ͩͲ

Slide 36

Slide 36 text

&&ςετΛͪΐ͏ͲΑ͘׆༻͢ΔιϦϡʔγϣϯ ར༻ऀͷ໨ઢ͔Βݟͨ
 ಈ͖Λهड़͠ɺݕূ͢Δ

Slide 37

Slide 37 text

$VDVNCFSͷ͜ͱ

Slide 38

Slide 38 text

‣ ࣗવݴޠͰ&&ςετΛهड़Ͱ͖ΔςεςΟϯά
 ϑϨʔϜϫʔΫɻ ‣ $BQZCBSBͷલ਎ɺ8FCSBUͱ͍͏ϥΠϒϥϦͰ
 ߴϨϕϧͳ)5.-ૢ࡞"1*͕͋ͬͨɻ ‣ ࣗવݴޠ͔Β$BQZCBSB8FCSBU"1*ૢ࡞ͷϚοϐϯά͸ɺ
 ࣗ෼Ͱهड़͢Δɻ $VDVNCFS

Slide 39

Slide 39 text

Slide 40

Slide 40 text

#langage: ja フィーチャ: ログインしてユーザーを識別できる ユーザーとして、 ログイン機能などで自分の情報を識別したい なぜなら、メッセージなどを「自分のもの」として区別したいからだ シナリオ: ユーザ登録してログインする 前提 "新規ユーザー登録"ページを表示している もし "ログイン名"に"moro"と入力する かつ "Eメール"に"moro@example.test"と入力する かつ "作成"ボタンをクリックする ならば "こんにちはmoroさん"と表示されていること Given('"{word}"に"{word}"と入力する') do |field, value| fill_in field, with: value end

Slide 41

Slide 41 text

“ $VDVNCFSͷΑ͏ͳπʔϧ͸ࣗવݴޠ͔Βςετ ίʔυ΁ͷղऍͷ૚͕ඞཁʹͳΔͨΊɺؒ઀૚͕ͭ ૿͑ͯϝϯςφϯεੑ͕Լ͕Δͱ͍͏Πϝʔδ͕ຮ Ԇͨͨ͠Ίɺ$VDVNCFSΛ΍ΊͯY6OJUY4QFDͰ ʮड͚ೖΕςετʯΛॻ͘νʔϜ΋૿͑·ͨ͠ɻ ςετۦಈ։ൃʮ෇࿥$ʯΑΓ

Slide 42

Slide 42 text

‣ εςοϓఆٛΛ࡞ΔͷΛར༻ऀͷ໨ઢʹཱͭ
 ࢹ఺มߋͷ͖͔͚ͬʹͰ͖Δͱྑ͔ͬͨ ‣ ͜ͷҰ࿈ͷϑΥʔϜૢ࡞͸ɺͭ·ΓαʔϏεར༻ऀͱͯ͠ԿΛ͍ͯ͠Δͷ͔ ‣ ॳظ͸ɺ$BQZCBSBϝιουʹରԠ͢Δཻ౓ͷεςοϓఆٛΛࣗಈੜ੒͠ɺ
 ࠞཚΛট͍ͨ ޙʹͳ͘ͳͬͨ ‣ Ұา໨Λମݧ͢Δʹ͸͍͍Μ͚ͩͲɻɻɻ $VDVNCFSΛࣱΜͰ

Slide 43

Slide 43 text

#langage: ja ... シナリオ: 新規登録後につぶやくことができる 前提 ユーザー"moro"として新規登録する もし "内容"に"ブリおいしいです。"と入力する ならば "ブリおいしいです。"と表示されていること かつ "つぶやき: 1件中1件"と表示されていること Given('ユーザー"{word}"として新規登録する') do |username| fill_in 'ログイン名', with: username fill_in 'Eメール', with: '#{username}@example.test' click_on '新規登録' end

Slide 44

Slide 44 text

‣ ೲ඼υΩϡϝϯτΛࣗಈੜ੒͢ΔπʔϧͰ͸ͳ͘ ‣ ʮड͚ೖΕςετʯ ‣ ͋ͷࠒͷۭؾΈ͍ͨͳͷ͸࠙਌ձͰ ‣ ར༻ऀͷࢹ఺ʹཱͬͯ
 αΠτ΍αʔϏε΍ػೳͷ࢖͍ํΛهड़͢Δπʔϧ ‣ ͔͠΋ಈ͘ &&ςετΛࣗಈԽͯ͠Կ͕͔ͨͬͨ͠ͷ͔

Slide 45

Slide 45 text

‣ (IFSLJOϑΥʔϚοτͰʮͳͥͳΒʯΛߟ͑Δ ‣ \XIP^ͱͯ͠ɺ\IPX^͍ͨ͠ɻͳͥͳΒ\XIZ^͔ͩΒͩ ‣ ϑΟʔνϟػೳ͕Ͱ͖ͨΒͲͷΑ͏ʹͳͬͯ
 ΄͍͔͠Λɺ೴಺͔Βग़ͯ͠ɺߟ͑Δ ‣ 5%%ͷࣗ෼͕࠷ॳͷϢʔβʔͷࢹ఺Λɺػೳશମʹద༻͢Δ ‣ ͦΕΛ΋ͱʹɺιϑτ΢ΣΞ։ൃऀҎ֎ͷεςʔΫϗϧ μʔͱ΋ߟ͑Λڞ༗͢Δ ࣮͸ಈ͔ͳͯ͘΋ྑ͔ͬͨ

Slide 46

Slide 46 text

‣ ιϑτ΢ΣΞͷৼΔ෣͍Λɺར༻ऀͷ໨ઢʹཱͬͯ هड़͢Δ͜ͱ ‣ ଟ༷ͳεςʔΫϗϧμʔͱձ࿩͢ΔͨΊɺ
 ͦͷ౔୆ͱͳΔڞ௨ޠኮΛ࡞Δ͜ͱ ‣ ౰࣌ಉ࣌ʹྲྀߦ͍ͬͯͨ%%%͔ΒʮϢϏΩλεݴޠʯͷ֓೦Λ༌ೖ
 ςετۦಈ։ൃʮ෇࿥$ʯ πʔϧ͕มΘͬͯ΋Ҿ͖ܧ͛Δͱ͍͍΋ͷ

Slide 47

Slide 47 text

‣ ར༻ऀͷ໨ઢ͔Βݟͨಈ͖Λهड़͠ɺݕূ͢Δ ‣ ར༻ऀͷϝϯλϧϞσϧʹ͍ۙɺߴϨϕϧͳ"1*
 ޠኮ Λҭ͍ͯͯ͘ ‣ ׬શʹίʔυίʔυ͍ͯ͠Δ͔Β೉͠͞͸͋Δ΋ͷͷ ͳͷͰ4ZTUFN\5FTU 4QFD^Ͱ΋

Slide 48

Slide 48 text

ࣗવݴޠޠኮͱίʔυޠኮΛ͚ۙͮͯΈͨྫ let(:user) { create(:user) } let(article) { create(:article) } scenario 'ヘッダメニューからマイページ行けてfav履歴に遷移できる' do user.fav(article) login_as(user) within('nav.header-nav') do click_on 'マイページ' end click_on 'お気に入りの記事' expect(page).to have_content(article.title) end

Slide 49

Slide 49 text

·ͱΊ

Slide 50

Slide 50 text

‣ &&ςετ͸ศརͰڧྗ͕ͩɺສೳͰ͸ͳ͍ ‣ յΕ΍͍͢ ‣ ίʔυྔ͕ଟ͘ͳΓ͕ͪ ‣ ͪΐ͏ͲΑ͍ͱ͜ΖΛ୳Γ͍ͨ ‣ ͦͷώϯτͱͳΔࢹ఺Λ͓࿩Ͱ͖ͯΔͱΑ͍ͷͰ͕͢ ͖ΐ͏࿩ͨ͜͠ͱ

Slide 51

Slide 51 text

‣ ςετهड़ͷਫ४Λɺར༻ऀͷ໨ઢʹ͚ۙͮΔ ‣ ͳΔ΂͘ߴϨϕϧ"1*Λ࢖͏ ‣ ࣗ෼Ͱ΋ޠኮΛҭͯΔ ‣ ఆܕॲཧΛ·ͱΊͯͨΓɺ௿Ϩϕϧ"1*΁ͷΞΫηεΛϥοϓͨ͠Γ ‣ ͦ͜ʹυϝΠϯͷޠኮͰ໊લΛ͚ͭΒΕΔͱྑ͍ ͪΐ͏ͲΑ͍&&ςετ