ホームページ >バックエンド開発 >Golang >## 機能テストで完全なカバレッジを達成するには: コードと実行の間のギャップを埋めるには?

## 機能テストで完全なカバレッジを達成するには: コードと実行の間のギャップを埋めるには?

Susan Sarandon
Susan Sarandonオリジナル
2024-10-25 18:43:02238ブラウズ

## How to Achieve Complete Coverage in Functional Tests: Bridging the Gap Between Code and Execution?

機能テストで完全なカバレッジを表示する方法

問題:

機能テストがコンパイル済みで実行されるバイナリ コード。未発見の死角の余地を残します。

コード スニペット:

<code class="go">package main

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

var exitCode int

func Test_main(t *testing.T) {
    go main()
    exitCode = <-exitCh
}

func TestMain(m *testing.M) {
    m.Run()
    // can exit because cover profile is already written
    os.Exit(exitCode)
}

func main() {
    rand.Seed(time.Now().UTC().UnixNano())
    for {
        i := rand.Int()
        fmt.Println(i)
        if i%3 == 0 {
            os.Exit(0)
        }
        if i%2 == 0 {
            os.Exit(1)
        }
        time.Sleep(time.Second)
    }
}</code>

解決策:

1.ビルドタグを使用してメイン関数を除外:

<code class="go">//+build !test

package main

func main() {
    os.Exit(doFunc());
}</code>

タグを使用してビルド:

go test -c -coverpkg=. -o example -tags test

2.機能をテスト可能なコードに抽出:

機能を他のクラスに抽出してメイン関数をテストすることを避けます。 func TestMain を使用して、メイン スレッドでのコードの実行を制御します。

3.モッキングの使用:

依存関係のモックを作成して、特定のコード パスを分離し、テスト容易性を向上させます。

4.カバレッジのタイムアウト:

テストにタイムアウトを追加して、アプリケーションが終了する前にカバレッジ ツールにプロファイルを書き込む時間を与えます。

タイムアウトの例:

<code class="go">func exit(code int) {
    exitCh <- code
    time.Sleep(1 * time.Second) // Allow time for coverage data to be written
    os.Exit(code)
}</code>

利点:

  • 機能テスト カバレッジの盲点が明らかに
  • 本番コードのテスト容易性と保守性の向上
  • カバレッジレポートの正確性と完全性に対する自信

以上が## 機能テストで完全なカバレッジを達成するには: コードと実行の間のギャップを埋めるには?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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