Rumah pembangunan bahagian belakang Golang Isu pengasingan dalam ujian fungsi Golang

Isu pengasingan dalam ujian fungsi Golang

Apr 17, 2024 am 09:06 AM
git golang ujian fungsi

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
}
Salin selepas log masuk
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)
    }
  })
}
Salin selepas log masuk

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 {
  // ...
}
Salin selepas log masuk
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)
}
Salin selepas log masuk

在这个例子中,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)
}
Salin selepas log masuk

要测试此函数而不实际发送电子邮件,我们可以使用 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)
  }
}
Salin selepas log masuk
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 Laman Web ini
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

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Cara Menjalankan Projek H5 Cara Menjalankan Projek H5 Apr 06, 2025 pm 12:21 PM

Menjalankan projek H5 memerlukan langkah -langkah berikut: memasang alat yang diperlukan seperti pelayan web, node.js, alat pembangunan, dan lain -lain. Membina persekitaran pembangunan, membuat folder projek, memulakan projek, dan menulis kod. Mulakan pelayan pembangunan dan jalankan arahan menggunakan baris arahan. Pratonton projek dalam penyemak imbas anda dan masukkan URL Server Pembangunan. Menerbitkan projek, mengoptimumkan kod, menggunakan projek, dan menyediakan konfigurasi pelayan web.

GITEE PAGES PENYEDIAAN LAMAN WEB STATIC Gagal: Bagaimana menyelesaikan masalah dan menyelesaikan kesilapan fail tunggal 404? GITEE PAGES PENYEDIAAN LAMAN WEB STATIC Gagal: Bagaimana menyelesaikan masalah dan menyelesaikan kesilapan fail tunggal 404? Apr 04, 2025 pm 11:54 PM

Giteepages Statik Laman Web Penggunaan Gagal: 404 Penyelesaian Masalah dan Resolusi Ralat Semasa Menggunakan Gitee ...

Adakah pengeluaran halaman H5 memerlukan penyelenggaraan berterusan? Adakah pengeluaran halaman H5 memerlukan penyelenggaraan berterusan? Apr 05, 2025 pm 11:27 PM

Halaman H5 perlu dikekalkan secara berterusan, kerana faktor -faktor seperti kelemahan kod, keserasian pelayar, pengoptimuman prestasi, kemas kini keselamatan dan peningkatan pengalaman pengguna. Kaedah penyelenggaraan yang berkesan termasuk mewujudkan sistem ujian lengkap, menggunakan alat kawalan versi, kerap memantau prestasi halaman, mengumpul maklum balas pengguna dan merumuskan pelan penyelenggaraan.

Tujuan Golang: Membina sistem yang cekap dan berskala Tujuan Golang: Membina sistem yang cekap dan berskala Apr 09, 2025 pm 05:17 PM

Pergi bahasa berfungsi dengan baik dalam membina sistem yang cekap dan berskala. Kelebihannya termasuk: 1. Prestasi Tinggi: Disusun ke dalam Kod Mesin, Kelajuan Berjalan Cepat; 2. Pengaturcaraan serentak: Memudahkan multitasking melalui goroutine dan saluran; 3. Kesederhanaan: sintaks ringkas, mengurangkan kos pembelajaran dan penyelenggaraan; 4. Cross-Platform: Menyokong kompilasi silang platform, penggunaan mudah.

Bolehkah anda belajar bagaimana membuat halaman H5 sendiri? Bolehkah anda belajar bagaimana membuat halaman H5 sendiri? Apr 06, 2025 am 06:36 AM

Ia boleh dilaksanakan untuk pengeluaran halaman H5 belajar sendiri, tetapi ia bukan kejayaan yang cepat. Ia memerlukan menguasai HTML, CSS, dan JavaScript, yang melibatkan reka bentuk, pembangunan front-end, dan logik interaksi back-end. Amalan adalah kunci, dan belajar dengan melengkapkan tutorial, mengkaji semula bahan, dan mengambil bahagian dalam projek sumber terbuka. Pengoptimuman prestasi juga penting, memerlukan pengoptimuman imej, mengurangkan permintaan HTTP dan menggunakan rangka kerja yang sesuai. Jalan untuk belajar sendiri panjang dan memerlukan pembelajaran dan komunikasi yang berterusan.

Bagaimana dengan cepat membina halaman latar depan dalam projek Vite React menggunakan alat AI? Bagaimana dengan cepat membina halaman latar depan dalam projek Vite React menggunakan alat AI? Apr 04, 2025 pm 01:45 PM

Bagaimana dengan cepat membina halaman front-end dalam pembangunan back-end? Sebagai pemaju backend dengan tiga atau empat tahun pengalaman, dia telah menguasai asas JavaScript, CSS dan HTML ...

Cara Menggunakan Pagination Vue Cara Menggunakan Pagination Vue Apr 08, 2025 am 06:45 AM

Pagination adalah teknologi yang memisahkan set data besar ke dalam halaman kecil untuk meningkatkan prestasi dan pengalaman pengguna. Di VUE, anda boleh menggunakan kaedah terbina dalam berikut untuk paging: Kirakan jumlah halaman: TotalPages () Traversal Page Number: V-For Directive Untuk menetapkan halaman semasa: CurrentPage Dapatkan data halaman semasa: CurrentPagedata ()

Cara Melihat Keputusan Selepas Bootstrap diubahsuai Cara Melihat Keputusan Selepas Bootstrap diubahsuai Apr 07, 2025 am 10:03 AM

Langkah -langkah untuk melihat hasil bootstrap yang diubahsuai: Buka fail HTML secara langsung dalam penyemak imbas untuk memastikan bahawa fail bootstrap dirujuk dengan betul. Kosongkan cache penyemak imbas (CTRL Shift R). Jika anda menggunakan CDN, anda boleh mengubahsuai CSS secara langsung dalam alat pemaju untuk melihat kesannya dalam masa nyata. Jika anda mengubah suai kod sumber bootstrap, muat turun dan gantikan fail tempatan, atau pasang semula arahan binaan menggunakan alat binaan seperti Webpack.

See all articles