E2Eテストを継続するために

 E2Eテストを継続するために

E2Eテストを継続していくためのあれこれ

Transcript

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

    About IUUQJOGPCODI
  3. "*ϝοηϯδϟʔʹ͍ͭͯ

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

  6. &&ςετʹ͍ͭͯ

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

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

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

  10. ϝϯςφϯε

  11. ໰୊఺ w $44ηϨΫλͰૢ࡞ର৅ͷ%0.ΛબͿͨΊɺ6*ͷৄࡉ )5.-ͷߏ଄ ͷมԽ·Ͱςετ ʹӨڹ͢Δ w TUZMFEDPNQPOFOUTͷΑ͏ͳ$44JO+4Λ࢖͍ͬͯΔͱFF༻ͷηϨΫλΛผ్༻ҙ͢Δඞ ཁ͕͋Δ w

    Ξαʔγϣϯ͠ͳ͚Ε͹͍͚ͳ͍߲໨͕ଟ͗ͯ͢ɺมߋՕॴ͕രൃతʹ૿͑ͯഁ୼͢Δ
  12. ͜ΕΒΛߟ͑ͣʹ&&Λ࣮૷͢Δͱ ͍͍ͩͨߋ৽͞Εͳ͘ͳΔ͔ɺ ௨ΔՕॴ͚ͩಈ͘ແҙຯͳςετ͕ग़དྷ্͕Δ

  13. ղܾࡦ

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

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

    = true`); <div className={window.E2E_ENABLED ? "..." : "..."} />
  16. ϦτϥΠॲཧ ݱঢ়ͷϒϥ΢βΦʔτϝʔγϣϯπʔϧ͸ɺಉ࣮૷ͯ͠΋࣮ࡍʹϒϥ΢β Λ্ཱͪ͛Δؔ܎্ɺෆ҆ఆͳՕॴ͕࢒ͬͯ͠·͏ ͦͷͨΊɺશମͷϦτϥΠॲཧΛೖΕΔ͜ͱͰɺ͋Δఔ౓ࣦഊ΋ڐ༰͢Δ ςετ͸૊ΊΔ ղܾࡦ

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

  19. ϝϯςφϏϦςΟ

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

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

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

  23. มߋޙ มߋલ ൺֱ݁Ռ

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

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

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

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

  29. new BlinkDiff({ imageA: baselineImage, imageB: image, thresholdType: BlinkDiff.THRESHOLD_PERCENT, threshold: 0.0001,

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

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

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

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

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

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

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

  38. 0QFSBUJPO Ϣʔβʔૢ࡞ͷந৅Խ &YFDVUJPO ࣮ࡍͷίʔυ 0QFSBUJPO Ϣʔβʔૢ࡞ͷந৅Խ &YFDVUJPO ࣮ࡍͷίʔυ 0QFSBUJPO Ϣʔβʔૢ࡞ͷந৅Խ

    &YFDVUJPO ࣮ࡍͷίʔυ operation( // ૢ࡞ͷ໊લ 'name', // ࣮ࡍͷॲཧ async () => { ... }, // ͜ͷॲཧͷ੍໿ Restriction.of( Restriction.Type.SUCCESSOR, // ࣄલʹߦ͏΂͖ॲཧͷ໊લ 'other-op-name' ), )
  39. 4DSFFOTIPU εΫϦʔϯγϣοτΛࡱΔͱɺݱࡏͷ0QFSBUJPO໊͕ϋΠϑϯͰ݁߹͞Εͨ ໊લͰอଘ͞ΕΔ 0QFSBUJPOͷॱ൪Λม͑ΔͱεΫϦʔϯγϣοτͷ໊લ΋มΘΔ PQFOEP@TPNFUIJOHDMPTFQOHΈ͍ͨͳ໊લ ϝϯςφϏϦςΟϒϥ΢βૢ࡞ϨΠϠʔͷந৅Խ

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

  41. 0QFSBUJPO" 0QFSBUJPO# 0QFSBUJPO$ 0QFSBUJPO% 0QFSBUJPO& 0QFSBUJPO' 0QFSBUJPO( ΦϖϨʔγϣϯ(͸&ʹґଘ͓ͯ͠Γ &͸#ʹґଘ͍ͯ͠Δ ͜ΕΒ͸ࣄલʹ൑໌͍ͯ͠ΔͷͰɺ

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

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