Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Unityテスト完全に理解した(実機、自動、利のあるテストに食らいつく話)

Avatar for Toru Toru
June 06, 2018

 Unityテスト完全に理解した(実機、自動、利のあるテストに食らいつく話)

2018/06/06 開催の[Unityテスト完全に理解した]というイベントでの死霊です。

iOSでの実機デモの動画とかはgithubにあったりする。

https://github.com/sassembla/CompletelyUnderstoodUnityTest/tree/master

Avatar for Toru

Toru

June 06, 2018
Tweet

More Decks by Toru

Other Decks in Technology

Transcript

  1. 6OJUZ5FTUͷ͍͍ͱ͜Ζ ίʔυॻ͘ɻ [UnityTest] public IEnumerator Waaaaaaaai() { /* IEnumeratorΛฦ͢ϝιουͰςετΛॻ͘͜ͱ͕Ͱ͖Δɻ ͜ΕʹΑͬͯɺಛఆͷ৚͕݅੔͏·ͰඇಉظͰ଴ͬͨΓɺ

    ޷͖ͳλΠϛϯάͰίʔυʹׯবͰ͖ͨΓ͢Δɻ */ while (true) { yield return null; } } ͜ͷςετϝιου͕ɺຖϑϨʔϜɺ Updateͷ͋ͱɺLateUpdateͷલʹݺ͹ΕΔɻ
  2. ݱࡏͷ Զͷ 6OJUZͰͷςετ ͜Μͳ΍ͭɻ w 1MBZ࣌ɺ6*Ͱςετਐḿදࣔ w ΤσΟλͷ6OJUZ5FTUͷ(6* ͔Β࣮ߦՄೳ ;͗͠

     w ࣮ػͰςετ࣮ߦ ˠ4MBDLʹΤϥʔͱ͔εΫγϣ6Q w 4FUVQ5FBSEPXO͕ඇಉظՄ ͱ͔͕Ͱ͖Δɻ
  3. • PlayModeͰͷςετ • ػೳ͝ͱͷ୯ମςετ x N • ػೳଋͶͨΠϯςάΆ͍ͷ x N

    ࣮ࡍͷςετίʔυ ˠ༷ʑͳػೳ΍ͦͷू߹ͷςετ͕͋Δɻ ςετ͍ͯ͠Δର৅͸ଟ࠼ɻ ͕ɺϑΥʔϚοτ͸࣮͸ϫϯύλʔϯɻ
  4.  લఏΛἧ͑ͯ TFUVQ   ςετ൑அ  ͓ΘͬͨΒ͓ย͚ͮ UFBSEPXO 

    4FUVQ ςετέʔε 5FBSEPXO ΦʔιυοΫεͳςετ ςετ࣮ߦ ࣍ͷςετ͕͋Ε͹࣮ߦ
  5. 4FUVQ ςετέʔε 5FBSEPXO ςετ࣮ߦ 1MBZ.PEF ࣍ͷςετ͕͋Ε͹࣮ߦ 1MBZ.PEFͰͷςετ (+Miyamasu) ͜ͷؒ͸ɺ6OJUZͷ1MBZதͱ શ͘ಉ͡ঢ়ଶʹͳΔɻ

    γʔϯΛ։͍ͨΓɺ (BNF0CKFDU୳ͨ͠Γࣗ༝ɻ 6OJUZ͕ಈ͍ͯΔঢ়ଶ ςετɻ ࣌ؒ࣠ঢ়ଶมԽ͕͋Δɻ
  6. 4FUVQ5FBSEPXO GameObject bombCandidate; [MSetup] // MiyamasuͷsetupΞτϦϏϡʔτ public IEnumerator Setup() {

    var loadSceneOp = SceneManager.LoadSceneAsync("MyScene", LSM.Additive); while (!loadSceneOp.isDone) { yield return null; } // bombCandidateʹΠϯελϯεΛηοτ bombCandidate = GameObject.Find("Bomb"); IsNotNull(bombCandidate, “ര஄͕ɹͳ͍ʂ”); } [MTeardown] // MiyamasuͷteardownΞτϦϏϡʔτ public IEnumerator Treardown() { var unloadSceneOp = SceneManager.UnloadSceneAsync("MyScene"); while (!unloadSceneOp.isDone) { yield return null; }
  7. ςετϝιου ര஄ඵҎ಺ʹരൃ͢Δ͸ͣ [MTest]// MiyamasuͷtestҰ݅͝ͱͷΞτϦϏϡʔτ public IEnumerator BombWillBeDestroyedIn5sec() { /* ര஄͸MySceneͷϩʔυ͔Β࠷େ5ඵҎ಺ʹരൃɺDestroy͞ΕΔɺͱ͍͏૝ఆͳͷͰɺ

    bombCandidate͕nullʹͳΔ·Ͱ࠷େ5ඵ଴ͭɻ5ඵҎ্͔͔ͬͨΒtimeoutΤϥʔɻ */ yield return WaitUntil( () => bombCandidate == null, () => { throw new TimeoutException(“5ඵͨͬͯ΋രൃͯ͠ͳ͍ʂ"); }, 5.0 ); }
  8. ผͷςετΛ಺แ͢Δςετ ര஄͕രൃͯͨ͠Βۙॴͷఢ͕ࢮ͵ͷͰ͸ [MTest] public IEnumerator BombKillsNearEnemies() { // ര஄ͷۙॴʹ͍ΔఢΩϟϥΛݕ஌ var

    enemiesNearBomb = ര஄ͷۙॴʹ͍ΔఢΩϟϥΛݕ஌͢Δॲཧ(bombCandidate); // ര஄ͷരൃΛ଴ͭ var bombCoroutine = BombWillBeDestroyedIn5sec(); yield return bombCoroutine; // ര஄ͷۙॴʹ͍ͨఢΩϟϥͷੜࢮνΣοΫɺHP͕ݮ͍ͬͯΔ or ࢮΜͰ͍Δɺͱ͔ɻ foreach (var enemy in enemiesNearBomb) { False(enemy.IsAlive()); } }
  9. ςετ$ ඵ # ௥Ճ ςετ# ඵ " ௥Ճ ඵ͸·͋ద౰ͳΜ͚ͩͲɺ ͍͍ͩͨdඵ͘Β͍ͷൣғͰ࢝ΊΔͱָɻ

    ௒୹࣌ؒͳࣄ৅ʹର͢Δςετ͔Β ͩΜͩΜੵΈॏͶ͍ͯ͘ͱྑ͍ɻ ςετ" ඵ ඵͰऴΘΔࣄ৅ͷ ςετͷ͓͢͢Ί
  10. w ͿͬյΕΛݕ஌Ͱ͖Δ w Ͳ͜·ͰյΕ͍ͯΔ͔ͷ൑அࡐྉʹͳΔ w ࠶ݱˠम෮·Ͱͷ͕࣌ؒۃݶ·Ͱ୹ॖͰ͖Δ w ࠶ൃ༧๷͕Ͱ͖Δ w ͜͜Ζ͕҆Β͙

    ਫ਼ਆ໘  w ମྗ͕ݮΒͳ͍ঢ়ଶͰ༡΂Δ ೑ମ໘  ཱͪ໭ͬͯ ςετͷརӹ جຊ ࣗ෼͸͜ͷลΛ࣮ݱ͢ΔͷʹɺΦεεϝΛ࣮ߦͯ͠Δײ͡ɻ
  11. ςετ͠΍͍͢ίʔυ w มԽ͕ಛఆͷൣғ಺ w Ұఆ࣌ؒͰऴΘΔ w ֎෦͔ΒมԽ͕ݕ஌͠΍͍͢   ։͔࢝ΒϑϨͰϑϥά͕"͔Β#ʹมΘͬͨΒ׬ྃɺͱ͔

       ϑϥάؔ࿈ͩͬͨΒ͍͘ΒͰ΋Ԡ༻͕ޮ͘ → ୯ʹ੍࣌ؒݶ͚ͭͯϑϥά͕ೲಘͰ͖Δ஋ʹͳΔ·Ͱ଴ͭɺͱ͔ͰOK → ௨ͬͨΒɺผͷई౓(͜·͔͍஋͸૝ఆ௨Γ͔ʁ)ͰςετΛ௥Ճ͢Δɻ Φϑ τϐ
  12. ςετ͠ʹ͍͘ίʔυ ઌ΄Ͳͷਅཪɻ w มԽ͕ϥϯμϜ w Ұఆ࣌ؒͰऴΘΒͳ͍ w ֎෦͔ΒมԽ͕ݕ஌Ͱ͖ͳ͍ ෺ཧΤϯδϯͱ͔ͷ஋Λࣗ༝ؾ··ʹೖΕͩ͢ͱΩπ͍ɻ →·Μ·ͩͱઈରςετʹͳΒͳ͍(ؾ෼Ͱ௨ͬͨΓ௨Βͳ͔ͬͨΓ͢Δ

    →੒ޭ͕ਓؒʹ͔͠൑அͰ͖ͳ͍΋ͷ΋ಉ༷ ͜ΕΒ͸ήʔϜతʹ͸༗༻ͳΜͰɺ ࣗ෼Ͱई౓Λఆٛͯ͠ɺ ʮ͜ͷ஋͕࣌ؒ಺ʹ͜ͷ஋ʹͳͬͨΒ׬ྃʂʯ ͱ͔΍ΔͱΑ͛͞ɻ →Θ͔Γ΍͍͢ਖ਼ղΛఆٛͯ͠νΣοΫ͢Δɻ Φϑ τϐ
  13. ҎԼ͓·͚ ͜Ε͔Β΋͜͏͍͏ςετ͸ॻ͜͏ͱࢥ͏  ɾ࠶ݱ͕ΊΜͲ͏͍͘͞΍ͭ  ɾ(6*ΆͪΆͪԡ͢ͷ͕ຖճਏ͍΍ͭ  ɾΑ͘σάϨ͢Δ΍ͭˡ͓લ͓લ ࠓޙཉ͍͠΋ͷ࡞ͬͯΔ΋ͷ 

    ϦϞʔτϓϩϑΝΠϦϯάूੵػ4IJTZBNP γγϟϞ     ಛఆͷ୺຤্Ͱద౰ʹ1SPpMJOHͯ͠ɺϦϞʔτͰ݁Ռऩूɻ  ஗͍ʂͱ͍͏λΠϛϯάͰԡ͢Ϙλϯͱ͔༻ҙͯ͠ɺͦͷϘλϯ͕ԡ͞ΕͨΒσʔλΛऔΓɺ ϓϩϑΝΠϧΛϓϩϑΝΠϥαʔόʹૹΔ  ΤσΟλଆͰϓϩϑΝΠϥͷ݁ՌΛݟͯɺͲ͕͜Ϋιॏ͍͔Λ൑அɺͱ͍͏ɻ ࢿ࢈ͱͯ͠ͷςετ  ɾҰ౓ෆ۩߹͕ग़Ε͹ɺಉ͡৚݅Ͱෆ۩߹Λ࠶ݱͤ͞Δૉࡐʹ࢖͑Δ  ɾະ஌ͷෆ۩߹͕ग़ͨΒɺطଘͷςετͷ֦ுΛߦͬͯςετΛߦ͏͜ͱ͕Ͱ͖Δ  ɾաڈͷςετه࿥Λ΋ͱʹɺ҆શͳ෦෼ͱͦ͏Ͱͳ͍෦෼ͷઢҾ͖͕Ͱ͖Δ    ςετ͸ɺʮະདྷͷόάΛઢҾ͖͢Δʯ͜ͱ͕Ͱ͖Δɻ ͪΐͬͱ͓͓͛͞ Φϑ τϐ