Slide 1

Slide 1 text

No content

Slide 2

Slide 2 text

Name !CSO ੨໺݈ར Occupation ϑϩϯτΤϯυΤϯδχΞɾ10 Company $ZCFSBHFOUΞυςΫελδΦ"*.FTTFOHFS OSS $POUSJCVUPSPG7 About IUUQJOGPCODI

Slide 3

Slide 3 text

"*ϝοηϯδϟʔʹ͍ͭͯ

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

"*ϝοηϯδϟʔ w גࣜձࣾ$ZCFS"HFOUΞυςΫελδΦͷࣄۀ෦ w #UP#UP$ͷ$IBU#PUࣄۀΛల։ w $IBU#PUͷ6*ɺࣗવݴޠॲཧΤϯδϯɺIEͷΦϖϨʔλʔΛશͯࣗલͰ࣋ͭ

Slide 6

Slide 6 text

&&ςετʹ͍ͭͯ

Slide 7

Slide 7 text

&&ςετͱ͸ &OEUPFOEςετͷུޠ 8FCϑϩϯτΤϯυͷੈքͰ͸ɺػೳཁ݅ຖͷςετͰ͸ແ͘ɺ׬੒ͨ͠ ΞϓϦέʔγϣϯͷϢʔβʔ઀఺ΛϢʔβʔಉ༷ʹૢ࡞ͯ͠ػೳ͢Δ͜ͱ Λ֬ೝ͢Δςετ ࣮ࡍʹ͸ϒϥ΢βΦʔτϝʔγϣϯπʔϧ 4FMFOJVN౳ Λར༻ͯ͠ϒϥ΢β ͔Β6*Λૢ࡞͠ɺಈ࡞ͱ݁ՌͷϒϥοΫϘοΫεςετΛߦ͏

Slide 8

Slide 8 text

ϝϦοτ Ϣʔβʔ͕࣮ࡍʹ৮Δը໘Λࣗಈςετ͍ͯ͠Δ͚ͩͳͷͰɺςετͱ͠ ͯ͸࠷΋࣮֬ੑ͕ߴ͍ ͭ·Γे෼ͳ&&ςετ͕͋Ε͹ͦͷૢ࡞Ͱ͸࣮֬ʹόά͕ى͖͍ͯͳ͍͜ ͱΛূ໌Ͱ͖Δ

Slide 9

Slide 9 text

σϝϦοτ ஗͍ ࣮ࡍʹϦΞϧͳΞϓϦέʔγϣϯΛಈ͔ͨ͢ΊɺΞχϝʔγϣϯɾ"1*ͷ଴ ͕ͪ࣌ؒසൟʹൃੜ͠ɺਓؒͷૢ࡞ͷཧ࿦஋Ҏ্ͷ଎౓͕Ͱͳ͍ ·ͨɺ4FMFOJVN౳ͷϒϥ΢βΦʔτϝʔγϣϯπʔϧͷෆ҆ఆ͞΋͋Γɺ Ṗͷࣦഊ͕ൃੜͨ͠Γ͢ΔͷͰϦτϥΠ͕ඞࢸͳ্ɺ࣮ߦ͢Δ؀ڥʹΑͬ ͯ΋݁Ռ͕มΘΔ͜ͱ͕͋Δ ͦͯ͠ɺԿΑΓ΋ϝϯςφϯε͕ͭΒ͍

Slide 10

Slide 10 text

ϝϯςφϯε

Slide 11

Slide 11 text

໰୊఺ w $44ηϨΫλͰૢ࡞ର৅ͷ%0.ΛબͿͨΊɺ6*ͷৄࡉ )5.-ͷߏ଄ ͷมԽ·Ͱςετ ʹӨڹ͢Δ w TUZMFEDPNQPOFOUTͷΑ͏ͳ$44JO+4Λ࢖͍ͬͯΔͱFF༻ͷηϨΫλΛผ్༻ҙ͢Δඞ ཁ͕͋Δ w Ξαʔγϣϯ͠ͳ͚Ε͹͍͚ͳ͍߲໨͕ଟ͗ͯ͢ɺมߋՕॴ͕രൃతʹ૿͑ͯഁ୼͢Δ

Slide 12

Slide 12 text

͜ΕΒΛߟ͑ͣʹ&&Λ࣮૷͢Δͱ ͍͍ͩͨߋ৽͞Εͳ͘ͳΔ͔ɺ ௨ΔՕॴ͚ͩಈ͘ແҙຯͳςετ͕ग़དྷ্͕Δ

Slide 13

Slide 13 text

ղܾࡦ

