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

DESAMIS Go Training Season 1 Day 10

DESAMIS Go Training Season 1 Day 10

デザミス社内 Go 研修 (第1期) の10日目の資料です。
今回はテストコードの実装方法と実行方法を学びます。Go で複数の入力パターンを投入する際によく使われるパターン「テーブル駆動テスト」も実践します。

Avatar for Yutaka Kato

Yutaka Kato

June 29, 2021
Tweet

More Decks by Yutaka Kato

Other Decks in Technology

Transcript

  1. ݚमܭը ճ ೔࣍ ༧ఆ λΠτϧ ୈճ  Ր  (Pͷجຊ

    ୈճ  Ր  ؀ڥߏஙͱ(JU (JU)VCͷجຊ ୈճ  Ր  جຊߏจ ୈճ  Ր  ߏ଄ମɺεϥΠεɺϚοϓ ୈճ  Ր  ඪ४ϥΠϒϥϦ͸΍Ί͙Γ ୈճ  Ր  ϞδϡʔϧγεςϜͱ֎෦ϥΠϒϥϦ ୈճ  Ր  )FSPLV(Pೖ໳ ୈճ  Ր  "84-BNCEB(Pೖ໳ ୈճ  Ր  ฒߦॲཧϓϩάϥϛϯά ୈճ  Ր  ୯ମςετٕ๏ ୈճ  Ր  σʔλϕʔεΞΫηε ୈճ  Ր  'ZOFʹΑΔ(6*ΞϓϦέʔγϣϯ։ൃ ୈճ  Ր  ࣾ಺(PϓϩδΣΫτͷίʔυղઆ 
  2. Ͱ͖Δ͜ͱ  w ςετؔ਺ͷ࣮૷ͱ࣮ߦ w ϕϯνϚʔΫؔ਺ͷ࣮૷ͱ࣮ߦ w ίʔυྫؔ਺ͷ࣮૷ͱ࣮ߦɺHPEPD΁ͷܝࡌ w ΧόϨοδͷܭଌ

    HPUFTUDPWFSΦϓγϣϯ  w ϓϩϑΝΠϦϯά HPUFTUNFNQSP fi MF౳ͷΦϓγϣϯ  w σʔλڝ߹ͷݕग़ HPUFTUSBDFΦϓγϣϯ  w ͳͲͳͲʜ
  3. ໨ࢦ͍ͯ͠Δઃܭ  w ςετ͸શͯ(Pͷجຊߏจ if, for, struct౳ Ͱॻ͘ w ςετͷͨΊͷ৽ͨͳπʔϧ΍ه๏Λඞཁͱ͠ͳ͍

    w Ξαʔγϣϯ΍ϔϧύʔؔ਺͸ͳ͍ w جຊʹཱͪฦΓɺྑ͍ςετɺྑ͍ࣦഊϝοηʔδΛجຊ ߏจͰ͔ͬ͠Γॻ͘ͷ͕େࣄ (P'"2 
 l8IZEPFT(POPUIBWFBTTFSUJPOT lٴͼ 
 l8IFSFJTNZGBWPSJUFIFMQFSGVODUJPOGPSUFTUJOH zΑΓ IUUQTHPMBOHPSHEPDGBR
  4. ϧʔϧ   ςετίʔυ͸ʮ@UFTUHPʯͰऴΘΔϑΝΠϧʹ࣮ ૷͢Δ  ςετͷ࣮ߦ͸ʮHPUFTUʯαϒίϚϯυΛ༻͍Δ  ςετίʔυ͸ී௨ʹϏϧυ HPCVJME

    ͢Δࡍʹ͸ί ϯύΠϧ͞Εͳ͍  HPUFTUͰ࣮ߦͯ͠΋Β͍͍ͨؔ਺͸໋໊نଇͱγ άχνϟͷنఆʹै͏ඞཁ͕͋Δ
  5. ΍ͬͯΈΑ͏    74$PEFΛىಈ͠ݚमϦϙδτϦΛ։͖·͢  Ϣʔβʔ໊ϑΥϧμҎԼʹʮEBZUFTUʯϑΥϧμΛ࡞੒͠ɺͦͷதʹ ҎԼͷ಺༰ͰʮUIJHPʯͱʮUIJ@UFTUHPʯΛ࡞੒͠·͢ package th

    i // THI ͸Թ౓ (℃) ͱ࣪౓ (%) ͔Β THI (ෆշࢦ਺) ܭࢉ͠·͢ɻ func THI(temperature, humidity float64) float64 { return (0.8 * temperature) + humidity*(temperature-14.4)/100 + 46. 4 } package th i import "testing " func TestTHI(t *testing.T) { temperature, humidity, expected := 25.2, 65.0, 73. 5 actual := THI(temperature, humidity ) if expected != actual { t.Errorf("THI(%v, %v) = %v (ظ଴஋: %v)", temperature, humidity, actual, expected ) } } t h i . g o t h i _ t e s t . g o
  6. ΍ͬͯΈΑ͏   --- FAIL: TestTHI (0.00s) thi_test.go:9: THI(25.2, 65)

    = 73.58 (ظ଴஋: 73.5) FAIL exit status 1 FAIL github.com/u-motion/go-training-1/mikan/day10-test1 0.137s  ʮUIJHPʯΛӈΫϦοΫͯ͠ϝχϡʔ͔Β౷߹λʔϛφϧΛ։͖ɺ 
 ʮHPUFTUʯʻ&OUFSʼͱೖྗ͍ͯͩ͘͠͞  ʮUIJ@UFTUHPʯͷexpectedͷ஋Λʹमਖ਼͠ɺ࠶࣮ߦ͍ͯͩ͘͠͞ PASS ok github.com/u-motion/go-training-1/mikan/day10-test1 0.284s ੒ޭྫ
  7. ςʔϒϧۦಈςετ  w Α͘࢖ΘΕΔύλʔϯςʔϒϧۦಈ UBCMFESJWFO ςετ˞ w ೖྗɾظ଴஋ͷ૊Έ߹ΘͤΛෳ਺༻ҙͯ͠ϧʔϓͰճ͢ελΠϧ ˞ڭՊॻͰ͸ 


    ʮදۦಈʯͱ 
 ༁͞Ε͍ͯΔ func TestTHI(t *testing.T) { var tests = []struct { temperature float6 4 humidity float6 4 expected float6 4 } { {25.2, 65.0, 73.58} , {-33.0, 100.0, -27.4} , {40, 0.0, 78.4} , } for i, test := range tests { actual := THI(test.temperature, test.humidity ) if test.expected != actual { t.Errorf("#%d: THI(%v, %v) = %v (ظ଴஋: %v)", i+1 , test.temperature, test.humidity, actual, test.expected ) } } } ςʔϒϧͷ֤ߦͷఆٛ lςʔϒϧz ϧʔϓͰ֤ߦΛճ͢
  8. ΧόϨοδܭଌ  w ςετίʔυ͕ຊମίʔυΛͲͷఔ౓໢ཏ͍ͯ͠Δ͔Λܭଌ͢ Δ͜ͱ͕Ͱ͖Δ w ߦΧόϨοδɺ໋ྩΧόϨοδ $ ɺ෼ذΧόϨοδ $

    ɺ ৚݅ΧόϨοδ $ ͳͲͷࢦඪ͕͋Δ w HPUFTUαϒίϚϯυʹDPWFSΦϓγϣϯΛ෇͚ΔͱΧόϨο δ $ Λܭଌ͢Δ w 74$PEFͰ໢ཏ͍ͯ͠ΔՕॴɾ͍ͯ͠ͳ͍ՕॴΛදࣔͨ͠Γɺ ΧόϨοδ݁ՌΛϑΝΠϧʹग़ྗͯ͠πʔϧͰӾཡ͢Δ͜ͱ΋ Ͱ͖Δ
  9. ΍ͬͯΈΑ͏   ͖͞΄ͲͷUIJHPʹҎԼͷ෼ذΛ௥Ճ͠·͢ 
 
  ౷߹λʔϛφϧͰʮHPUFTUDPWFSʯʻ&OUFSʼΛೖྗ͠ɺ 
 ΧόϨοδΛ֬ೝ͠·͢

     74$PEFͷϝχϡʔͰ<දࣔ><ίϚϯυύϨοτʜ>Λબ୒ɺೖྗ ཝʹʮHPUFTUDPWFSʯ (P5PHHMF5FTU$PWFSBHFJO$VSSFOU 1BDLBHF ʻ&OUFSʼΛೖྗ͠·͢ ࠶࣮ߦͰݩʹ໭Γ·͢ if humidity < 0 || humidity > 100 { return math.NaN() } ˞ศٓతʹ/B/Λ࢖༻ɺ 
 FSSPSΛฦ͢΄͏͕ϕλʔ ྘͕໢ཏͨ͠Օॴɺ੺͕໢ཏ͍ͯ͠ͳ͍Օॴ
  10. ࣮ߦྫ  func BenchmarkTHI(b *testing.B) { for i := 0;

    i < b.N; i++ { THI(10.0, 50.0 ) } } func BenchmarkTxH(b *testing.B) { for i := 0; i < b.N; i++ { TxH(10.0, 50.0 ) } } Թ౓º࣪౓ ۭؾ೤ྔࢦ਺  Λฦ͚ͩ͢ͷ؆୯ͳؔ਺ ઌ΄Ͳ࡞ͬͨ5)* ؔ਺ % go test -bench . goos: darwin goarch: amd64 pkg: github.com/u-motion/go-training-1/mikan/day10-thi cpu: Intel(R) Core(TM) m5-6Y54 CPU @ 1.10GHz BenchmarkTHI-4 1000000000 0.3862 ns/op BenchmarkTxH-4 1000000000 0.3776 ns/op PASS ok github.com/u-motion/go-training-1/mikan/day10-thi 0.999s
  11. ࣮ߦྫ  func BenchmarkTHI(b *testing.B) { for i := 0;

    i < b.N; i++ { THI(10.0, 50.0 ) } } func BenchmarkTxH(b *testing.B) { for i := 0; i < b.N; i++ { TxH(10.0, 50.0 ) } } Թ౓º࣪౓ ۭؾ೤ྔࢦ਺  Λฦ͚ͩ͢ͷ؆୯ͳؔ਺ ઌ΄Ͳ࡞ͬͨ5)* ؔ਺ % go test -bench . goos: darwin goarch: amd64 pkg: github.com/u-motion/go-training-1/mikan/day10-thi cpu: Intel(R) Core(TM) m5-6Y54 CPU @ 1.10GHz BenchmarkTHI-4 1000000000 0.3862 ns/op BenchmarkTxH-4 1000000000 0.3776 ns/op PASS ok github.com/u-motion/go-training-1/mikan/day10-thi 0.999s ͸(0."9130$4ͷ஋ ԯճ࣮ߦͨ͠ ҆ఆͨ͠ܭଌ ʹඞཁͳ਺ΛࣗಈͰਪఆ͍ͯ͠Δ ଌఆ݁Ռ ฏۉ஋ ܭࢉ͕୯७ͳ5Y) ͷ΄͏͕ͪΐͬͱ͚ͩ଎͍ʂ
  12. ίʔυྫؔ਺  w ҎԼͷϧʔϧʹैͬͨؔ਺Λ࣮૷͢ΔͱɺʮHPUFTUʯͰؔ਺Λ࣮ߦ͠ ͯ݁ՌΛϨϙʔτͯ͘͠ΕΔ w ࣍ͷؔ਺γάχνϟͱίϝϯτΛ࣋ͭ 
 func ExampleName()

    {
 (ඪ४ग़ྗ͕͋Δίʔυ)
 // Output:
 // (ඪ४ग़ྗͷظ଴͢Δ݁Ռ)
 } w Name͸େจࣈͰ࢝·Δίʔυྫͷ໊લ w هड़ͨ͠ίʔυ͸HPEPDʹ΋දࣔ͞ΕΔ 
 ˞HPEPDʹࡌͤΔ͜ͱ͚͕ͩओͳ໨తͳΒඪ४ग़ྗ͸ͳͯ͘΋ྑ͍
  13. ΍ͬͯΈΑ͏   ͖͞΄ͲͷUIJ@UFTUHPʹҎԼͷίʔυΛ௥Ճ͠·͢ 
 
 
  ౷߹λʔϛφϧͰʮHPUFTUʯʻ&OUFSʼΛೖྗ͠ɺࣦഊ͢Δͷ Λ֬ೝ͠·͢

     Λʹमਖ਼͠ɺ΋͏Ұ౓ςετΛ࣮ߦͯ͠੒ޭʹͳ Δ͜ͱΛ֬ೝ͠·͢ func ExampleTHI() { fmt.Println(THI(20.5, 50.0) ) // Output : // 65. 8 } 見 た 目 は 文字通 り コ ー ド 例 だ け ど 、 こ れ も 立派 な テ ス ト コ ー ド !
 コ ー ド 例 で 触 った 部分 は カ バ レ ッ ジ 計測 に も 反映 さ れ ま す
  14. HPEPDͷ֬ೝ   ҎԼͷίϚϯυͰHPEPDͱ͍͏ίϚϯυϥΠϯπʔϧΛಋೖ͠·͢ 
 go install golang.org/x/tools/cmd/godoc@latest
 
 (࣮ߦόΠφϦ͕

    <ϗʔϜσΟϨΫτϦ>/go/bin/ ҎԼʹ֨ೲ͞Ε·͢)   ౷߹λʔϛφϧͰʮ~\go\bin\godocʯʻ5BCʼʻ&OUFSʼΛ࣮ߦ͠·͢˞  ϒϥ΢βͰIUUQMPDBMIPTUʹΞΫηε͠·͢  ࣗ෼͕࡞ͬͨίʔυͷυΩϡϝϯςʔγϣϯΛ୳͠·͢ 5IJSE1BSUZηΫγϣϯ 
 㸉HJUIVCDPN 
 ɹ㸉VNPUJPO ɹɹ㸉HPUSBJOJOH ɹɹɹ㸉Ϣʔβʔ໊ ɹɹɹɹ㸉EBZUFTU ˞$PNNBOE1SPNQUͷ৔߹ 
 ɹ%USERPROFILE%\go\bin\godoc
  15. 6OPSEFSFEPVUQVU  w ॱং͕ෆఆͳෳ਺ߦͷग़ྗ΋&YBNQMFؔ਺Ͱऔ Γѻ͏͜ͱ͕Մೳ w ॱং͕ෆఆͳNBQ͕ඞཁͳςετͰศར func ExampleTHI_map() {

    for humidity := range map[float64]bool{-1: true, 50: true, 101: true} { fmt.Println(THI(20.5, humidity) ) } // Unordered output : // 65.8 5 // Na N // Na N } NBQ͔ΒͷऔΓग़͠ॱং͸ϥϯμϜ ॱংΛม͑ͯ΋ύε͢Δ l6OPSEFSFEPVUQVUzͱ͢Δ
  16. HPUFTUͷ௥Ճػೳ  w ϓϩϑΝΠϦϯά DQVQSP fi MF CMPDLQSP fi MF

    NFNQSP fi MF  w $16ϓϩϑΝΠϧɺώʔϓϓϩϑΝΠϧɺ଴ͪϓϩϑΝΠϧ Λه࿥ɾදࣔՄೳ ڭՊॻઅΛࢀর  w ϨʔεσΟςΫλʔ SBDF  w ෳ਺ͷHPSPVUJOF͕ಉ࣌ʹҰͭͷ஋ΛಡΈॻ͖ গͳ͘ͱ΋ ͕ͭॻ͖ࠐΈ ͍ͯ͠Δ৔໘ ഉଞ੍ޚ࿙Ε Λݕ஌ͯ͠Τϥʔ ʹམͱͯ͘͠ΕΔ w ࣮ࡍʹൃੜ͠ͳ͍ͱݕ஌Ͱ͖ͳ͍ͷͰɺ໷௨͠ಉ͡ςετΛ ܁Γฦ࣮͠ߦͤ͞Δ౳ͷӡ༻ͱ૊Έ߹ΘͤΔͷ͕͓קΊ
  17. UFTUJOHͷ௥Ճػೳ  w ςετॲཧ༻ͷNBJOؔ਺ UFTUJOH. ˞(PͰಋೖ w ςετؔ਺͕૸Γग़͢લʹNBJOHPSPVUJOFͰ૸Β͓͖ͤͯ ͍ͨॲཧ΍ΫϦʔϯΞοϓ͍ͨ͠ॲཧ͕͋Δ৔߹ʹར༻ w

    αϒςετɾαϒϕϯνϚʔΫ U3VO C3VO ˞(PͰಋೖ w ϧʔϓͷதͳͲ͔Β৽ͨͳςετ΍ϕϯνϚʔΫΛ࣮ߦͰ͖Δ w ςʔϒϧۦಈܕϕϯνϚʔΫ΍֊૚ςετͳͲෳࡶͳ͜ͱΛ͠ ͍ͨͱ͖ͷΈ࢖͏ 詳 し く は t e s t i n g の g o d o c に あ る E x a m p l e コ ー ド をチ ェ ッ ク !
  18. ͕࣌ؒ༨ͬͨΒ w ࿅श໰୊ 1 <ϑΥϧμ໊EBZDIFY> w ·ͣ͸1ʹ͋ΔຊମίʔυIsPalindrome()ͱ 1ʹ͋Δςετίʔυͷࣸܦ͔Β w ࿅श໰୊

    1 <ϑΥϧμ໊EBZDIFY> w ͷίʔυΛίϐʔ͔ͯ͠Β࢝ΊΔͱΑ͍ w ࿅श໰୊ 1 <ϑΥϧμ໊EBZDIFY> w ·ͣ͸1ͷ5FTU4QMJU ͷࣸܦ͔Β 
  19. ίʔυΛॻ͖ऴ͑ͨΒ w ʮϢʔβʔ໊QSBDUJDFʯϒϥϯνͰ࡞ۀ͍ͯ͠Δ͜ͱΛ֬ೝ͍ͯͩ͘͠͞ w 74$PEFͷҰ൪ࠨԼʹදࣔ͞Ε͍ͯ·͢ w มߋΛεςʔδ͠ɺίϛοτ͍ͯͩ͘͠͞ w 74$PEFͷࠨϝχϡʔͷʮιʔε؅ཧʯ͔Βૢ࡞ w

    ίʔυΛ(JU)VCʹϓογϡ͍ͯͩ͘͠͞ w 74$PEFͷҰ൪ࠨԼͷϒϥϯν໊ͷ͙͢ӈʹ͋ΔΞΠίϯ͔Βૢ࡞ ্ਤ  w ϓϧϦΫΤετΛ࡞੒͍ͯͩ͘͠͞ w ʮιʔε؅ཧʯͷ্෦ʹΞΠίϯ͕͋Γ·͢