Share
Embed
Railsの システムテスト解剖学
Kaigi on Rails 2021 Day1 14:00-14:30 @YusukeIwaki
「Railsの
システムテスト解剖学」の発表資料です
Yusuke Iwaki
October 22, 2021
Transcript
133 slides
-
3BJMTͱςετ PEFM JFX POUSPMMFS . 7 $ .PEFMTQFD ϏδωεϩδοΫΛ٧ΊࠐΜͰɺ୯ମࢼݧ͠Α͏ ͳΔ͘ബ͘ɻ
ϦμΠϨΫτͷڍಈͳͲ$POUSPMMFSTQFDͰɻ "1*Ͱ͋Ε3FRVFTUTQFDΛ͓͏ɻ ʁʁʁ -
͜ͷϓϨθϯͷΰʔϧ ʮ˓˓ͨ͠΄͏͕͍͍Αʯ ʮ˓˓͠ͳ͍΄͏͕͍͍Αʯ 3BJMTͷγεςϜςετͷߏཁૉʁ ͲͷλΠϛϯάͰԿ͕ಈ͘ʁ ϕετϓϥΫςΟε ΛӏವΈʹͤͣʹ 3BJMTγεςϜςετͷதͷΈ Λཧղͯ͠ ՝ੳɾղܾΛ͠Α͏ɻ
෭࣍తͳޮՌͱͯ͠ ͜ΕͰɺ$BQZCBSB͕͋Δಥવͳ͘ͳͬͯɺ͋ͳͨͷνʔϜͰγεςϜςετΛଓ͚͍͚ͯΔʂ -
4IBSJOH%#DPOOFDUJPO w "DUJWF3FDPSE5FTU'JYUVSFTʹमਖ਼͕ೖ͓ͬͯΓɺ ҟͳΔεϨου͔ΒͷΞΫηεͰ%#ίωΫγϣϯΛڞ༗͢Δɻ w ʮϢʔβ͕ਓ͍Δঢ়ଶʯΛ'BDUPSZ#PUͰ࡞Ε ϒϥβ͔ΒͦΕΛഈΊΔΑ͏ʹͳͬͨʂ w
τϥϯβΫγϣϯɾϩʔϧόοΫͳͷͰɺ ʢ*/4&35536/$"5&ʹൺΔͱʣಈ࡞͕ߴʂ w ҟͳΔzϓϩηεzͰ8FCαʔόʔ͕ىಈ͍ͯ͠Δ߹ʹ %#ίωΫγϣϯผͳͷͰɺ͜ͷػೳ͕͑ͳ͍ɻ %BUBCBTF$MFBOFSͷUSVODBUJPOετϥςδ -
$BQZCBSBͷओͳׂ w ֤छςετϥϯφʔͷηοτΞοϓΛ͢Δ w DBQZCBSBSTQFD DBQZCBSBNJOJUFTU DBQZCBSBDVDVNCFS w )551αʔόʔΛىಈ͢Δ w
DBQZCBSBSBJMT $BQZCBSB4FSWFS w ϒϥβΛࣗಈૢ࡞͢Δ w $BQZCBSB%4- $BQZCBSB%SJWFS -
)551αʔόʔͷىಈλΠϛϯά IUUQTHJUIVCDPNUFBNDBQZCBSBDBQZCBSBCMPCNBTUFSMJCDBQZCBSBTFTTJPOSC $ bundle exec ruby run.rb [1] pry(main)> Capybara.current_sessio
n Capybara starting Puma.. . * Version 5.5.0 , codename: Zawgy i * Min threads: 0, max threads: 4 * Listening on http://127.0.0.1:4918 9 => #<Capybara::Session> $BQZCBSB4FTTJPOJOJUJBMJ[F $BQZCBSBDVSSFOU@TFTTJPOͷॳճࢀর࣌ ʹ$BQZCBSB4FTTJPO͕࡞ΒΕͯɺ ͦ͜Ͱ)551αʔόʔ͕ىಈ͢Δ -
ࣗಈૢ࡞ͷͨΊͷϝιου ϒϥβυΩϡϝϯτશମ ʹର͢Δૢ࡞Λߦ͏ϝιου $BQZCBSB4FTTJPO %0.ཁૉʹର͢Δɹʏ $BQZCBSB/PEF&MFNFOU BMM fi STUBUUBDI@
fi MFUFYUDIFDLDIPPTFTDSPMM@UPTDSPMM@CZ DMJDL@MJOL@PS@CVUUPODMJDL@CVUUPODMJDL@MJOL fi MM@JO fi OE fi OE@BMM fi OE@CVUUPO fi OE@CZ@JE fi OE@ fi FME fi OE@MJOL UJUMFCPEZIUNMTPVSDF DVSSFOU@VSM DVSSFOU@IPTUDVSSFOU@QBUI FYFDVUF@TDSJQUFWBMVBUF@TDSJQU WJTJUSFGSFTI HP@CBDLHP@GPSXBSE TFOE@LFZTXJUIJOXJUIJO@FMFNFOUXJUIJO@ fi FMETFUXJUIJO@UBCMFXJUIJO@GSBNF TXJUDI@UP@GSBNFDVSSFOU@XJOEPXXJOEPXTPQFO@OFX@XJOEPX TXJUDI@UP@XJOEPXXJUIJO@XJOEPXXJOEPX@PQFOFE@CZTBWF@QBHFTBWF@BOE@PQFO@QBHF TBWF@TDSFFOTIPUTBWF@BOE@PQFO@TDSFFOTIPUSFTFU@TFTTJPO SFTQPOTF@IFBEFST TUBUVT@DPEFDVSSFOU@TDPQF <>BMMPX@SFMPBEDIFDLFE DMJDLEJTBCMFE EPVCMF@DMJDL ESBH@UPESPQFWBMVBUF@BTZOD@TDSJQUFWBMVBUF@TDSJQU FYFDVUF@TDSJQU fl BTI IPWFSJOJUJBM@DBDIFJOTQFDUNVMUJQMF OBUJWF PCTDVSFE QBUISFBEPOMZ SFDUSFMPBESJHIU@DMJDLTDSPMM@UP TFMFDU@PQUJPOTFMFDUFE TFOE@LFZTTFUTUZMFUBH@OBNFUFYU USJHHFSVOTFMFDU@PQUJPOWBMVF WJTJCMF -
$BQZCBSBυϥΠόͷ༗໊Ͳ͜Ζ 4FMFOJVN w 4FMFOJVN8FC%SJWFSΛར༻ͯ͠ϒϥβΛࣗಈૢ࡞ɻ ར༻ϒϥβ͝ͱʹɺผ్8FCυϥΠόʔΛΠϯετʔϧ͢Δඞཁ͋Γɻ $VQSJUF w $ISPNF%FW5PPMT1SPUPDPMΛར༻ͨ͠'FSSVNͱ͍͏ϥΠϒϥϦΛར༻ͯ͠
&EHF$ISPNFΛࣗಈૢ࡞ɻ 1PMUFSHFJTU DBQZCBSBXFCLJU w 1IBOUPN+42U8FC,JUͳͲΛϕʔεʹࣗಈૢ࡞ɻ ࠓ͏ϝϯς͞Ε͍ͯͳ͍ -
%0.ཁૉͷऔಘ ˠ$BQZCBSB4FTTJPO fi OE ɹ$BQZCBSB4FTTJPOBMM ˠ$BQZCBSB/PEF#BTF fi OE ɹ$BQZCBSB/PEF#BTFBMM RVFSZ4FMFDUPS"MMతͳಈ࡞Λ͢Δͷ
IUUQTHJUIVCDPNUFBNDBQZCBSBDBQZCBSBCMPCNBTUFSMJCDBQZCBSBOPEF fi OEFSTSC -
%0.ཁૉͷऔಘ ˠ$BQZCBSB4FTTJPO fi OE ɹ$BQZCBSB4FTTJPOBMM ˠ$BQZCBSB/PEF#BTF fi OE ɹ$BQZCBSB/PEF#BTFBMM IUUQTHJUIVCDPNUFBNDBQZCBSBDBQZCBSBCMPCNBTUFSMJCDBQZCBSBOPEF
fi OEFSTSC RVFSZ4FMFDUPS"MMతͳΫΤϦΛ࣮ߦ ̎ݸҎ্ͩͬͨΓ̌ݸͩͬͨΓͨ͠ΒSBJTF ώοτͨ̍͜͠Λฦ͢ -
%0.ཁૉͷऔಘ ˠ$BQZCBSB4FTTJPO fi OE ɹ$BQZCBSB4FTTJPOBMM ˠ$BQZCBSB/PEF#BTF fi OE ɹ$BQZCBSB/PEF#BTFBMM ࡉ͔͍Φϓγϣϯͷॲཧ
RVFSZ4FMFDUPS"MMతͳಈ࡞Λ͢Δͷ IUUQTHJUIVCDPNUFBNDBQZCBSBDBQZCBSBCMPCNBTUFSMJCDBQZCBSBOPEF fi OEFSTSC RVFSZ4FMFDUPS"MMతͳΫΤϦΛ࣮ߦ ࡉ͔͍Φϓγϣϯͷॲཧ ࡉ͔͍Φϓγϣϯͷॲཧ ݁ՌΛશ෦ฦ͢ -
%0.ཁૉͷऔಘ ˠ$BQZCBSB4FTTJPO fi OE ɹ$BQZCBSB4FTTJPOBMM ˠ$BQZCBSB/PEF#BTF fi OE ɹ$BQZCBSB/PEF#BTFBMM IUUQTHJUIVCDPNUFBNDBQZCBSBDBQZCBSBCMPCNBTUFSMJCDBQZCBSBOPEF
fi OEFSTSC ˠTZODISPOJ[F\EPDVNFOURVFSZ4FMFDUPS"MMతͳ fi STU^ ɹTZODISPOJ[F\EPDVNFOURVFSZ4FMFDUPS"MMతͳBMM^ -
%0.ཁૉͷऔಘ ˠ$BQZCBSB4FTTJPO fi OE ɹ$BQZCBSB4FTTJPOBMM ˠ$BQZCBSB/PEF#BTF fi OE ɹ$BQZCBSB/PEF#BTFBMM IUUQTHJUIVCDPNUFBNDBQZCBSBDBQZCBSBCMPCNBTUFSMJCDBQZCBSBOPEF
fi OEFSTSC ˠTZODISPOJ[F\EPDVNFOURVFSZ4FMFDUPS"MMతͳ fi STU^ ɹTZODISPOJ[F\EPDVNFOURVFSZ4FMFDUPS"MMతͳBMM^ ͜ΕԿʁ -
%0.ཁૉͷऔಘ ˠ$BQZCBSB4FTTJPO fi OE ɹ$BQZCBSB4FTTJPOBMM ˠ$BQZCBSB/PEF#BTF fi OE ɹ$BQZCBSB/PEF#BTFBMM IUUQTHJUIVCDPNUFBNDBQZCBSBDBQZCBSBCMPCNBTUFSMJCDBQZCBSBOPEF
fi OEFSTSC ˠ࠷େ̎ඵϙʔϦϯά\EPDVNFOURVFSZ4FMFDUPS"MMతͳ fi STU^ ɹ࠷େ̎ඵϙʔϦϯά\EPDVNFOURVFSZ4FMFDUPS"MMతͳBMM^ -
จࣈೖྗ ˠ$BQZCBSB4FTTJPO fi MM@JO IUUQTHJUIVCDPNUFBNDBQZCBSBDBQZCBSBCMPCNBTUFSMJCDBQZCBSBOPEFBDUJPOTSC fill_in('name’, with: 'YusukeIwaki') ˠ$BQZCBSB/PEF#BTF fi
MM@JO $BQZCBSBυϥΠόͷ/PEFTFUϝιουΛݺͿ͚ͩ %0.ཁૉΛ fi OEͰ୳ͯ͠ -
จࣈೖྗ ˠ$BQZCBSB4FTTJPO fi MM@JO IUUQTHJUIVCDPNUFBNDBQZCBSBDBQZCBSBCMPCNBTUFSMJCDBQZCBSBOPEFBDUJPOTSC fill_in('name’, with: 'YusukeIwaki') ˠ$BQZCBSB/PEF#BTF fi
MM@JO fi MMBCMF@ fi FMEͰbOBNF`ʹ֘͢Δ%0.ݕࡧ ˠ fi OE fi MMBCMF@ fi FME bOBNF` TFU b:VTVLF*XBLJ` -
จࣈೖྗ ˠ$BQZCBSB4FTTJPO fi MM@JO IUUQTHJUIVCDPNUFBNDBQZCBSBDBQZCBSBCMPCNBTUFSMJCDBQZCBSBTFMFDUPSEF fi OJUJPO fi MMBCMF@ fi
FMESC fill_in('name’, with: 'YusukeIwaki') ˠ$BQZCBSB/PEF#BTF fi MM@JO ˠ fi OE@YQBUI lEFTDFOEBOU <TFMGJOQVUcTFMGUFYUBSFB><OPU !UZQFTVCNJU PS !UZQF JNBHF PS !UZQFSBEJP PS !UZQFDIFDLCPY PS !UZQFIJEEFO PS !UZQF fi MF >< !JEOBNF PS !OBNFOBNF PS !QMBDFIPMEFSOBNF PS !JE MBCFM< OPSNBMJ[FTQBDF TUSJOH OBNF >!GPS >cMBCFM< OPSNBMJ[FTQBDF TUSJOH OBNF >EFTDFOEBOU <TFMGJOQVUcTFMGUFYUBSFB><OPU !UZQFTVCNJU PS !UZQF JNBHF PS !UZQFSBEJP PS !UZQFDIFDLCPY PS !UZQFIJEEFO PS !UZQF b fi MF` >z ˠ fi OE fi MMBCMF@ fi FME bOBNF` TFU b:VTVLF*XBLJ` Ϣʔβ͕ࢹՄೳͳͷΛฒͨɺ ͷ͍͢͝91BUIΫΤϦʜʢۤসʣ -
ϒϥοΫϘοΫεςετͱ։ൃऀͷςετ MPDBMIPTUMPHJO :VTVLF*XBLJ -PHJO %"4)#0"3% 8IBU`TOFX ͓͠Β͕ͤ͋Γ·͢ %"4)#0"3% 8IBU`TOFX -PBEJOHʜ
MPDBMIPTUEBTICPBSE 2"తͳ؍ 3BJMT։ൃऀ͕͍ͬͯΔ͜ͱ MPDBMIPTUMPHJO :VTVLF*XBLJ -PHJO 63-ભҠ ॳظඳը-PBEJOH %"4)#0"3% 8IBU`TOFX ͓͠Β͕ͤ͋Γ·͢ (&5OFXT +40/ EJWOFXT@DPOUBJOFS ·Εʹඵ͘Β͍͔͔Δ ·Εʹඵ͘Β͍͔͔Δ JOQVUUZQFUFYU OBNFVTFSOBNF ࡉ͔͍࣮ؾʹ͠ͳ͍ ௨ৗͰ͋Εඵ͘Β͍ͰऴΘΔͣɻ શମΛ௨ͯ͠ඵ͔͔ͬͨΒɺͳʹ͔͓͔͍͠ ͠ଞͷॴʹ ͓Β͕ͤग़͍ͯΔͱ͢Ε ͦΕෆ۩߹ -
ϒϥοΫϘοΫεςετͱ։ൃऀͷςετ MPDBMIPTUMPHJO :VTVLF*XBLJ -PHJO %"4)#0"3% 8IBU`TOFX ͓͠Β͕ͤ͋Γ·͢ %"4)#0"3% 8IBU`TOFX -PBEJOHʜ
MPDBMIPTUEBTICPBSE 2"తͳ؍ 3BJMT։ൃऀ͕͍ͬͯΔ͜ͱ MPDBMIPTUMPHJO :VTVLF*XBLJ -PHJO 63-ભҠ ॳظඳը-PBEJOH %"4)#0"3% 8IBU`TOFX ͓͠Β͕ͤ͋Γ·͢ (&5OFXT +40/ EJWOFXT@DPOUBJOFS ·Εʹඵ͘Β͍͔͔Δ ·Εʹඵ͘Β͍͔͔Δ JOQVUUZQFUFYU OBNFVTFSOBNF ࡉ͔͍࣮ؾʹ͠ͳ͍ ௨ৗͰ͋Εඵ͘Β͍ͰऴΘΔͣɻ શମΛ௨ͯ͠ඵ͔͔ͬͨΒɺͳʹ͔͓͔͍͠ ͠ଞͷॴʹ ͓Β͕ͤग़͍ͯΔͱ͢Ε ͦΕෆ۩߹ -
ੈͷதͷϕετϓϥΫςΟε୭ͷͨΊͷͷ͔ʁ w ͨͱ͑ ʮ*%ࢦఆͷϩέʔλࢦఆྑ͘ͳ͍ʯ ʮϢʔβ͕ݟ͑ΔͷΛϕʔεʹࣗಈૢ࡞͢ΔΑ͏ʹ͠Α͏ʯ ˢ͜ΕΒϒϥοΫϘοΫεςετͷϕετϓϥΫςΟε
ɹʢ2"؍ͷςετࣗಈԽͰɺյΕʹ͍͘ςετΛॻͨ͘Ίͷʣ -
$BQZCBSBͷςετ؍ࢥ MPDBMIPTUMPHJO :VTVLF*XBLJ -PHJO %"4)#0"3% 8IBU`TOFX ͓͠Β͕ͤ͋Γ·͢ %"4)#0"3% 8IBU`TOFX -PBEJOHʜ
MPDBMIPTUEBTICPBSE 2"తͳ؍ MPDBMIPTUMPHJO :VTVLF*XBLJ -PHJO 63-ભҠ ॳظඳը-PBEJOH %"4)#0"3% 8IBU`TOFX ͓͠Β͕ͤ͋Γ·͢ (&5OFXT +40/ EJWOFXT@DPOUBJOFS ·Εʹඵ͘Β͍͔͔Δ ·Εʹඵ͘Β͍͔͔Δ JOQVUUZQFUFYU OBNFVTFSOBNF ࡉ͔͍࣮ؾʹ͠ͳ͍ ௨ৗͰ͋Εඵ͘Β͍ͰऴΘΔͣɻ શମΛ௨ͯ͠ඵ͔͔ͬͨΒɺͳʹ͔͓͔͍͠ ͠ଞͷॴʹ ͓Β͕ͤग़͍ͯΔͱ͢Ε ͦΕෆ۩߹ fill_in('name’, with: 'YusukeIwaki') $BQZCBSBΛͬͨίʔυ 3BJMT։ൃऀ͕͍ͬͯΔ͜ͱ ίϯτϩʔϥϑΥʔϜΦϒδΣΫτͷ࣮͕มΘΒͳ͍ݶΓ OBNFଐੑมΘΒͳ͍͠ɺ OBNFଐੑ͕มΘΔͳΒผʹ$*͕མͪͯ͘Ε͍͍ͯ ແବʹDIFDLCPYSBEJPϘλϯΛ୳͠ʹߦͬͯ΄͘͠ͳ͍ɻ JOQVU<OBNFbVTFSOBNF`>Ͱඞཁे -
$BQZCBSBͷςετ؍ࢥ MPDBMIPTUMPHJO :VTVLF*XBLJ -PHJO %"4)#0"3% 8IBU`TOFX ͓͠Β͕ͤ͋Γ·͢ %"4)#0"3% 8IBU`TOFX -PBEJOHʜ
MPDBMIPTUEBTICPBSE 2"తͳ؍ MPDBMIPTUMPHJO :VTVLF*XBLJ -PHJO 63-ભҠ ॳظඳը-PBEJOH %"4)#0"3% 8IBU`TOFX ͓͠Β͕ͤ͋Γ·͢ (&5OFXT +40/ EJWOFXT@DPOUBJOFS ·Εʹඵ͘Β͍͔͔Δ ·Εʹඵ͘Β͍͔͔Δ JOQVUUZQFUFYU OBNFVTFSOBNF ࡉ͔͍࣮ؾʹ͠ͳ͍ ௨ৗͰ͋Εඵ͘Β͍ͰऴΘΔͣɻ શମΛ௨ͯ͠ඵ͔͔ͬͨΒɺͳʹ͔͓͔͍͠ ͠ଞͷॴʹ ͓Β͕ͤग़͍ͯΔͱ͢Ε ͦΕෆ۩߹ fill_in('name’, with: 'YusukeIwaki') $BQZCBSBΛͬͨίʔυ 3BJMT։ൃऀ͕͍ͬͯΔ͜ͱ ίϯτϩʔϥϑΥʔϜΦϒδΣΫτͷ࣮͕มΘΒͳ͍ݶΓ OBNFଐੑมΘΒͳ͍͠ɺ OBNFଐੑ͕มΘΔͳΒผʹ$*͕མͪͯ͘Ε͍͍ͯ ෳࡶͳ91BUIΫΤϦͰɺҙਤ͠ͳ͍ͷΛरͬͯ΄͘͠ͳ͍ɻ JOQVU<OBNFbVTFSOBNF`>Ͱඞཁे -
$BQZCBSBͷςετ؍ࢥ MPDBMIPTUMPHJO :VTVLF*XBLJ -PHJO %"4)#0"3% 8IBU`TOFX ͓͠Β͕ͤ͋Γ·͢ %"4)#0"3% 8IBU`TOFX -PBEJOHʜ
MPDBMIPTUEBTICPBSE 2"తͳ؍ MPDBMIPTUMPHJO :VTVLF*XBLJ -PHJO 63-ભҠ ॳظඳը-PBEJOH %"4)#0"3% 8IBU`TOFX ͓͠Β͕ͤ͋Γ·͢ (&5OFXT +40/ EJWOFXT@DPOUBJOFS ·Εʹඵ͘Β͍͔͔Δ ·Εʹඵ͘Β͍͔͔Δ JOQVUUZQFUFYU OBNFVTFSOBNF ࡉ͔͍࣮ؾʹ͠ͳ͍ ௨ৗͰ͋Εඵ͘Β͍ͰऴΘΔͣɻ શମΛ௨ͯ͠ඵ͔͔ͬͨΒɺͳʹ͔͓͔͍͠ ͠ଞͷॴʹ ͓Β͕ͤग़͍ͯΔͱ͢Ε ͦΕෆ۩߹ 3BJMT։ൃऀ͕͍ͬͯΔ͜ͱ click_button(‘Login') expect(page).to have_text('͓͠Βͤ) $BQZCBSBΛͬͨίʔυ -
3BJMT։ൃऀʹͱͬͯඞཁͳػೳ MPDBMIPTUMPHJO :VTVLF*XBLJ -PHJO %"4)#0"3% 8IBU`TOFX ͓͠Β͕ͤ͋Γ·͢ %"4)#0"3% 8IBU`TOFX -PBEJOHʜ
MPDBMIPTUEBTICPBSE 2"తͳ؍ MPDBMIPTUMPHJO :VTVLF*XBLJ -PHJO 63-ભҠ ॳظඳը-PBEJOH %"4)#0"3% 8IBU`TOFX ͓͠Β͕ͤ͋Γ·͢ (&5OFXT +40/ EJWOFXT@DPOUBJOFS ·Εʹඵ͘Β͍͔͔Δ ·Εʹඵ͘Β͍͔͔Δ ࡉ͔͍࣮ؾʹ͠ͳ͍ ௨ৗͰ͋Εඵ͘Β͍ͰऴΘΔͣɻ શମΛ௨ͯ͠ඵ͔͔ͬͨΒɺͳʹ͔͓͔͍͠ 3BJMT։ൃऀ͕͍ͬͯΔ͜ͱ $BQZCBSBΛͬͨίʔυ ݻఆͰ࠷େ˓ඵɺΈ͍ͨͳͷࠔΔɻ ௨৴ʹ·Εʹ͔͔࣌ؒΔ͔͠Εͳ͍ͷ͔ͩΒɺ ʮ˓˓͕ྃ͢Δ·Ͱͭʯͬͯॻ͖ํΛ͍ͨ͠ɻ -
3BJMT։ൃऀʹͱͬͯඞཁͳػೳ MPDBMIPTUMPHJO :VTVLF*XBLJ -PHJO %"4)#0"3% 8IBU`TOFX ͓͠Β͕ͤ͋Γ·͢ %"4)#0"3% 8IBU`TOFX -PBEJOHʜ
MPDBMIPTUEBTICPBSE 2"తͳ؍ MPDBMIPTUMPHJO :VTVLF*XBLJ -PHJO 63-ભҠ ॳظඳը-PBEJOH %"4)#0"3% 8IBU`TOFX ͓͠Β͕ͤ͋Γ·͢ (&5OFXT +40/ EJWOFXT@DPOUBJOFS ·Εʹඵ͘Β͍͔͔Δ ·Εʹඵ͘Β͍͔͔Δ ࡉ͔͍࣮ؾʹ͠ͳ͍ ௨ৗͰ͋Εඵ͘Β͍ͰऴΘΔͣɻ શମΛ௨ͯ͠ඵ͔͔ͬͨΒɺͳʹ͔͓͔͍͠ 3BJMT։ൃऀ͕͍ͬͯΔ͜ͱ $BQZCBSBΛͬͨίʔυ ݻఆͰ࠷େ˓ඵɺΈ͍ͨͳͷࠔΔɻ ௨৴ʹ·Εʹ͔͔࣌ؒΔ͔͠Εͳ͍ͷ͔ͩΒɺ ʮ˓˓͕ྃ͢Δ·Ͱͭʯͬͯॻ͖ํΛ͍ͨ͠ɻ click_button(‘Login’) ը໘ભҠ͢Δ·Ͱͭ << GET /news ͷϨεϙϯε͕ऴΘΔ·Ͱͭ >> << div#news_container ͷLoading͕ফ͑Δ·Ͱͭ >> expect(<< div#news_container >>).to have_text('͓͠Βͤ) Ͱ$BQZCBSB%4-ʹ ͦͷػೳ͕ແ͍ΑͶʔ -
3BJMTγεςϜςετϒϥοΫϘοΫεςετʹ͍͍ͯΔ w ࣗಈૢ࡞ͷӡ༻Ͱେมͳͷʮෆ҆ఆͳςετʯ w ͦͦզʑ3BJMT։ൃऀ͕Γ͍ͨͷ 2"؍ͷϒϥοΫϘοΫεςετͰͳ͘ Ϗϡʔͷ୯ମ౷߹ࢼݧ ͦΕɺπʔϧͷબఆϛε͡ΌΜʁ
3BJMTͷγεςϜςετͳΒ $BQZCBSB͕͙͢ʹ͑ͯ ศརɺศརʙ̇ -
$BQZCBSB%4-ΛΘͣʹࣗಈૢ࡞ click_button(‘Login’) ը໘ભҠ͢Δ·Ͱͭ << GET /news ͷϨεϙϯε͕ऴΘΔ·Ͱͭ >> << div#news_container
ͷLoading͕ফ͑Δ·Ͱͭ >> expect(<< div#news_container >>).to have_text('͓͠Βͤ) $BQZCBSB%4-ΘͣʹͲ͏ͬͯϒϥβΛಈ͔͍͍ͤͷʁ -
$BQZCBSB%4-ΛΘͣʹࣗಈૢ࡞ click_button(‘Login’) ը໘ભҠ͢Δ·Ͱͭ << GET /news ͷϨεϙϯε͕ऴΘΔ·Ͱͭ >> << div#news_container
ͷLoading͕ফ͑Δ·Ͱͭ >> expect(<< div#news_container >>).to have_text('͓͠Βͤ) 4FMFOJVNΛ͍͍͑͡ΌΜɻ ͋ͱɺ1VQQFUFFS1MBZXSJHIUͳͲɺ ࠷ۙͷπʔϧͩͬͨΒͬͱ؆୯ʹॻ͚ΔΑɻ XBJU'PS/BWJHBUJPO XBJU'PS3FTQPOTF XBJU'PS4FMFDUPS -
$BQZCBSB%4-ΛΘͣʹࣗಈૢ࡞ click_button(‘Login’) ը໘ભҠ͢Δ·Ͱͭ << GET /news ͷϨεϙϯε͕ऴΘΔ·Ͱͭ >> << div#news_container
ͷLoading͕ফ͑Δ·Ͱͭ >> expect(<< div#news_container >>).to have_text('͓͠Βͤ) Ͱɺ͢ͰʹҎ্ͷςετ࡞ͬͪΌͬͯΔΑʁʁ ҰؾʹҠߦ͢Δͷ͠ΜͲ͍ʔʔ XBJU'PS/BWJHBUJPO XBJU'PS3FTQPOTF XBJU'PS4FMFDUPS -
$BQZCBSB%4-ΛΘͣʹࣗಈૢ࡞ click_button(‘Login’) ը໘ભҠ͢Δ·Ͱͭ << GET /news ͷϨεϙϯε͕ऴΘΔ·Ͱͭ >> << div#news_container
ͷLoading͕ফ͑Δ·Ͱͭ >> expect(<< div#news_container >>).to have_text('͓͠Βͤ) ҰؾʹҠߦ͢ΔඞཁͳΜͯແ͍ɻ ෆ҆ఆͳςετ͔Βॱʹɺஈ֊తʹҠߦ͠Α͏ XBJU'PS/BWJHBUJPO XBJU'PS3FTQPOTF XBJU'PS4FMFDUPS 4UFQෆ҆ఆͳςετͷෆ҆ఆͳ෦͚ͩิڧ͢Δ 4UFQෆ҆ఆͳςετ͚ͩɺ$BQZCBSB%4-ΛΘͳ͘͢Δ 4UFQશʹ$BQZCBSBΛΘͳ͘͢Δ -
4UFQɿऑ͍ͱ͜ΖΛϐϯϙΠϯτͰิڧ͢Δ click_button(‘Login’) ը໘ભҠ͢Δ·Ͱͭ << GET /news ͷϨεϙϯε͕ऴΘΔ·Ͱͭ >> << div#news_container
ͷLoading͕ফ͑Δ·Ͱͭ >> expect(<< div#news_container >>).to have_text('͓͠Βͤ) puppeteer_page.wait_for_navigation do end puppeteer_page.wait_for_request(‘/news.json’) puppeteer_page.wait_for_selector(‘div#news_container’) ෆ҆ఆͳςετͷෆ҆ఆͳ෦͚ͩิڧ͢Δ