ホームページ >バックエンド開発 >Golang >コンパイルされた Go バイナリと対話する機能テストで死角のない包括的なカバレッジ プロファイルを実現するにはどうすればよいでしょうか?

コンパイルされた Go バイナリと対話する機能テストで死角のない包括的なカバレッジ プロファイルを実現するにはどうすればよいでしょうか?

Susan Sarandon
Susan Sarandonオリジナル
2024-10-25 07:14:29617ブラウズ

How to achieve comprehensive coverage profiles without blind spots for functional tests interacting with a compiled Go binary?

死角のない機能テストのカバレッジを表示

問題:

を生成するにはコンパイル済み Go バイナリと対話する非 Go 言語で記述された機能テストのカバレッジ プロファイルの場合、main_test.go ファイルには、終了コードをチャネルに送信するように main() メソッドを変更する Test_main 関数が含まれています。ただし、exit() 関数の if flag.Lookup("test.coverprofile") != nil 条件は、カバレッジ プロファイルが要求されたときに os.Exit(code) が実行されない可能性があるため、カバレッジ結果に盲点を作成します。 .

解決策:

死角のないカバレッジ プロファイルを作成するには、テストから main.go ファイルを除外することをお勧めします。これは、ビルド タグを使用して、main.go ファイルの先頭に // build !test という行を追加することで実現できます。これにより、テスト ビルド中にファイルを無視するように Go コンパイラーに指示されます。

次は、このアプローチを組み込んだコード例の修正バージョンです。

<code class="go">// dofunc.go
package main

import (
    "fmt"
    "math/rand"
    "time"
)

var seed int64 = time.Now().UTC().UnixNano()

func doFunc() int {
    rand.Seed(seed)
    var code int
    for {
        i := rand.Int()
        fmt.Println(i)
        if i%3 == 0 {
            code = 0
            break
        }
        if i%2 == 0 {
            fmt.Println("status 1")
            code = 1
            break
        }
        time.Sleep(time.Second)
    }
    return code
}

// main.go
//+build !test
package main

import "os"

func main() {
    os.Exit(doFunc())
}

// dofunc_test.go
package main

import (
    "testing"
    "flag"
    "os"
)

var exitCode int

func TestMain(m *testing.M) {
    flag.Parse()
    code := m.Run()
    os.Exit(code)
}

func TestDoFuncErrorCodeZero(t *testing.T) {
    seed = 2

    if code := doFunc(); code != 0 {
        t.Fail()
    }
}

func TestDoFuncErrorCodeOne(t *testing.T) {
    seed = 3

    if code := doFunc(); code != 1 {
        t.Fail()
    }
}</code>

使用法:

  1. タグを使用してカバレッジ バイナリを構築します: go test -c -coverpkg=。 -o myProgram -tags test
  2. カバレッジ バイナリを実行します: ./myProgram -test.coverprofile=/tmp/profile
  3. カバレッジ HTML レポートを生成します: go tool cover -html /tmp/profile -o /tmp/profile.html

main.go をテストから除外することで、exit() 関数はカバレッジ分析の一部ではなくなり、カバレッジ プロファイルは、機能テスト。

以上がコンパイルされた Go バイナリと対話する機能テストで死角のない包括的なカバレッジ プロファイルを実現するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。