go言語のテストに関する内容ノート

6565 ワード

実はこれまでテスト自体が弱かったので、pythonでもgoでもテストについてはあまり気にしていませんでしたが、今回はgoのテストについて整理しておきます
ユニットテスト
Goプログラムは主に3種類のテストを含む:機能テスト(test)、ベンチマークテスト(benchmark、性能テストとも呼ばれる)、およびサンプルテスト
ここでは、サンプルテストも機能テストですが、プログラムが印刷した内容に注目しています.
 
一般的には、1つのテストソースファイルは、コマンドソースファイルまたはライブラリソースファイルに対してのみテストされるので、同じコードパッケージに入れる必要があります.
テストソースファイルのプライマリ名は、テストソースファイルのプライマリ名を先頭とする、テストソースファイル名がdemoである場合など「_test」を接尾辞としなければならない.goじゃあテストソースファイル名はdemo_test.go
Go言語はテスト関数の名前と署名にどのような規定がありますか?
  • 機能テスト関数については、その名前はTestを接頭辞とする必要があり、パラメータリストには*testingが1つしかない.T型のパラメータ宣言
  • 性能試験関数の場合、その名称はBenchmarkを接頭辞とし、唯一のパラメータのタイプは*testingである必要がある.Bタイプ
  • インスタンステスト関数の場合、その名前はExampleをプレフィックスとする必要がありますが、関数のパラメータリストには強制規則
  • はありません.
    go testコマンドの主な流れは:
    go testコマンドは、内部で使用するコマンドを特定したり、指定したコードパッケージやソースファイルの有効性を確認したり、ベースのタグが合法かどうかを判断したりするなど、実行を開始する前に準備をします.
    準備作業が完了すると、go testコマンドはテストコードパッケージごとに順次構築され、パッケージ内の要求に合致するテスト関数を実行し、一時ファイルを整理し、テスト結果を印刷します.
    ここでの順序は、各テストコードパッケージに対してgo testコマンドがテストプロセスの各ステップをシリアルに実行することを示します.しかし、テスト速度を速めるために、通常、複数の被テストパッケージの機能テストが同時に行われます.ただ最後にテスト結果を印刷したとき
    私たちが与えた順序で一つ一つ行い、シリアルでテストを実行しているように感じます.
    コンカレントテストはパフォーマンステストの結果にばらつきがあるため、パフォーマンステストは一般的にシリアルで行われます.
    go test-vテストでより詳細なログ情報が表示されます
    テストを実行中にすぐに失敗させたい場合は、この関数でt.FailNowメソッドを呼び出すことができます.
     
    パフォーマンステストのテスト結果をどのように説明しますか?
    これはやはりとても重要で、これまで細かく理解していませんでした
    ここにコードがあり、パフォーマンステストコードの内容は次のとおりです.
    package demo54
    
    import "math"
    
    func GetPrimes(max int) []int {
        if max <= 1 {
            return []int{}
        }
        marks := make([]bool, max)
        var count int
        squareRoot := int(math.Sqrt(float64(max)))
        for i := 2; i <= squareRoot; i++ {
            if marks[i] == false {
                for j := i * i; j < max; j += i {
                    if marks[j] == false {
                        marks[j] = true
                        count++
                    }
                }
            }
        }
        primes := make([]int, 0, max-count)
        for i := 2; i < max; i++ {
            if marks[i] == false {
                primes = append(primes, i)
            }
        }
        return primes
    }

     
    パフォーマンステストのコードは次のとおりです.
    package demo54
    
    import "testing"
    
    func BenchmarkGetPrimes(b *testing.B) {
        for i:=0;i {
            GetPrimes(1000)
        }
    }

    次はテストコマンドと結果です.
    zhaofan@zhaofandeMacBook-Pro  ~/go_project  go test -bench=. -run=^$ 36/demo54
    goos: darwin
    goarch: amd64
    pkg: 36/demo54
    BenchmarkGetPrimes-4      500000              2728 ns/op
    PASS
    ok      36/demo54       1.407s

     
    このコマンドについて説明します.
    最初のタグ-bench=.このタグコマンドがある限り、パフォーマンステストが行われます.任意の名前のパフォーマンステスト関数を実行する必要があることを示します.もちろん、ここではGoプログラムテストの基本ルールに合致します.
    2番目のタグと値は-run=^$このタグは、どの機能テスト関数を実行する必要があるかを示すために使用されます.これは、同じ関数名に基づいているタグの値^$は、名前が空の機能テスト関数のみを実行することを意味します.実際には、機能テスト関数は実行されません.
     
    結果:BenchmarkGetPrimes-4は単一の性能テストの名称と呼ばれ、コマンドが性能テスト関数BenchmarkGetPrimesを実行したことを示し、当時の最大P数が4の最大P数はgoroutineを同時に実行できる論理CPUの最大数に相当する.ここでのCPUはCPUコアと呼ぶことができるが、コンピュータの真のCPUコアと同等である.
    go test-cpuは最大P数のリストを設定できます
    テストコードの説明について:
    func BenchmarkGetPrimes(b *testing.B) {
        for i:=0;i {
            GetPrimes(1000)
        }
    }

     
    ここでは,b.N次方程式をループ反復するループでGetPrimes関数を呼び出し,渡されるパラメータは1000であり,go testコマンドはまずb.Nを1に設定しようと試みる.
    テスト関数を実行します
     
    テストの関数の実行時間が上限を超えていない場合、この悲しいデフォルトは1秒で、コマンドはb.Nの値を大きくして、再びテスト関数を実行して、このように往復して、この時間が上限以上であることを知っています.
     
    ある実行時間が上限以上である場合、このコマンドは今回このテスト関数の最後の実行を命令し、b.Nの値はテスト結果、すなわち上記のテスト結果の500000に含まれる.
     
    結果:2728 ns/opはGetPrimes関数を1回実行する平均消費時間が2728ナノ秒であることを示した.これは実は最後にテスト関数を実行した時間で、被測定関数の実行テストで割った結果です.