Slide 14

Slide 14 text

·ͣ͸ɺղܾ͕؆୯ͳσϝϦοτ͔Βղܾ͍ͯ͘͠ w ஗͍ w &&ςετ࣮ߦ࣌ʹ+4ͰϑϥάΛཱͯͯΞχϝʔγϣϯ౳Λఀࢭ͢Δ w ϒϥ΢βΦʔτϝʔγϣϯπʔϧ͕ෆ҆ఆ w ϦτϥΠॲཧΛೖΕΔ w #SPXTFS4UBDL౳ͷ֎෦؀ڥΛར༻͢Δ ΍ͬͯͳ͍

Slide 15

Slide 15 text

Ξχϝʔγϣϯ౳ͷఀࢭ Ͳͷϒϥ΢βΦʔτϝʔγϣϯπʔϧʹ΋ɺ͍͍ͩͨKBWBTDSJQUΛ஫ೖ͢Δ "1*͕͋Δ͸ͣͳͷͰɺ ͷΑ͏ͳܗͰϑϥάΛϖʔδ಺ʹ஫ೖ͢Δ ྫ͸QVQQFUFFS ࢖͏৔߹͸ҎԼͷΑ͏ͳܗͰίʔυ಺ʹຒΊࠐΜͰ͓͘ ղܾࡦ await this.page.evaluate(`window.E2E_ENABLED = true`);

Slide 16

Slide 16 text

ϦτϥΠॲཧ ݱঢ়ͷϒϥ΢βΦʔτϝʔγϣϯπʔϧ͸ɺಉ࣮૷ͯ͠΋࣮ࡍʹϒϥ΢β Λ্ཱͪ͛Δؔ܎্ɺෆ҆ఆͳՕॴ͕࢒ͬͯ͠·͏ ͦͷͨΊɺશମͷϦτϥΠॲཧΛೖΕΔ͜ͱͰɺ͋Δఔ౓ࣦഊ΋ڐ༰͢Δ ςετ͸૊ΊΔ ղܾࡦ

Slide 17

Slide 17 text

function runTest() { const browser = puppeteer.launch(...) const page = browser.newPage(); ... let retryCount = 0; page.on('error', () => { if (++retryCount < 3) { setTimeout(runTest, 10); } }) page.on('pageerror', () => { if (++retryCount < 3) { setTimeout(runTest, 10); } }) }

Slide 18

Slide 18 text

֎෦αʔϏεͷར༻ 4FMFOJVNΛ࢖͍ͬͯΕ͹ͦͷ··#SPXTFS4UBDL౳ͷ֎෦αʔϏεΛར༻Ͱ ͖Δ ϩʔΧϧͰ࣮ߦ͢ΔΑΓΫϥ΢υαʔϏεΛར༻ͨ͠΄͏͕ɺΑΓ҆ఆ͠ ͨςετ؀ڥΛಘΒΕΔ ͕ɺ࣌ؒͷؔ܎Ͱ·ͩ΍ͬͯͳ͍ͷͰɺͦͷ͏ͪ΍Γ͍ͨ ղܾࡦ

Slide 19

Slide 19 text

ϝϯςφϏϦςΟ

Slide 20

Slide 20 text

͜͜·Ͱ͸ൺֱతղܾ͕؆୯ͳ໰୊͕ͩͬͨɺ ࠜຊతʹ&&͕ϝϯςφϯε͠ਏ͍ͱ͍͏໰୊͸ղܾ͍ͯ͠ͳ͍ ͜ͷେ͖ͳ໰୊ʹରॲ͍ͯ͘͠

Slide 21

Slide 21 text

ϝϯςφϏϦςΟ ϝϯςφϏϦςΟΛ࣮ݱ͢ΔͨΊʹ࠷΋େࣄͳ͜ͱ͸ɺͰ͖Δ͚ͩߏ଄ʹ ཱͪೖΒͳ͍͜ͱͰ͋Δ ͦͷͨΊɺҎԼͷํ๏ͰϝϯςφϏϦςΟΛ֬อ͍ͯ͘͠ 7JTVBM3FHSFTTJPO5FTUΛಋೖ͢Δ ϒϥ΢βૢ࡞ϨΠϠʔͷந৅Խ

Slide 22

Slide 22 text

