ユニットテスト-テーブルテスト


ソフトウェア開発リフトサイクル(SDLC)を通して行われる多くのタイプのテストがあります、しかし、このポストでは、私は単位テストの中でテーブルテストに集中します.
最初に、どのようなテストケース、特に単体テストを見てみましょう.単体テストは、プロジェクト内のテストの粒状レベルです.それは、フィット感と正しさのためにパズルの個々の部分をテストします-「この機能は、私がそれがふるまうと思っている方法を振る舞うでしょうか?」
なぜ我々はユニットテストを使うのか?単体テストの目的は、高いコードカバレッジを取得し、プログラムの各移動部分を確認することです.機能の1つの小さな部分を確認するたびに、プログラムを実行する必要はありません.それは“幸せパス”、そのマニュアルと時間をテストする良い方法です.それで、物事が予想通りに行かないならば、どうですか?失敗をテストし、操作関数から予期しない出力を処理できます.単体テストでは、これを行うことができます.
練習では、単体テストが必要ですが、それは非常に迅速に厄介なことができます.以下の例の関数を使ってお見せします.

機能
package main

import "fmt"

func main() {
    str := "Liam"
    reversedStr := reverseString(str)
    fmt.Println(reversedStr)
}

func reverseString(str string) string {
    var reversedStr string
    for _, s := range str {
        reversedStr = string(s) + reversedStr
    }
    return reversedStr
}
この関数は文字列"liam "を取り、それを逆にします.このプログラムを実行した結果は"mail "でなければなりません.
それで、いくつかのテストを書きましょうreverseString() 関数.

テスト関数
package main

import "testing"

func TestReverseString(t *testing.T) {
    t.Run("reverse of Liam", func(t *testing.T) {
        str := "Liam"
        expected := "maiL"
        got := reverseString(str)
        if got != expected {
            t.Errorf("expected %s, got %s", expected, got)
        }
    })

    t.Run("reverse of foobar", func(t *testing.T) {
        str := "foobar"
        expected := "raboof"
        got := reverseString(str)
        if got != expected {
            t.Errorf("expected %s, got %s", expected, got)
        }
    })

    t.Run("reverse of testing", func(t *testing.T) {
        str := "testing"
        expected := "gnitset"
        got := reverseString(str)
        if got != expected {
            t.Errorf("expected %s, got %s", expected, got)
        }
    })
}
上記のテストで見ることができます3つのテストケースだけで、これはかなり多くのコードです.これはまだ有効ですが、それは長く、乱雑です.元の関数がもう少し複雑ならば、これらのテストがどう見えるか想像してみてください.
テーブルテストでこれらのケースを単純化しましょう.

テスト機能簡素化
func TestReverseString(t *testing.T) {
    tests := []struct {
        input  string
        output string
    }{
        {input: "Liam", output: "maiL"},
        {input: "foobar", output: "raboof"},
        {input: "testing", output: "gnitset"},
    }

    for _, testCase := range tests {
        got := reverseString(testCase.input)
        expected := testCase.output
        if got != expected {
            t.Errorf("expected %s, got %s", expected, got)
        }
    }
}
それは、よりよく見えます、しかし、私はちょうど何をしましたか?
まずは、個々のテストケース入力と予想される出力を収容する構造体を作成しましたstring . これは元の関数が入力として出力し、出力として返すものです.
次に、レンジループを作りました.このループは、struct を含むinput / output . ループの中には、input / output からの各テストケースごとにstruct . ループ内のコードは、テストケースの最初のセットで使用されているコードと同じですが、ループを導入すると、テスト結果を複製する必要がなくなります.
ちょうどそのように、私はテストを簡素化して、それらを容易にフォローし、ammendを容易にしました.
このコードはhttps://github.com/liamchampton/go-string-manipulation
あなたが質問をするか、このようにより多くの内容を見たいならば、私に線を降ろしてください📝
GitHub | | |