go testユニットテストと圧力テストを簡単に使用

10294 ワード

なぜ被テストファイルとテストファイルは通常同じフォルダの下と同じ宣言パッケージに置かれますか?


通常、私たちはテストされたファイルと別のテストファイルを同じ声明パッケージに入れて、パッケージ内テストと呼ばれています.もちろん、テスト関数のファイルを独立したパッケージに入れることもできます.パッケージ外テストと呼ばれます.
しかし、パケット外テストソースファイルには、パケットレベルのプライベート変数、関数、構造体タイプなど、測定されたソースファイル内のパケットレベルのプライベートなプログラムエンティティをテストできないという弊害があります.これは,両者の属するパケットが異なるためである.したがって、パッケージ外テストソースファイルを作成することは一般的にはめったにありません.

go testコマンドの簡単な使用


共通コマンド
意味
go test .
現在のディレクトリのすべてのテストファイルのテスト関数を実行するには、現在のパスの下にテストファイルがある必要があります.サブフォルダのテストファイルは検出されません.
go test ./…
現在のディレクトリの下にあるすべてのサブフォルダ内のテスト関数を実行します.
go test filename_test.go
現在のディレクトリの下にあるテストファイルのすべてのテスト関数を実行します.
go test -run TestFuncName
現在のディレクトリの下にある特定のテスト関数の実行
go test ./service -run TestFuncName
指定したパスを実行します./サービス内の特定のテスト関数
共通タグ
さぎょう
-v
合格した詳細テスト情報を表示します.デフォルトではエラー情報と合格した概要のみが表示されます.
-c
テストを実行するための実行可能ファイルを生成しますが、実行しません.この実行可能ファイルは、「pkg.test」と名付けられ、「pkg」は、テストされたコードパッケージのインポートパスの最後の要素の名前です.
-i
テストに依存するパッケージをインストールするだけで、実行はコンパイルされません.
-o
コンパイルによって生成される実行可能ファイル名の指定

go testユニットテスト