7JTVBM3FHSFTTJPO5FTU 7JTVBM3FHSFTTJPO5FTUͱ͸ɺίʔυมߋલɾมߋޙͷεΫϦʔϯγϣοτ Λࠩ෼ൺֱͯ͠6*ʹ໰୊͕ແ͍͔֬ೝ͢ΔςετͰ͋Δ ֤ʑͷঢ়ଶΛ"TTFSUJPO͢ΔͷͰ͸ͳ͘6*ͷঢ়ଶΛࠩ෼ൺֱ͢Δ͜ͱͰίʔ υมߋͷӨڹΛ֬ೝ͢Δ 7JTVBM3FHSFTTJPO5FTUΛߦ͏πʔϧ͸৭ʑͱ͋Δ͕ɺࣗ෼͸ࣗ࡞͍ͯ͠Δ Ϣʔεέʔε͕νʔϜຖʹେ͖͘ҧ͏ͱࢥ͏ͷͰɺͦ͜͸νʔϜͰ൑அ ϝϯςφϏϦςΟ

Slide 23

Slide 23 text

มߋޙ มߋલ ൺֱ݁Ռ

Slide 24

Slide 24 text

໰୊఺ 7JTVBM3FHSFTTJPO5FTUΛߦ͏ͱΑ͘ൃੜ͢Δ໰୊఺ w มԽ͕ແ͍͸ͣͳͷʹࠩ෼͕ൃੜ͢Δ w ظ଴͍ͯͨ͠͸ͣͷಈ࡞͕ߦΘΕ͍ͯͳ͍͕ɺԿ͕ى͖͔ͨΘ͔Βͳ͍ w ൺֱͷλΠϛϯά ϝϯςφϏϦςΟ7JTVBM3FHSFTTJPO5FTU

Slide 25

Slide 25 text

ࠩ෼͕ൃੜ͢Δ ͜Ε͸%J⒎Λߦ͏πʔϧͷ໰୊ͩͬͨΓϑΥϯτͷΞϯνΤΠϦΞεͩͬͨ Γ͢Δ ͳͷͰղܾࡦ͸ w ""Λ੾Δ w #MJOL%J⒎Λ࢖͏ ϝϯςφϏϦςΟ7JTVBM3FHSFTTJPO5FTU

Slide 26

Slide 26 text

""Λ੾Δ ϑΥϯτͷΞϯνΤΠϦΞεΛ੾Δ͜ͱͰɺࠩ෼͕ൃੜͮ͠Β͘ͳΔ ϝϯςφϏϦςΟ7JTVBM3FHSFTTJPO5FTUࠩ෼͕ൃੜ͢Δ

Slide 27

Slide 27 text

await page.evaluate( `(() => { const newStyle = document.createElement('style'); newStyle.type = "text/css"; document.getElementsByTagName(‘head')[0] .appendChild(newStyle); const css = document.styleSheets[0]; const idx = document.styleSheets[0] .cssRules.length; css.insertRule( "body * {-webkit-font-smoothing: none ! important}”, idx ); })()`, );

Slide 28

Slide 28 text

#MJOL%J⒎Λ࢖͏ ·ͨπʔϧͷ໰୊ͳέʔε΋͋Δ ৭ʑ࢖ͬͯ࠷΋໰୊͕ى͖ͮΒ͔ͬͨͷ͕ɺ#MJOL%J⒎ͱ͍͏ը૾ࠩ෼ൺֱ πʔϧͩͬͨ IUUQTHJUIVCDPNZBIPPCMJOLEJ⒎ ࣍ͷϖʔδʹ৭ʑௐ੔ͯ͠ɺ࠷΋҆ఆͨ͠ઃఆΛࡌ͓ͤͯ͘ ϝϯςφϏϦςΟ7JTVBM3FHSFTTJPO5FTUࠩ෼͕ൃੜ͢Δ

Slide 29

Slide 29 text

new BlinkDiff({ imageA: baselineImage, imageB: image, thresholdType: BlinkDiff.THRESHOLD_PERCENT, threshold: 0.0001, imageOutputPath: failedFilePath, verbose: true, perceptual: true, delta: 25, })

Slide 30

Slide 30 text

