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 で複数の入力パターンを投入する際によく使われるパターン「テーブル駆動テスト」も実践します。

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 ʮιʔε؅ཧʯͷ্෦ʹΞΠίϯ͕͋Γ·͢