Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk menggunakan alat liputan dalam ujian unit Golang?

Bagaimana untuk menggunakan alat liputan dalam ujian unit Golang?

WBOY
WBOYasal
2024-06-02 15:55:01946semak imbas

Gunakan perintah go test -cover untuk mengukur liputan dalam ujian unit Go dan nyatakan pilihan -cover atau -coverprofile untuk menjana keputusan -covermode menetapkan mod liputan (tetapkan, kiraan atau atom). Kes praktikal menunjukkan cara menulis ujian dan menjana laporan liputan menggunakan fail konfigurasi liputan dan arahan penutup alat go.

如何在 Golang 单元测试中使用覆盖工具?

Cara menggunakan alat liputan untuk menguji liputan dalam ujian unit Golang

Alat liputan sangat penting dalam ujian unit kerana ia membantu anda mengenal pasti bahagian kod anda yang belum diuji. Ini penting untuk memastikan kualiti dan kebolehpercayaan kod anda. Di Golang, anda boleh menggunakan perintah go test -cover untuk mengukur liputan dalam ujian unit. go test -cover 命令来测量单元测试中的覆盖率。

安装覆盖工具

要在 Golang 中使用覆盖工具,您需要安装它。您可以使用以下命令进行安装:

go install golang.org/x/tools/cmd/cover

测量覆盖率

要测量单元测试的覆盖率,请使用 go test 命令并指定 -cover 标志。该标志随后可以接受以下值:

  • -cover:显示覆盖结果,包括未覆盖的行、文件和包。
  • -coverprofile=profile.out:将覆盖结果写入指定的文件中。这对于进一步分析或与其他工具一起使用很有用。
  • -covermode=mode:设置覆盖模式。可接受的值包括:

    • set:使用 set 模式报告覆盖情况。它将为每个被覆盖的代码行分配一个计数器,并在测试完成后生成报告。
    • count:使用 count 模式报告覆盖情况。它将为每个被覆盖的代码行分配一个 boolean 值,并在测试完成后生成报告。
    • atomic:使用原子计数模式报告覆盖情况。它将为每个被覆盖的代码行分配一个 int64 计数器,并在测试完成后生成报告。

实战案例

以下是一个演示如何测量 Golang 单元测试中覆盖率的简要示例:

main.go

package main

import (
    "fmt"
    "strconv"
)

// Add two numbers
func Add(a, b int) int {
    return a + b
}

// Convert a string to a number
func StrToInt(s string) int {
    n, err := strconv.Atoi(s)
    if err != nil {
        fmt.Println(err.Error())
        return 0
    }
    return n
}

main_test.go

package main

import (
    "testing"
)

func TestAdd(t *testing.T) {
    tests := []struct {
        a int
        b int
        want int
    }{
        {1, 2, 3},
        {0, 0, 0},
        {-1, -1, -2},
    }

    for _, tt := range tests {
        t.Run(fmt.Sprintf("TestAdd%d_%d", tt.a, tt.b), func(t *testing.T) {
            if got := Add(tt.a, tt.b); got != tt.want {
                t.Errorf("Add(%d, %d) = %d, want %d", tt.a, tt.b, got, tt.want)
            }
        })
    }
}

func TestStrToInt(t *testing.T) {
    tests := []struct {
        s string
        want int
    }{
        {"1", 1},
        {"0", 0},
        {"-1", -1},
    }

    for _, tt := range tests {
        t.Run(fmt.Sprintf("TestStrToInt%s", tt.s), func(t *testing.T) {
            if got := StrToInt(tt.s); got != tt.want {
                t.Errorf("StrToInt(%s) = %d, want %d", tt.s, got, tt.want)
            }
        })
    }
}

func TestCoverage(t *testing.T) {
    t.Run("Add", func(t *testing.T) {
        coverProfile := "add_coverage.out"
        args := []string{"-test.coverprofile=" + coverProfile, "-test.covermode=set"}
        cmd := exec.Command("go", "test", args...)
        if err := cmd.Run(); err != nil {
            t.Fatalf("Could not run coverage test: %v", err)
        }
    })

    t.Run("StrToInt", func(t *testing.T) {
        coverProfile := "str_int_coverage.out"
        args := []string{"-test.coverprofile=" + coverProfile, "-test.covermode=set"}
        cmd := exec.Command("go", "test", args...)
        if err := cmd.Run(); err != nil {
            t.Fatalf("Could not run coverage test: %v", err)
        }
    })
}

在命令行中执行以下命令以生成覆盖率报告:

go test -test.coverprofile=coverage.out

这将在 coverage.out 文件中创建一个覆盖率报告。您可以使用 go tool cover

Pasang alat perlindungan

🎜🎜Untuk menggunakan alat perlindungan di Golang, anda perlu memasangnya. Anda boleh memasangnya menggunakan arahan berikut: 🎜
go tool cover -html=coverage.out
🎜🎜Mengukur Liputan🎜🎜🎜Untuk mengukur liputan ujian unit, gunakan perintah go test dan nyatakan -cover bendera . Bendera ini kemudiannya boleh menerima nilai berikut: 🎜
  • 🎜-cover🎜: Memaparkan hasil liputan, termasuk baris, fail dan pakej yang tidak bertutup.
  • 🎜-coverprofile=profile.out🎜: Tulis hasil liputan ke fail yang ditentukan. Ini berguna untuk analisis lanjut atau digunakan dengan alat lain.
  • 🎜🎜-covermode=mode🎜: Tetapkan mod liputan. Nilai yang boleh diterima termasuk: 🎜
    • 🎜set🎜: Gunakan mod set untuk melaporkan liputan. Ia akan memberikan pembilang kepada setiap baris kod yang dilindungi dan menjana laporan selepas ujian selesai.
    • 🎜kira🎜: Gunakan mod kiraan untuk melaporkan liputan. Ia akan memberikan nilai boolean kepada setiap baris kod yang dilindungi dan menjana laporan selepas ujian selesai.
    • 🎜atomik🎜: Laporkan liputan menggunakan mod pengiraan atom. Ia akan menetapkan pembilang int64 kepada setiap baris kod yang dilindungi dan menjana laporan selepas ujian selesai.
🎜🎜Kes praktikal🎜🎜🎜Berikut ialah contoh ringkas yang menunjukkan cara mengukur liputan dalam ujian unit Golang: 🎜🎜🎜main.go🎜🎜rrreee🎜🎜 main_test .go🎜🎜rrreee🎜Laksanakan arahan berikut pada baris arahan untuk menjana laporan liputan: 🎜rrreee🎜Ini akan membuat laporan liputan dalam fail coverage.out. Anda boleh melihat laporan menggunakan perintah go tool cover: 🎜rrreee🎜Ini akan membuka laporan HTML dalam penyemak imbas anda yang menunjukkan baris dan fail yang tidak dilindungi. 🎜

Atas ialah kandungan terperinci Bagaimana untuk menggunakan alat liputan dalam ujian unit Golang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn