ユニットテスト-テーブルテスト
ソフトウェア開発リフトサイクル(SDLC)を通して行われる多くのタイプのテストがあります、しかし、このポストでは、私は単位テストの中でテーブルテストに集中します.
最初に、どのようなテストケース、特に単体テストを見てみましょう.単体テストは、プロジェクト内のテストの粒状レベルです.それは、フィット感と正しさのためにパズルの個々の部分をテストします-「この機能は、私がそれがふるまうと思っている方法を振る舞うでしょうか?」
なぜ我々はユニットテストを使うのか?単体テストの目的は、高いコードカバレッジを取得し、プログラムの各移動部分を確認することです.機能の1つの小さな部分を確認するたびに、プログラムを実行する必要はありません.それは“幸せパス”、そのマニュアルと時間をテストする良い方法です.それで、物事が予想通りに行かないならば、どうですか?失敗をテストし、操作関数から予期しない出力を処理できます.単体テストでは、これを行うことができます.
練習では、単体テストが必要ですが、それは非常に迅速に厄介なことができます.以下の例の関数を使ってお見せします.
機能
それで、いくつかのテストを書きましょう
テスト関数
テーブルテストでこれらのケースを単純化しましょう.
テスト機能簡素化
まずは、個々のテストケース入力と予想される出力を収容する構造体を作成しました
次に、レンジループを作りました.このループは、
ちょうどそのように、私はテストを簡素化して、それらを容易にフォローし、ammendを容易にしました.
このコードはhttps://github.com/liamchampton/go-string-manipulation
あなたが質問をするか、このようにより多くの内容を見たいならば、私に線を降ろしてください📝
GitHub | | |
最初に、どのようなテストケース、特に単体テストを見てみましょう.単体テストは、プロジェクト内のテストの粒状レベルです.それは、フィット感と正しさのためにパズルの個々の部分をテストします-「この機能は、私がそれがふるまうと思っている方法を振る舞うでしょうか?」
なぜ我々はユニットテストを使うのか?単体テストの目的は、高いコードカバレッジを取得し、プログラムの各移動部分を確認することです.機能の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 | | |
Reference
この問題について(ユニットテスト-テーブルテスト), 我々は、より多くの情報をここで見つけました https://dev.to/liamchampton/unit-testing-table-tests-in-go-2nmoテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol