Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk menguji fungsi Golang untuk memastikan kebolehpercayaannya?

Bagaimana untuk menguji fungsi Golang untuk memastikan kebolehpercayaannya?

王林
王林asal
2024-04-12 18:39:01698semak imbas

Pengujian kebolehpercayaan fungsi Golang melibatkan ujian unit, menggunakan pakej ujian untuk menguji satu fungsi secara berasingan, menggunakan jadual ujian untuk menguji berbilang input, mencipta ujian integrasi tunggal, menggunakan alat; seperti Perpustakaan github seperti .com/ory/dockertest menguji tingkah laku penyepaduan kod anda.

Bagaimana untuk menguji fungsi Golang untuk memastikan kebolehpercayaannya?

Cara menguji fungsi Golang untuk memastikan kebolehpercayaannya

Menulis fungsi yang boleh dipercayai di Golang adalah penting untuk membina aplikasi yang mantap dan stabil. Ujian adalah perlu untuk memastikan fungsi berfungsi seperti yang diharapkan. Artikel ini akan memperkenalkan cara menguji fungsi Golang dan menyediakan kes praktikal.

Ujian Unit

Ujian unit ialah teknik untuk menguji satu fungsi atau modul secara berasingan. Di Golang, gunakan pakej ujian untuk ujian unit: testing 包进行单元测试:

package mypkg

import "testing"

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

    for _, tt := range tests {
        actual := Add(tt.a, tt.b)
        if actual != tt.expected {
            t.Errorf("Add(%d, %d) = %d, expected %d", tt.a, tt.b, actual, tt.expected)
        }
    }
}

表驱动的测试

表驱动的测试允许我们在使用相同测试函数的同时测试多个输入。这意味着我们可以为每个测试用例创建单独的测试表:

func TestAddTableDriven(t *testing.T) {
    tests := []struct {
        a, b, expected int
    }{
        {1, 2, 3},
        {3, 4, 7},
    }

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

子测试

子测试允许在单个测试函数中创建多个子测试。这有助于组织测试并提供更多详细的错误消息:

func TestError(t *testing.T) {
    t.Run("case 1", func(t *testing.T) {
        err := Error(0)
        if err != nil {
            t.Errorf("Error(0) = %v", err)
        }
    })

    t.Run("case 2", func(t *testing.T) {
        err := Error(1)
        if err == nil {
            t.Error("Expected error for Error(1)")
        }
    })
}

集成测试

集成测试测试代码的集成行为,包括涉及多个函数的交互。在 Golang 中,可以使用 github.com/ory/dockertest

package mypkg_test

import (
    "context"
    "fmt"
    "io"
    "testing"

    "github.com/ory/dockertest"
)

func TestIntegration(t *testing.T) {
    // 创建一个容器,在其中运行我们的代码
    container, err := dockertest.NewContainer("my-org/my-image", "latest", nil)
    if err != nil {
        t.Fatal(err)
    }

    // 在容器中执行我们的代码
    output, err := container.Run(context.Background())
    if err != nil {
        t.Fatal(err)
    }

    // 检查输出以验证行为
    if _, err := io.WriteString(output, "Hello World\n"); err != nil {
        t.Fatal(err)
    }
    fmt.Fprintln(output, "Done")

    // 等待容器退出
    if err := container.Wait(); err != nil {
        t.Fatal(err)
    }
}

🎜Ujian dipacu jadual🎜🎜🎜Ujian dipacu jadual membolehkan kami menguji berbilang input serentak sambil menggunakan fungsi ujian yang sama. Ini bermakna kita boleh mencipta jadual ujian berasingan untuk setiap kes ujian: 🎜rrreee🎜🎜Subtests🎜🎜🎜Subtests membenarkan penciptaan berbilang subtest dalam satu fungsi ujian. Ini membantu mengatur ujian anda dan memberikan mesej ralat yang lebih terperinci: 🎜rrreee🎜🎜Ujian Penyepaduan🎜🎜🎜Ujian integrasi menguji kelakuan bersepadu kod anda, termasuk interaksi yang melibatkan berbilang fungsi. Di Golang, anda boleh menggunakan perpustakaan seperti github.com/ory/dockertest untuk ujian penyepaduan: 🎜rrreee

Atas ialah kandungan terperinci Bagaimana untuk menguji fungsi Golang untuk memastikan kebolehpercayaannya?. 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