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

How to write basic unittests

How to write basic unittests

基本的なユニットテストの書き方について、ユーティリティクラスを例に説明します。

E1cf27d9fa565b2867d171f21a39759c?s=128

tikidunpon

March 26, 2017
Tweet

Transcript

  1. How to write basic UnitTest (جຊతͳϢχοτςετͷॻ͖ํ) @tikidunpon GEEK GARAGE iOS

    vol2
  2. ςετ೤্͕ͬͯ·͔͢ʁ try!swift!Ͱ΋ྑ͍ςετͷ࿩͕͍͔ͭ͋͘Γ·ͨ͠Ͷʂ ͜ͷηογϣϯ͕ྑ͔ͬͨͰ͢ʂ http:/ /qualitycoding.org/files/SwiftMocks.pdf

  3. ࿩͢͜ͱ • جຊతͳϢχοτςετٕ๏ ࿩͞ͳ͍͜ͱ • ςετͷηοτΞοϓखॱ

  4. લఏ • ίʔυྔ͕૿͑ͯɺViewControllerʢҎԼVCʣ͕ϑΝοτɻ • ϓϩδΣΫτʹςετ͕ແ͍ɻ • ςετΛԿ͔Βॻ͍ͨΒ͍͍͔෼͔Βͳ͍ɻ

  5. ςετΛॻ͘໨త͸ ! ৭ʑ͋Γ·͕͢.. - ػೳΛຬ͍ͨͯ͠Δ͜ͱΛ֬ೝ͢Δ - όάΛൃݟ͢Δ - ճؼςετΛ༰қʹ͢Δ -

    ίʔυΛςετՄೳͳγϯϓϧ͞ʹอͭ
  6. Կ͔Βॻ͔͘ʁ • ViewControllerʁ • APIΛୟ͍͍ͯΔΫϥεʁ

  7. FatͳVCɺAPIͷςετ͸೉͍͠ ҎԼཧ༝͔Β·ͩ׳Ε͍ͯͳ͍ॳ৺ऀʹ͸ΦεεϝͰ͖ͳ͍ • ঢ়ଶΛଟ࣋ͪ͘ґଘؔ܎΋ෳࡶ • ೖग़ྗ͕ෆ໌֬ • ϞοΫ΍ελϒΛར༻ͨ͠ςετ͕ඞཁ • ੒ޭମݧΛಘʹ͍͘

  8. Կ͔Βॻ͔͘ʁ • ࠷΋ཻ౓ͷখ͍͞ϞσϧΫϥε • ϢʔςΟϦςΟΫϥε

  9. ԿނϢʔςΟϦςΟΫϥεʁ • ೖग़ྗ͕໌֬ • ґଘؔ܎͕গͳ͍ • খ͘͞੒ޭΛॏͶΒΕΔ • ʢྫʣจࣈྻΛʮͻΒ͕ͳʯ͔൑ఆͯ͠true/false஋Λฦؔ͢਺ ͳͲ

  10. ͲͷΑ͏ʹςετ͢Δͷ͔ʁ • ϗϫΠτϘοΫεςετ • ϒϥοΫϘοΫεςετ ྆ऀΛ্ख͘૊Έ߹Θͤͯޮ཰ྑ͘ςετ͠·͢ɻ

  11. ϗϫΠτϘοΫεςετ • ಺෦ߏ଄ʹ஫໨ • ॲཧܦ࿏Λ໢ཏ͍ͯ͘͠ςετ • ໢ཏ཰ʢΧόϨοδʣͰ࿙ΕΛݕग़Ͱ͖Δ • ࢓༷ͦͷ΋ͷ͕ؒҧ͍ͬͯΔ͜ͱ͸ݕग़Ͱ͖ͳ͍

  12. ϒϥοΫϘοΫεςετ • ಺෦ߏ଄͕Ͳ͏ͳ͍ͬͯΑ͏ͱؾʹ͠ͳ͍ • Ͳ͏͋Δ΂͖͔ʁͱ͍͏࢓༷ʹ஫໨ • ԿΛड͚औΓɺԿΛฦ͢΂͖͔ʁೖग़ྗΛςετ͢Δ

  13. ͋͞ॻ͍ͯΈΑ͏ ʮจࣈྻʯΛͻΒ͕ͳ͔൑ఆ͠true/falseΛฦؔ͢਺ͷςετ func testIsHiragana() { XCTAssertTrue("͋".isHiragana()) }

  14. ͋͞ॻ͍ͯΈΑ͏ ʮจࣈྻʯΛͻΒ͕ͳ͔൑ఆ͠true/falseΛฦؔ͢਺ͷςετ func testIsHiragana() { XCTAssertTrue("͊".isHiragana()) XCTAssertTrue("͋".isHiragana()) XCTAssertTrue("͌".isHiragana()) XCTAssertTrue("͍".isHiragana()) XCTAssertTrue("͎".isHiragana())

    XCTAssertTrue("͏".isHiragana()) XCTAssertTrue("͐".isHiragana()) XCTAssertTrue("͑".isHiragana()) XCTAssertTrue("͒".isHiragana()) }
  15. ͋͞ॻ͍ͯΈΑ͏ ʮจࣈྻʯΛͻΒ͕ͳ͔൑ఆ͠true/falseΛฦؔ͢਺ͷςετ func testIsHiragana() { XCTAssertTrue("͊".isHiragana()) XCTAssertTrue("͋".isHiragana()) XCTAssertTrue("͌".isHiragana()) XCTAssertTrue("͍".isHiragana()) XCTAssertTrue("͎".isHiragana())

    XCTAssertTrue("͏".isHiragana()) XCTAssertTrue("͐".isHiragana()) XCTAssertTrue("͑".isHiragana()) XCTAssertTrue("͒".isHiragana()) XCTAssertTrue("͓".isHiragana()) XCTAssertTrue("͔".isHiragana()) XCTAssertTrue("͕".isHiragana()) XCTAssertTrue("͖".isHiragana()) XCTAssertTrue("͗".isHiragana()) XCTAssertTrue("͘".isHiragana()) XCTAssertTrue("͙".isHiragana()) XCTAssertTrue("͚".isHiragana()) XCTAssertTrue("͛".isHiragana()) XCTAssertTrue("͜".isHiragana()) XCTAssertTrue("͝".isHiragana()) XCTAssertTrue("͞".isHiragana()) XCTAssertTrue("͟".isHiragana()) XCTAssertTrue("͠".isHiragana()) XCTAssertTrue("͡".isHiragana()) XCTAssertTrue("͢".isHiragana()) XCTAssertTrue("ͣ".isHiragana()) XCTAssertTrue("ͤ".isHiragana()) XCTAssertTrue("ͥ".isHiragana()) XCTAssertTrue("ͦ".isHiragana()) XCTAssertTrue("ͧ".isHiragana()) XCTAssertTrue("ͨ".isHiragana()) }
  16. ͋͞ॻ͍ͯΈΑ͏ ʮจࣈྻʯΛͻΒ͕ͳ͔൑ఆ͠true/falseΛฦؔ͢਺ͷςετ func testIsHiragana() { XCTAssertTrue("͊".isHiragana()) XCTAssertTrue("͋".isHiragana()) XCTAssertTrue("͌".isHiragana()) XCTAssertTrue("͍".isHiragana()) XCTAssertTrue("͎".isHiragana())

    XCTAssertTrue("͏".isHiragana()) XCTAssertTrue("͐".isHiragana()) XCTAssertTrue("͑".isHiragana()) XCTAssertTrue("͒".isHiragana()) XCTAssertTrue("͓".isHiragana()) XCTAssertTrue("͔".isHiragana()) XCTAssertTrue("͕".isHiragana()) XCTAssertTrue("͖".isHiragana()) XCTAssertTrue("͗".isHiragana()) XCTAssertTrue("͘".isHiragana()) XCTAssertTrue("͙".isHiragana()) XCTAssertTrue("͚".isHiragana()) XCTAssertTrue("͛".isHiragana()) XCTAssertTrue("͜".isHiragana()) XCTAssertTrue("͝".isHiragana()) XCTAssertTrue("͞".isHiragana()) XCTAssertTrue("͟".isHiragana()) XCTAssertTrue("͠".isHiragana()) XCTAssertTrue("͡".isHiragana()) XCTAssertTrue("͢".isHiragana()) XCTAssertTrue("ͣ".isHiragana()) XCTAssertTrue("ͤ".isHiragana()) XCTAssertTrue("ͥ".isHiragana()) XCTAssertTrue("ͦ".isHiragana()) XCTAssertTrue("ͧ".isHiragana()) XCTAssertTrue("ͨ".isHiragana()) XCTAssertTrue("ͩ".isHiragana()) XCTAssertTrue("ͪ".isHiragana()) XCTAssertTrue("ͫ".isHiragana()) XCTAssertTrue("ͬ".isHiragana()) XCTAssertTrue("ͭ".isHiragana()) XCTAssertTrue("ͮ".isHiragana()) XCTAssertTrue("ͯ".isHiragana()) XCTAssertTrue("Ͱ".isHiragana()) XCTAssertTrue("ͱ".isHiragana()) XCTAssertTrue("Ͳ".isHiragana()) XCTAssertTrue("ͳ".isHiragana()) XCTAssertTrue("ʹ".isHiragana()) XCTAssertTrue("͵".isHiragana()) XCTAssertTrue("Ͷ".isHiragana()) XCTAssertTrue("ͷ".isHiragana()) XCTAssertTrue("͸".isHiragana()) XCTAssertTrue("͹".isHiragana()) XCTAssertTrue("ͺ".isHiragana()) XCTAssertTrue("ͻ".isHiragana()) XCTAssertTrue("ͼ".isHiragana()) XCTAssertTrue("ͽ".isHiragana()) XCTAssertTrue(";".isHiragana()) XCTAssertTrue("Ϳ".isHiragana()) XCTAssertTrue("΀".isHiragana()) XCTAssertTrue("΁".isHiragana()) XCTAssertTrue("΂".isHiragana()) XCTAssertTrue("΃".isHiragana()) XCTAssertTrue("΄".isHiragana()) XCTAssertTrue("΅".isHiragana()) XCTAssertTrue("Ά".isHiragana()) XCTAssertTrue("·".isHiragana()) XCTAssertTrue("Έ".isHiragana()) XCTAssertTrue("Ή".isHiragana()) XCTAssertTrue("Ί".isHiragana()) XCTAssertTrue("΋".isHiragana()) XCTAssertTrue("Ό".isHiragana()) XCTAssertTrue("΍".isHiragana()) XCTAssertTrue("Ύ".isHiragana()) XCTAssertTrue("Ώ".isHiragana()) XCTAssertTrue("ΐ".isHiragana()) XCTAssertTrue("Α".isHiragana()) XCTAssertTrue("Β".isHiragana()) XCTAssertTrue("Γ".isHiragana()) XCTAssertTrue("Δ".isHiragana()) XCTAssertTrue("Ε".isHiragana()) XCTAssertTrue("Ζ".isHiragana()) XCTAssertTrue("Η".isHiragana()) XCTAssertTrue("Θ".isHiragana()) XCTAssertTrue("Ι".isHiragana()) XCTAssertTrue("Κ".isHiragana()) XCTAssertTrue("Λ".isHiragana()) XCTAssertTrue("Μ".isHiragana()) XCTAssertTrue("἖".isHiragana()) XCTAssertTrue("἗".isHiragana()) XCTAssertTrue("Ἐ".isHiragana()) }
  17. ࢮʹ·͢Ͷ! શͯͷ஋Λςετ͢Δࣄ͸ඇݱ࣮తɻ ͦ΋ͦ΋100%όά͕ແ͍͜ͱ͸อূͰ͖ͳ͍ɻ func testIsHiragana() { XCTAssertTrue("͊".isHiragana()) XCTAssertTrue("͋".isHiragana()) XCTAssertTrue("͌".isHiragana()) XCTAssertTrue("͍".isHiragana())

    XCTAssertTrue("͎".isHiragana()) XCTAssertTrue("͏".isHiragana()) XCTAssertTrue("͐".isHiragana()) XCTAssertTrue("͑".isHiragana()) XCTAssertTrue("͒".isHiragana()) XCTAssertTrue("͓".isHiragana()) XCTAssertTrue("͔".isHiragana()) XCTAssertTrue("͕".isHiragana()) XCTAssertTrue("͖".isHiragana()) XCTAssertTrue("͗".isHiragana()) XCTAssertTrue("͘".isHiragana()) XCTAssertTrue("͙".isHiragana()) XCTAssertTrue("͚".isHiragana()) XCTAssertTrue("͛".isHiragana()) XCTAssertTrue("͜".isHiragana()) XCTAssertTrue("͝".isHiragana()) XCTAssertTrue("͞".isHiragana()) XCTAssertTrue("͟".isHiragana()) XCTAssertTrue("͠".isHiragana()) XCTAssertTrue("͡".isHiragana()) XCTAssertTrue("͢".isHiragana()) XCTAssertTrue("ͣ".isHiragana()) XCTAssertTrue("ͤ".isHiragana()) XCTAssertTrue("ͥ".isHiragana()) XCTAssertTrue("ͦ".isHiragana()) XCTAssertTrue("ͧ".isHiragana()) XCTAssertTrue("ͨ".isHiragana()) XCTAssertTrue("ͩ".isHiragana()) XCTAssertTrue("ͪ".isHiragana()) XCTAssertTrue("ͫ".isHiragana()) XCTAssertTrue("ͬ".isHiragana()) XCTAssertTrue("ͭ".isHiragana()) XCTAssertTrue("ͮ".isHiragana()) XCTAssertTrue("ͯ".isHiragana()) XCTAssertTrue("Ͱ".isHiragana()) XCTAssertTrue("ͱ".isHiragana()) XCTAssertTrue("Ͳ".isHiragana()) XCTAssertTrue("ͳ".isHiragana()) XCTAssertTrue("ʹ".isHiragana()) XCTAssertTrue("͵".isHiragana()) XCTAssertTrue("Ͷ".isHiragana()) XCTAssertTrue("ͷ".isHiragana()) XCTAssertTrue("͸".isHiragana()) XCTAssertTrue("͹".isHiragana()) XCTAssertTrue("ͺ".isHiragana()) XCTAssertTrue("ͻ".isHiragana()) XCTAssertTrue("ͼ".isHiragana()) XCTAssertTrue("ͽ".isHiragana()) XCTAssertTrue(";".isHiragana()) XCTAssertTrue("Ϳ".isHiragana()) XCTAssertTrue("΀".isHiragana()) XCTAssertTrue("΁".isHiragana()) XCTAssertTrue("΂".isHiragana()) XCTAssertTrue("΃".isHiragana()) XCTAssertTrue("΄".isHiragana()) XCTAssertTrue("΅".isHiragana()) XCTAssertTrue("Ά".isHiragana()) XCTAssertTrue("·".isHiragana()) XCTAssertTrue("Έ".isHiragana()) XCTAssertTrue("Ή".isHiragana()) XCTAssertTrue("Ί".isHiragana()) XCTAssertTrue("΋".isHiragana()) XCTAssertTrue("Ό".isHiragana()) XCTAssertTrue("΍".isHiragana()) XCTAssertTrue("Ύ".isHiragana()) XCTAssertTrue("Ώ".isHiragana()) XCTAssertTrue("ΐ".isHiragana()) XCTAssertTrue("Α".isHiragana()) XCTAssertTrue("Β".isHiragana()) XCTAssertTrue("Γ".isHiragana()) XCTAssertTrue("Δ".isHiragana()) XCTAssertTrue("Ε".isHiragana()) XCTAssertTrue("Ζ".isHiragana()) XCTAssertTrue("Η".isHiragana()) XCTAssertTrue("Θ".isHiragana()) XCTAssertTrue("Ι".isHiragana()) XCTAssertTrue("Κ".isHiragana()) XCTAssertTrue("Λ".isHiragana()) XCTAssertTrue("Μ".isHiragana()) XCTAssertTrue("἖".isHiragana()) XCTAssertTrue("἗".isHiragana()) XCTAssertTrue("Ἐ".isHiragana()) }
  18. ޮՌతʹςετΛॻ͘ʹ͸ ! 1. ಉ஋෼ׂ 2. ڥք஋෼ੳ 3. Τϥʔਪଌ

  19. ಉ஋෼ׂ • ೖྗ஋Λ͍͔ͭ͘ͷάϧʔϓʹ෼͚Δʢಉ஋Ϋϥεʣ • ಉ஋Ϋϥε͔Β୅ද஋1ͭΛςετσʔλͱͯ͠બ୒ • ແޮͳ஋΋࢖͏ͷͰΤϥʔॲཧͷςετ͕Մೳ

  20. ڥք஋෼ੳ • ಉ஋෼ׂͨ͠άϧʔϓͷ୺ͷ஋2͕ͭςετσʔλ • ڥք஋ʹ͸όά͕ूத͢Δͱ͍͏ܦݧଇʹجͮ͘ • ಉ஋෼ׂͱซ༻͞ΕΔ

  21. Τϥʔਪଌ ςετର৅ͱͯ͠༩͑ΒΕͨιϑτ΢ΣΞʹ͓͍ͯى͜Γͦ͏ͳ όάΛਪଌͯ͠ɺͦΕΛݕग़͢ΔςετέʔεΛઃܭ͢Δ͜ͱɻܦ ݧϕʔεͷςετٕ๏ʹ෼ྨ͞ΕΔɻ — ৘ใϚωδϝϯτ༻ޠࣙయɿΤϥʔਪଌ

  22. Τϥʔਪଌ ۩ମతʹ͸ʁ • 0ΛೖΕΔ • nullΛೖΕΔ • ۭσʔλ • ͏Δ͏೥

  23. ༏ઌॱҐ͸ʁ όάΛຒΊࠐΈ΍͍͢ڥք஋͕࠷΋ߴ͍ ڥք஋ ʼ Τϥʔਪଌ ʼಉ஋Ϋϥεͷ୅ද஋ ͜ͷॱ൪ʹςετέʔεΛॻ͘ͱޮՌతɻ ϓϩδΣΫτن໛ʹΑΓɺಉ஋Ϋϥεͷ୅ද஋Λলུ͢Δ͜ͱ΋ ͋Γ͏Δɻ

  24. मਖ਼൛ func testIsHiragana() { //༗ޮڥք஋ XCTAssertTrue("\u{3041}".isHiragana()) XCTAssertTrue("\u{3096}".isHiragana()) //ແޮڥք஋ XCTAssertFalse("\u{3040}".isHiragana()) XCTAssertFalse("\u{3097}".isHiragana())

    //༗ޮಉ஋Ϋϥεͷ୅ද஋ XCTAssertTrue("͍͋͏͓͑".isHiragana()) //Τϥʔਪଌ XCTAssertFalse("".isHiragana()) }
  25. ·ͱΊ • ϢʔςΟϦςΟΫϥεͰܦݧΛੵΉ • গ͠Ͱ΋ςετͷίετΛԼ͛ͯश׳ʹ͢Δ͜ͱ͕େࣄ • ڥք஋ ʼ Τϥʔਪଌ ʼಉ஋Ϋϥεͷ୅ද஋

    • ͦͯ͠ViewControllerͷςετ΁..