golang.tokyo#23

 golang.tokyo#23

Go をはじめるにあたって知っておいてほしいツールやテスト Part 2

112f4b6a485e501d03c8940d2a764c2b?s=128

michiru shirakawa

April 19, 2019
Tweet

Transcript

  1. 2.

    8PNFO8IP(P • 8PNFO8IP(P͸ɺ೥ʹαϯϑϥϯ γείͰɺঁੑɾδΣϯμʔϚΠϊϦςΟͷํ ͷͨΊͷ (PͷάϩʔόϧίϛϡχςΟͱͯ͠ ઃཱ͞Ε·ͨ͠ɻ • 8PNFO8IP(P5PLZP͸ɺ೥݄ ʹ೔ຊͰॳΊͯͷ

    8PNFO8IP(Pͷίϛϡ χςΟͱͯ͠ઃཱ͞Ε·ͨ͠ɻ • ݄ʹҰճ ϫʔΫγϣοϓܗࣜͰͷษڧձΛ։ ࠵͍ͯ͠·͢ɻ IUUQTXXXXPNFOXIPHPPSH
  2. 5.
  3. 6.

    ͍ΖΜͳςετ͕͋Δ ݴޠ ςετϑϨʔϜϫʔΫ 1)1 1)16OJU $PEFDFQUJPO 1)14QFD  +BWB +6OJU

    5FTU/(  3VCZ .JOJ5FTU 34QFD  +BWB4DSJQU +FTU +BTNJOF 
  4. 7.

    (Pͷςετ UFTUJOH func Janken(you, challenger Hand) Result { r :=

    (you - challenger + 3) % 3 return Result(r) } func TestJanken(t *testing.T) { … } ͜ΜͳॲཧΛςετ͍ͨ͠ɻ 5FTU\ؔ਺໊^ খจࣈͰ͸࢝·Βͳ͍
  5. 9.

    5BCMF%SJWFO5FTU func TestJanken(t *testing.T) { tests := []struct { user,

    computer Hand want Result }{ {Rock, Rock, Even}, {Rock, Paper, Lose}, {Rock, Scissors, Win}, … } for _, tt := range tests { got := Janken(tt.user, tt.computer) if got != tt.want { t.Errorf("%v, want %v", got, tt.want) } } } ςʔϒϧͰ༻ҙͨ͠ςετΛϧʔϓͰॲཧ͢Δɻ === RUN TestJanken --- PASS: TestJanken (0.00s) PASS All tests passed.
  6. 10.

    4VC5FTU func TestJanken(t *testing.T) { tests := []struct { name

    string user, computer Hand want Result }{ {"RockEven", Rock, Rock, Even}, {"RockLose", Rock, Paper, Lose}, {"RockWin", Rock, Scissors, Win}, … } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { got := Janken(tt.user, tt.computer) if got != tt.want { t.Errorf("%v, want %v", got, tt.want) } }) } } === RUN TestJanken === RUN TestJanken/RockEven === RUN TestJanken/RockLose === RUN TestJanken/RockWin --- PASS: TestJanken (0.00s) --- PASS: TestJanken/RockEven (0.00s) --- PASS: TestJanken/RockLose (0.00s) --- PASS: TestJanken/RockWin (0.00s) PASS All tests passed.
  7. 11.

    4VC5FTU for _, tt := range tests { tt :=

    tt t.Run(tt.name, func(t *testing.T) { t.Parallel() got := Janken(tt.user, tt.computer) if got != tt.want { t.Errorf("%v, want %v", got, tt.want) } }) } ςετͷฒྻॲཧͷ੍ޚʹ΋ར༻Ͱ͖Δɻ
  8. 12.

    .BJO func TestMain(m *testing.M) { fmt.Println("Janken Test Started.") os.Exit(m.Run()) }

    ςετͷલॲཧΛઃఆ͢Δ͜ͱ͕Ͱ͖Δɻ • Ҿ਺ͷύʔε • ؀ڥม਺ͷϩʔυ • σʔλϕʔεͷ઀ଓ
  9. 13.

    5FTUͷ࣮ߦ lHPIFMQUFTUz΍ lHPIFMQUFTUGMBHzʹ͢΂͕ͯɻ IUUQTHPMBOHPSHQLHUFTUJOH // すべてのテストをする go test -run ’’

    // 処理名の先頭が “Bear” を含むテストをする go test -run Bear // 処理名の先頭が “Bear” を含み, サブテストが “A“ にマッチするテストをする go test -run Bear/A // サブテストが “A” にマッチするテストをする go test -run /A
  10. 17.

    ஌͓ͬͯ͘ͱΑ͍͜ͱ 1 άϩʔόϧͱϓϥΠϕʔτ // パッケージの中だけで利⽤できる func hello() { fmt.Println("Hello, Gopher!!")

    } // パッケージの外からも利⽤できる func Hello() { fmt.Println("Hello, Gopher!!") }
  11. 18.

    ஌͓ͬͯ͘ͱྑ͍͜ͱ 2 EFGFSͷ͜ͱ func main() { // 関数の最後に実行 defer fmt.Println("gopher")

    fmt.Println("hello") } hello gopher Program exited. • EFGFSΛແࢹͯ͠ऴྃ͢Δॲཧ͕͋Δɻ PT&YJU • ϧʔϓม਺͸ಉ͡ࢀরઌͳͷͰ ͜͏͢Δͱ͍͍ɻ defer func() { fmt.Println(i) }() // loop variable i captured by func literal defer func(i int) { fmt.Println(i) }(i) // OK
  12. 19.

    ஌͓ͬͯ͘ͱΑ͍͜ͱ 3 TXJUDIͷจ๏ switch bear { case PolarBear: fmt.Println("白い") //

    break がいらない case AmericanBlackBear: fmt.Println("黒い") // break がいらない … }
  13. 20.

    ஌͓ͬͯ͘ͱྑ͍͜ͱ 4 ؔ਺ͷ໭Γ஋ func main() { a, b, c :=

    example("ビール", "日本酒") fmt.Println(a) fmt.Println(b) fmt.Println(c) } // 複数の戻り値を指定することができる func example(a, b string) (c, d, e string) { return a, b, fmt.Sprintf("%s, %s", a, b) }