ルール#ルール#

  • テストファイル名は_でなければなりません.test.goの最後に、go testが実行されると、対応するコード
  • に実行される.
  • このバッグ
  • をimport testingしなければなりません
  • すべてのテストケース関数は、Testの最初の
  • である必要があります.
  • テスト用例は、ソースコードに書かれた順に
  • を順次実行する.
  • テスト関数TestXxx(t*testing.T)は1つのパラメータtしかなく、tでエラーを記録したり、テスト状態
  • をテストすることができます.
  • テスト関数のフォーマット:func TestXxx(t*testing.T)、Xxx部分は任意のアルファベット数字の組み合わせであってもよいが、頭文字は小文字[a-z]ではなく、例えばTestintdivは誤った関数名である.
  • 関数でtestingを呼び出す.TのError,Errorf,FailNow,Fatal,FatalIfメソッドは,テストが不合格であることを示し,ログメソッドを呼び出してテストの情報を記録する.

  • 2つの書き込みユニットテスト


    テストを待つファイルdivision.go次のように、xxxというテストファイルを書く必要があります.test.go同じかばんの中に
    package math
    
    import (
        "errors"
    )
    
    func Division(a, b float64) (float64, error) {
        if b == 0 {
            return 0, errors.New(" 0")
        }
    
        return a / b, nil
    }
    

    直接自分で関数をテストして、このように比較的に柔軟にどのように測定したいですか?
    mydivision_test.go
    package math
    
    import (
        "testing"
    )
    
    // 1
    func Test_Division_1(t *testing.T) {
        if i, e := Division(6, 2); i != 3 || e != nil { 
            t.Error(" ") //  
        } else {
            t.Log(" ") // 
        }
    }
    // 2
    func Test_Division_2(t *testing.T) {
        t.Error(" t.Error ")
    }

    実行命令go test .の結果は次のとおりです.
    $ go test .
    --- FAIL: Test_Division_2 (0.00s)        
            mydivision_test.go:16:  t.Error 
    FAIL
    FAIL    mytest/goTest   0.001s

    実行命令go test -v .の結果は次のとおりです.
    $ go test  -v .
    === RUN   Test_Division_1
    --- PASS: Test_Division_1 (0.00s)        
            mydivision_test.go:11:  
    === RUN   Test_Division_2
    --- FAIL: Test_Division_2 (0.00s)
            mydivision_test.go:16:  t.Error 
    FAIL
    exit status 1
    FAIL    mytest/goTest   0.001s

    -vを付けないと、失敗した用例しか表示されず、-vを加えると、通過した用例も失敗した用例も表示されます.
    gotestsツールパッケージを使用してテストファイルを自動的に生成し、サンプルテーブル駆動でテストするのに適した関数
  • gotestsキットgo get -v github.com/cweill/gotests/...
  • を先に取り付ける
  • 実行コマンドgotests -all -w .は、現在のディレクトリのすべてのファイルに対応するテストファイル
  • を生成する.
    結果はdivisionです.goはdivisionを生成しましたtest.goファイルは、生成ファイルのデフォルト接頭辞が対応する元のファイル名division_test.go、それから「//TODO:Add test cases.」エリアに例を記入してください
    package math
    
    import "testing"
    
    func TestDivision(t *testing.T) {
        type args struct {
            a float64
            b float64
        }
        tests := []struct {
            name    string  // 
            args    args    // 
            want    float64 // 
            wantErr bool    // bool error, error 
        }{
            // TODO: Add test cases.
            {"case 0", args{6, 2}, 3, false},
            {"case 1", args{6, 0}, 0, true},// error , 0, wantErr true
        }
        for _, tt := range tests {
            t.Run(tt.name, func(t *testing.T) {
                got, err := Division(tt.args.a, tt.args.b)
                if (err != nil) != tt.wantErr {
                    t.Errorf("Division() error = %v, wantErr %v", err, tt.wantErr)
                    return
                }
                if got != tt.want {
                    t.Errorf("Division() = %v, want %v", got, tt.want)
                }
            })
        }
    }
    

    実行結果の両方の例がテストに合格しました
    $ go test -v .
    === RUN   TestDivision
    === RUN   TestDivision/case_0
    === RUN   TestDivision/case_1
    --- PASS: TestDivision (0.00s)
        --- PASS: TestDivision/case_0 (0.00s)
        --- PASS: TestDivision/case_1 (0.00s)
    PASS
    ok      mytest/goTest   0.001s

    go test圧力試験


    ルール#ルール#

  • ファイル名規則はユニットテストと同じ
  • 圧力テスト関数は以下のフォーマットに従わなければならない.ここで、XXXは任意のアルファベット数字の組み合わせであってもよいが、頭文字は小文字ではなく、キジパラメータはtestingであることに注意する.B、ユニットテストパラメータはtesting.T func BenchmarkXXX(b *testing.B) { … }
  • go testは圧力テストをデフォルトで実行する関数ではありません.圧力テストを実行するにはパラメータ-benchを付ける必要があります.構文:-bench=ファイルパス名、例えばgo test-test.bench=. 現在のディレクトリの下にあるすべての圧力テスト関数
  • を示す.
  • 圧力試験例には、属性testingがある.B.Nは、圧力テストを行った回数を表しています.b.N=1234でwebbench_のような圧力回数を設定できます.test.go圧力試験関数
  • package math
    
    import (
        "testing"
    )
    
    func Benchmark_Division(b *testing.B) {
        for i := 0; i < b.N; i++ { //use b.N for looping
            Division(4, 5)
        }
    }
    
    func Benchmark_TimeConsumingFunction(b *testing.B) {
        b.StopTimer() // 
    
        // , , ,
        // 
    
        b.StartTimer() // 
    
        b.N=1234 // 1234 
    
        for i := 0; i < b.N; i++ {
            Division(4, 5)
        }
    }
    

    次のコマンドgo test -v ./webbench_test.go ./division.go -bench=".*"を実行すると、圧力テストのみが表示されます.2つのファイルが依存しているため、一緒にコンパイルして実行する必要があります.-bench=".*"は、すべての圧力テスト関数を実行した結果を次のように示します.
    $ go test -v ./webbench_test.go ./division.go  -bench=".*"
    goos: linux
    goarch: amd64
    Benchmark_Division-8                    2000000000               0.74 ns/op
    Benchmark_TimeConsumingFunction-8           1234                 0.96 ns/op
    PASS
    ok      command-line-arguments  1.558s
    

    上の情報はBenchmark_Divisionのデフォルトでは20000000回実行されていますが、Benchmark_TimeConsumingFunctionは、b.N=1234を設定することによって異なる回数を実行する.各実行平均時間はそれぞれ0.74ナノ秒と0.96ナノ秒であり、総実行時間は1.588秒であった.