anomalocaristan’s blog

JSやGo、設計などについて学んだことをメモしておくサイトです

Goでテストを書こう 〜バブルソートのテスト〜


この前バブルソートについてまとめたので、ついでにバブルソートのテストコードを書きました。 anomalocaristan.hatenablog.com

ソースコードの全体

main.go

package main

import (
    "fmt"
)

func main() {
    param := []int{5, 10, 4, 0, 2, 13, 17, 8, 20}
    BubbleSort(param)

    fmt.Println(param)
}

func BubbleSort(ele []int) []int {
    flag := true

    for flag {
        flag = false

        for i := 0; i < len(ele)-1; i++ {
            if ele[i] > ele[i+1] {
                flag = true
                ele[i], ele[i+1] = ele[i+1], ele[i]
            }
        }
    }

    return ele
}


テストコードの全体

main_test.go

package main

import (
    "fmt"
    "testing"
)

func TestBubbleSortInt(t *testing.T) {
    // 8要素の配列(数字)を渡す
    testArr := []int{5, 1, 0, 34, 23, 4, 9, 16}
    BubbleSort(testArr)

    // lengthが0のときはFatalエラー
    if len(testArr) < 1 {
        t.Fatalf("array length is 0")
    }

    // check max value
    if max(testArr) != testArr[len(testArr)-1] {
        t.Errorf("index %d is not max value", len(testArr)-1)
    }

    // check min value
    if min(testArr) != testArr[0] {
        t.Errorf("index 0 is not min value")
    }

    fmt.Print(testArr)
}

func max(s []int) int {
    max := s[0]
    for _, value := range s {
        if value > max {
            max = value
        }
    }

    return max
}

func min(s []int) int {
    min := s[0]
    for _, value := range s {
        if value < min {
            min = value
        }
    }

    return min
}


テストコードの解説

まずは、コードの中からテストしたいfunctionを呼び出します。 このとき、必要に応じて引数を渡します。

   testArr := []int{5, 1, 0, 34, 23, 4, 9, 16}
    BubbleSort(testArr)

で、テスト項目を書いていきます。 lengthが0の時のエラーを起こしたいときには、testArrにint[]{}を代入するとOKです。

   // lengthが0のときはFatalエラー
    if len(testArr) < 1 {
        t.Fatalf("array length is 0")
    }

最大値が配列の一番最後のIndexに入っているか?をチェックしたい。 でもIndexをハードコードしちゃうとテスト対象の配列が変わるたびにその部分を変えないといけないので

   // これだとキツイ
    if testArr[7] != testArr[len(testArr)-1] {
        t.Errorf("index %d is not max value", len(testArr)-1)
    }

最大値を取るような関数を作ります

func max(s []int) int {
    max := s[0]
    for _, value := range s {
        if value > max {
            max = value
        }
    }

    return max
}

で、こうじゃ!

   // check max value
    if max(testArr) != testArr[len(testArr)-1] {
        t.Errorf("index %d is not max value", len(testArr)-1)
    }

    fmt.Print(testArr)

最小値を取れるような関数min()も定義。

func min(s []int) int {
    min := s[0]
    for _, value := range s {
        if value < min {
            min = value
        }
    }

    return min
}

上で定義したものをコール。

   // check min value
    if min(testArr) != testArr[0] {
        t.Errorf("index 0 is not min value")
    }

さいごに

本当は配列が二桁いったときに、一桁〜二桁の境でバグらないか?みたいなのとかも 確認すべきなんでしょうが、いったんここで終わりにします。

参考にさせていただいた神サイト

基本的なユニットテスト - はじめてのGo言語

逆引きGolang (配列)