ࣦഊͨ͠ཧ༝͕Θ͔Βͳ͍ 7JTVBM3FHSFTTJPO5FTUΛߦ͏ͱසൟʹ͜ͷέʔεʹૺ۰͢Δ ୯७ͳղܾࡦ͸ແ͍͕ɺଥڠҊ͸͍͔ͭ͋͘Δ ࠷΋γϯϓϧͳํ๏͸࣮ࡍʹϒϥ΢βΛ(6*෇͖Ͱಈ࡞ͤ͞Δ͜ͱͩΖ͏ ΋͏Ұͭ͸෦෼తͳςετ࠶࣮ߦΛ༰қʹઃܭ͢Δ͜ͱ ޙड़ ϝϯςφϏϦςΟ7JTVBM3FHSFTTJPO5FTU

Slide 31

Slide 31 text

ൺֱͷλΠϛϯά جຊతʹɺϚʔδલʹ֤ݸਓͷϩʔΧϧͰ%PDLFS্Ͱ࣮ߦͨ݁͠ՌΛίϛοτ͢Δ εΫϦʔϯγϣοτ͸GBJMFEDVSSFOUNBTUFSͷͭͷσΟϨΫτϦʹผΕ͓ͯΓɺ ϩʔΧϧͰ࣮ߦͨ݁͠Ռ͸DVSSFOUɺࣦഊͨࠩ͠෼ൺֱը૾͸GBJMFEɺϦϞʔτͷ࠷ ৽ঢ়ଶ͸NBTUFSʹͦΕͧΕอଘ͞ΕΔ ίϛοτ࣌ʹQSFDPNNJUϑοΫͰɺDVSSFOU͔ΒNBTUFS΁ίϐʔ͞ΕͯϦϞʔτʹ ൓ө͞ΕΔ ϚʔδͷλΠϛϯάͰ͸$*ͰNBTUFSͱൺֱͯ͠໰୊ͳ͚Ε͹Ϛʔδ ໰୊͕͋Ε͹࠶౓ϩʔΧϧͰ࣮ߦͯ͠ίϛοτ ͱ͍͏ӡ༻Λ͍ͯ͠Δ ϝϯςφϏϦςΟ7JTVBM3FHSFTTJPO5FTU

Slide 32

Slide 32 text

8FC6* ࠩ෼ൺֱ݁ՌΛ8FCͷ6*Ͱ֬ೝɺঝೝͰ͖ΔΑ͏ʹͯ͋͠Δ ϝϯςφϏϦςΟ7JTVBM3FHSFTTJPO5FTU

Slide 33

Slide 33 text

No content

Slide 34

Slide 34 text

ϒϥ΢βૢ࡞ϨΠϠʔͷந৅Խ ΋͏ҰͭϝϯςφϏϦςΟͷͨΊʹॏཁͳͷ͸ɺ&&ςετͷίʔυ඼࣭Ͱ ͋Δ 7JTVBM3FHSFTTJPO5FTUʹΑͬͯɺͰ͖Δ͚ͩߏ଄ʹཱͪೖΒͳ͍Α͏ͳςε τ͕هड़Ͱ͖ΔΑ͏ʹͳ͕ͬͨɺϒϥ΢βΛૢ࡞͢ΔͨΊʹ͸Ͳ͏ͯ͠΋ ͋Δఔ౓ߏ଄ʹཱͪೖΔඞཁ͕͋Δ ·ͨϒϥ΢βΦʔτϝʔγϣϯπʔϧ΋༷ʑͳ΋ͷ͕͋Γɺ۩ମతͳૢ࡞ Λߦ͏ίʔυΛ෼཭͢Δ͜ͱͰπʔϧҠߦΛ༰қʹ͍ͨ͠ ئ๬ ϝϯςφϏϦςΟ

Slide 35

Slide 35 text

(SBQI#BTFE1BHF0CKFDU 1BHF0CKFDUύλʔϯΛ׆༻ͭͭ͠ɺ࣮ߦܭըΛࣄલʹཱͯΔํࣜΛ࡞Γɺ উखʹ(SBQI#BTFE1BHF0CKFDUͱ໊෇͚ͨ 1BHF0CKFDUύλʔϯͱಉ͡Α͏ʹɺQVCMJDϝιου͕ૢ࡞Λද͠ɺ಺෦ͷૢ ࡞͸શͯӅṭ͞Ε͍ͯΔঢ়ଶʹͳ͍ͬͯΔ ͔͠͠ɺ1BHF0CKFDUύλʔϯΛ͞Βʹ֦ுͯ͠ɺૢ࡞Λ(SBQIͷϊʔυͱ͠ ͯѻ͏͜ͱͰૢ࡞ؒͷґଘؔ܎Λ؅ཧͰ͖ΔΑ͏ʹͨ͠ ϝϯςφϏϦςΟϒϥ΢βૢ࡞ϨΠϠʔͷந৅Խ

Slide 36

Slide 36 text

0QFSBUJPO Ϣʔβʔૢ࡞ͦͷ΋ͷ ϙοϓΞοϓΛ։͘ͱ͔ɺνΣοΫϘοΫεΛνΣοΫ͢Δͱ͍ͬͨߦಈ ͦΕΛͲ͏࣮ݱ͢Δ͔ʹ͸ؔ৺͕ͳ͍ ·੍ͨ໿Λهड़͢Δ͜ͱͰɺࣄલݕ͕ࠪߦΘΕਖ਼͍͠ॱংͰ0QFSBUJPO͕࣮ ߦ͞Ε͍ͯΔͷΛݕࠪͰ͖Δ ϝϯςφϏϦςΟϒϥ΢βૢ࡞ϨΠϠʔͷந৅Խ

Slide 37

Slide 37 text

&YFDVUJPO 0QFSBUJPOΛ࣮ݱ͢Δखஈ 1VQQFUFFSͷίʔυͱ͔4FMFOJVNͷίʔυ͕ฒͿ ϝϯςφϏϦςΟϒϥ΢βૢ࡞ϨΠϠʔͷந৅Խ

Slide 38

Slide 38 text

0QFSBUJPO Ϣʔβʔૢ࡞ͷந৅Խ &YFDVUJPO ࣮ࡍͷίʔυ 0QFSBUJPO Ϣʔβʔૢ࡞ͷந৅Խ &YFDVUJPO ࣮ࡍͷίʔυ 0QFSBUJPO Ϣʔβʔૢ࡞ͷந৅Խ &YFDVUJPO ࣮ࡍͷίʔυ operation( // ૢ࡞ͷ໊લ 'name', // ࣮ࡍͷॲཧ async () => { ... }, // ͜ͷॲཧͷ੍໿ Restriction.of( Restriction.Type.SUCCESSOR, // ࣄલʹߦ͏΂͖ॲཧͷ໊લ 'other-op-name' ), )

Slide 39

Slide 39 text

4DSFFOTIPU εΫϦʔϯγϣοτΛࡱΔͱɺݱࡏͷ0QFSBUJPO໊͕ϋΠϑϯͰ݁߹͞Εͨ ໊લͰอଘ͞ΕΔ 0QFSBUJPOͷॱ൪Λม͑ΔͱεΫϦʔϯγϣοτͷ໊લ΋มΘΔ PQFOEP@TPNFUIJOHDMPTFQOHΈ͍ͨͳ໊લ ϝϯςφϏϦςΟϒϥ΢βૢ࡞ϨΠϠʔͷந৅Խ

Slide 40

Slide 40 text

1BSUJBM&YFDVUJPO 0QFSBUJPO୯ҐͰ&&Λ෼ղ͠ɺ੍໿৚݅Λهड़Ͱ͖ΔΑ͏ʹͨ݁͠Ռ ಛఆͷ0QFSBUJPOͷΈΛඞཁ࠷௿ݶͷύεͰ࣮ߦͰ͖ΔΑ͏ʹͳͬͨ ϝϯςφϏϦςΟϒϥ΢βૢ࡞ϨΠϠʔͷந৅Խ

Slide 41

Slide 41 text

0QFSBUJPO" 0QFSBUJPO# 0QFSBUJPO$ 0QFSBUJPO% 0QFSBUJPO& 0QFSBUJPO' 0QFSBUJPO( ΦϖϨʔγϣϯ(͸&ʹґଘ͓ͯ͠Γ &͸#ʹґଘ͍ͯ͠Δ ͜ΕΒ͸ࣄલʹ൑໌͍ͯ͠ΔͷͰɺ (ͷΈΛ࣮ߦ͍ͨ͠৔߹͸ɺ #ɾ&ɾ(ͷॱংͰ0QFSBUJPO͕࣮ߦ͞ΕΔ

Slide 42

Slide 42 text

·ͱΊ &&ςετΛܧଓ͢ΔͨΊʹؤு͍ͬͯΔ͜ͱΛॻ͍͖ͯ·͕ͨ͠ɺ ࠷ޙ͸΍͸Γɺ$*ͷ੔ཧɾϨϏϡʔମ੍౳ͷϓϩηε͕େࣄʹͳΓ·͢ ϓϩηε͕Ξ΢τϓοτ඼࣭ΛܾΊΔͷͰɺͦ͏͍͏ϓϩηεߏங΋ಉ࣌ ʹؤு͍͖ͬͯ·͠ΐ͏

Slide 43

Slide 43 text

3FDSVUJOH "*ϝοηϯδϟʔͰ͸ϑϩϯτΤϯδχΞΛେืूͰ͢ʂ ҎԼʹϐϯͱ͘Δํ͸5XJUUFSͰ΋ͳΜͰ΋੠͔͚͍ͯͩ͘͞ʂ w 5ZQF4DSJQU w 3Y+4 w 3FBDU