Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Isu pengasingan dalam ujian fungsi Golang

Isu pengasingan dalam ujian fungsi Golang

王林
王林asal
2024-04-17 09:06:01704semak imbas

Dalam ujian fungsi Golang, pengasingan adalah penting untuk mengelakkan gangguan antara ujian yang berbeza. Selesaikan masalah pengasingan dengan mengasingkan pembolehubah global menggunakan subjadual atau mensimulasikan kebergantungan luaran menggunakan objek olok-olok. Langkah-langkah khusus ialah: 1. Subjadual: Cipta kejadian pembolehubah bebas untuk mengelakkan gangguan;

Golang 函数测试中的隔离问题

Isu pengasingan dalam ujian fungsi Golang

Memahami isu

Dalam ujian fungsi Golang, pengasingan merupakan konsep yang sangat penting. Tanpa pengasingan, ujian boleh mengganggu satu sama lain, membawa kepada keputusan yang tidak boleh dipercayai.

Sumber masalah: Pembolehubah dan keadaan global

Pembolehubah dan keadaan global adalah punca biasa isu pengasingan. Jika berbilang ujian beroperasi pada pembolehubah global yang sama, ujian itu mungkin menimpa satu sama lain, menyebabkan tingkah laku yang tidak dijangka.

Penyelesaian: Gunakan subjadual dan olok-olok

Untuk menyelesaikan masalah pengasingan, terdapat dua strategi biasa: jadual kecil dan olok-olok.

Subjadual

Subjadual mengasingkan pembolehubah global dengan mencipta contoh pembolehubah mereka sendiri untuk setiap ujian. Ini boleh dicapai dengan:

package mypkg

// Global variable (not thread-safe)
var counter int

func Increment() int {
  counter++
  return counter
}
package mypkg_test

import (
  "testing"
)

func TestIncrement(t *testing.T) {
  // Create a sub-table for each test case
  t.Run("first call", func(t *testing.T) {
    // Initialize a new table-local counter
    counter := 0
    // Call the Increment function and assert the result
    result := mypkg.Increment()
    if result != 1 {
      t.Errorf("Expected 1, got %d", result)
    }
  })

  t.Run("second call", func(t *testing.T) {
    // Initialize a new table-local counter
    counter := 0
    // Call the Increment function and assert the result
    result := mypkg.Increment()
    if result != 2 {
      t.Errorf("Expected 2, got %d", result)
    }
  })
}

Dalam contoh ini, setiap kes ujian mempunyai contoh pembolehubah counternya sendiri, dengan itu mengelakkan gangguan antara mereka. counter 变量实例,从而避免了它们之间的干扰。

mock

mock 对象是模拟函数的替身,可以用来隔离外部依赖项。这对于测试依赖于外部服务或数据库的函数非常有用。

package mypkg

type Database interface {
  // ...
}
package mypkg_test

import (
  "testing"

  "github.com/stretchr/testify/mock"
)

type DatabaseMock struct {
  mock.Mock
}

// ...

func TestMyFunction(t *testing.T) {
  // Create a mock database
  mockDB := &DatabaseMock{}

  // Setup mock expectations
  mockDB.On("Query", ...).Return(...)

  // Call the function under test with the mock database
  mypkg.MyFunction(mockDB)

  // Assert that the mock expectations were met
  mockDB.AssertExpectations(t)
}

在这个例子中,DatabaseMockDatabase 接口的替身,允许我们模拟其行为以隔离对实际数据库的依赖。

实战案例

考虑下面的函数,它发送电子邮件:

package email

import (
  "github.com/go-mail/mail"
)

func SendEmail(smtpHost, smtpPort, senderEmail, senderPassword, recipientEmail, subject, body string) error {
  mail := mail.NewMessage()

  // ...

  smtpDialer := mail.NewDialer(smtpHost, smtpPort, senderEmail, senderPassword)
  return smtpDialer.DialAndSend(mail)
}

要测试此函数而不实际发送电子邮件,我们可以使用 mock 对象来模拟 mail.Dialer

🎜olok-olok🎜🎜🎜Ojek olok-olok ialah stand-in untuk fungsi olok-olok dan boleh digunakan untuk mengasingkan kebergantungan luaran. Ini berguna untuk menguji fungsi yang bergantung pada perkhidmatan luaran atau pangkalan data. 🎜
package email_test

import (
  "testing"

  email "github.com/my-username/my-email-package"
  "github.com/stretchr/testify/mock"
)

type DialerMock struct {
  mock.Mock
}

func (d *DialerMock) DialAndSend(mail *mail.Message) error {
  d.Called(mail)
  return nil
}

func TestSendEmail(t *testing.T) {
  // Create a mock dialer
  mockDialer := &DialerMock{}

  // Setup mock expectations
  mockDialer.On("DialAndSend", ...).Return(nil)

  // Call the function under test with the mock dialer
  result := email.SendEmail("", "", "", "", "", "", "")

  // Assert that mock expectations were met
  mockDialer.AssertExpectations(t)

  // Assert the result of the function under test
  if result != nil {
    t.Errorf("Expected nil error but got %v", result)
  }
}
rrreee🎜Dalam contoh ini, DatabaseMock ialah stand-in untuk antara muka Pangkalan Data, yang membolehkan kami mensimulasikan tingkah lakunya untuk mengasingkan pergantungan pada pangkalan data sebenar. 🎜🎜🎜Contoh Praktikal🎜🎜🎜Pertimbangkan fungsi berikut, yang menghantar e-mel: 🎜rrreee🎜Untuk menguji fungsi ini tanpa benar-benar menghantar e-mel, kita boleh menggunakan objek olok-olok untuk mensimulasikan mel.Dialer: 🎜rreeee

Atas ialah kandungan terperinci Isu pengasingan dalam ujian fungsi 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