Rumah pembangunan bahagian belakang Golang Bincangkan penggunaan Mock di Golang

Bincangkan penggunaan Mock di Golang

Apr 23, 2023 pm 07:29 PM

Golang ialah bahasa pengaturcaraan taip statik sumber terbuka yang dialu-alukan dan disukai oleh semakin ramai pembangun. Semasa menulis kod ujian, selalunya perlu memproses data Mock. Dalam artikel ini, kita akan mendalami penggunaan Mock di Golang dan cara memproses data Mock dalam senario yang berbeza.

1. Mengapakah Ejekan diperlukan

Semasa proses ujian, kami sering menghadapi keperluan untuk menguji beberapa kod yang bergantung pada perkhidmatan pihak ketiga (seperti API, pangkalan data, baris gilir mesej, dll.). Ini memerlukan kami menggunakan teknologi Mocking untuk mensimulasikan hasil tindak balas perkhidmatan bergantung ini untuk memastikan kod ujian boleh dijalankan secara bebas dan pantas.

Selain itu, Mocking juga boleh digunakan untuk menguji keadaan sempadan kod (seperti situasi luar biasa, seperti data input tidak memenuhi keperluan, dll.) untuk meningkatkan keteguhan dan kebolehpercayaan kod.

2. Alat mengejek di Golang

Terdapat banyak alatan Mengejek untuk dipilih di Golang Antara alat yang lebih popular ialah:

  1. beri keterangan: dengan syarat Mengejek. dan fungsi penegasan, sangat mudah digunakan. Ia boleh digunakan untuk mensimulasikan sumber dan output data biasa seperti pangkalan data, permintaan HTTP dan perkhidmatan lain.
  2. ejekan: Secara relatifnya, alat ini lebih ringan. Ia boleh menjana kod Mock dengan cepat dan tepat, serta menyokong fungsi Mengejek masa jalan. Selain itu, ejekan menyokong keluaran templat apabila menjana kod Mock, yang boleh memberikan pengguna lebih banyak pilihan yang boleh disesuaikan.
  3. ejekan/ejekan: Berbanding dengan ejekan di atas, alat ini lebih tertumpu kepada keperluan pembangun bahasa Go. Ia menyediakan API yang lebih fleksibel yang membolehkan kebolehujian kod. Selain daripada menyokong kaedah antara muka olok-olok, Olok-olok juga boleh mengejek kebergantungan luar yang tidak mengganggu.

3. Gunakan testimoni untuk Mengejek

Di bawah ini kami akan menggunakan testimoni sebagai alat Mengejek dan menggunakan contoh untuk menunjukkan cara menggunakan teknologi Mengejek untuk menguji kod.

Kami menganggap bahawa fungsi berikut bergantung pada API HTTP luaran untuk mendapatkan data:

func getOrderDetail(orderID int) (OrderDetail, error){
    resp, err := http.Get("https://api.example.com/order/"+strconv.Itoa(orderID))
    if err != nil {
        return nil, err
    }
    defer resp.Body.Close()
    
    if resp.StatusCode != http.StatusOK {
        return nil, fmt.Errorf("getOrderDetail API returns error status code: %d", resp.StatusCode)
    }

    var orderDetail OrderDetail
    return orderDetail, json.NewDecoder(resp.Body).Decode(&orderDetail)
}
Salin selepas log masuk

Untuk menguji fungsi ini, kami perlu mengejek permintaan HTTP. testimoni menyediakan dua kaedah, MockHTTPServer dan RoundTripper, untuk melaksanakan permintaan HTTP yang mengejek.

Pertama, mari kita lihat cara menggunakan MockHTTPServer:

func TestGetOrderDetail(t *testing.T) {
    // 创建一个mock server
    server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        // 按照需要返回数据
        if r.URL.Path == "/order/123" {
            fmt.Fprintln(w, "{\"orderID\":123,\"createDate\":\"2021-01-01\"}")
        } else {
            http.Error(w, "not found", http.StatusNotFound)
        }
    }))
    defer server.Close()

    // 将http client的请求地址指向mock server
    oldClient := http.DefaultClient
    http.DefaultClient = server.Client()
    defer func() { http.DefaultClient = oldClient }()

    // 调用 getOrderDetail() 函数
    orderDetail, err := getOrderDetail(123)

    // 对 getOrderDetail() 的返回结果进行断言
    assert.Nil(t, err)
    assert.Equal(t, 123, orderDetail.OrderID) // 假设OrderDetail中包含了字段 OrderID

    // 按照需要进行其他断言
}
Salin selepas log masuk

Dalam contoh ini, kami menggunakan kaedah httptest.NewServer() untuk mencipta pelayan olok-olok, dan kemudian dalam handlerFunc() Simulasi mengembalikan tindak balas dan kod status permintaan HTTP.

Seterusnya, kami menghalakan http.DefaultClient ke pelayan olok-olok supaya apabila getOrderDetail() dipanggil semasa ujian, ia boleh menghantar permintaan ke pelayan olok-olok.

Akhir sekali, kami menggunakan kaedah penegasan testimoni untuk menyemak keputusan yang dikembalikan untuk memastikan ketepatan fungsi.

Selain MockHTTPServer, beri keterangan juga menyediakan kaedah RoundTripper untuk mengejek permintaan HTTP, yang menyediakan cara yang lebih fleksibel dan boleh dikawal untuk mensimulasikan permintaan HTTP. Pengguna boleh menyesuaikan pelaksanaan RoundTripper untuk beralih kepada sumber data olok-olok pada bila-bila masa untuk mengawal proses ujian dengan lebih baik. Pembaca boleh merujuk kepada dokumentasi rasmi memberi keterangan untuk mengetahui lebih lanjut tentang penggunaan kaedah ini.

4. Gunakan ejekan untuk Mengejek

Selain memberi keterangan, kita juga boleh menggunakan ejekan untuk mengejek. Olok-olok adalah berdasarkan pustaka olok-olok terbina dalam bahasa tersebut (http://golang.org/pkg/mock/) dan menyediakan alat penjanaan kod yang boleh menjana rangka kerja untuk kod Mock boleh diguna semula. Olok-olok menyokong penjanaan antara muka dan kod olok-olok pergantungan luaran Kami akan memperkenalkan mod antara muka Mengejek sebagai contoh di bawah.

Pertama, kita perlu memasang alat penjanaan ejekan:

go get github.com/vektra/mockery/v2/.../
Salin selepas log masuk

Seterusnya, kami mentakrifkan antara muka dan menambah kaedah padanya:

type OrderDetailFetcher interface {
    FetchOrderDetail(orderID int) (OrderDetail, error)
}
Salin selepas log masuk

Kemudian, dalam Dalam direktori akar projek, laksanakan arahan berikut untuk menjana kod Mock:

mockery --name OrderDetailFetcher
Salin selepas log masuk
Salin selepas log masuk

Ini akan menjana fail secara automatik bernama "mock_orderdetailfetcher.go", yang sudah mengandungi kod Mock yang dijana secara automatik. Kami boleh menggunakan kod Mock ini dalam mana-mana kod untuk melaksanakan data Mock antara muka dan menyelesaikan tugas ujian.

Akhir sekali, kami memberikan contoh khusus untuk menunjukkan cara menggunakan ejekan untuk menghasilkan kod Mengejek:

type OrderDetail struct {
    OrderID     int
    CreateDate  string
}

type OrderDetailFetcher interface {
    FetchOrderDetail(orderID int) (OrderDetail, error)
}

func GetOrderDetail(fetcher OrderDetailFetcher, orderID int) (OrderDetail, error) {
    orderDetail, err := fetcher.FetchOrderDetail(orderID)
    if err != nil {
        return OrderDetail{}, err
    }

    return orderDetail, nil
}
Salin selepas log masuk

Dalam contoh ini, kami mentakrifkan antara muka bernama "OrderDetailFetcher" , dan melaksanakan GetOrderDetail () fungsi, yang memerlukan penggunaan kaedah FetchOrderDetail() dalam antara muka OrderDetailFetcher untuk mendapatkan butiran pesanan. Kita boleh menggunakan perintah mockery untuk menjana kod Mock secara automatik untuk kaedah FetchOrderDetail():

mockery --name OrderDetailFetcher
Salin selepas log masuk
Salin selepas log masuk

Arahan ini akan menjana fail bernama "mock_orderdetailfetcher.go" dalam direktori semasa, yang mengandungi yang dijana secara automatik Kod olok-olok. Kami hanya perlu menggabungkan kod Mock dengan kod ujian kami untuk menyelesaikan tugas ujian berfungsi.

func TestGetOrderDetail(t *testing.T) {
    orderDetail := OrderDetail{OrderID: 123, CreateDate: "2021-01-01"}

    // 创建一个mock对象
    mockOrderDetailFetcher := &mocks.OrderDetailFetcher{}

    // 设定mock对象的mock调用及对应的返回结果
    mockOrderDetailFetcher.On("FetchOrderDetail", 123).Return(orderDetail, nil)

    // 调用GetOrderDetail()函数
    result, err := GetOrderDetail(mockOrderDetailFetcher, 123)

    // 校验返回结果及错误码
    assert.Nil(t, err)
    assert.Equal(t, orderDetail, result)
}
Salin selepas log masuk

Dalam contoh ini, kami mentakrifkan objek mockOrderDetailFetcher dan menggunakan kaedah On() dalam perpustakaan Mock untuk menentukan peraturan panggilan khusus dan hasil yang sepadan untuk kaedah FetchOrderDetail()nya— —Return orderDetail object if orderID ialah 123. Apabila mendapat FetchOrderDetail(123) mockOrderDetailFetcher, kod ujian akan terus mengembalikan objek orderDetail yang diprakonfigurasikan. Akhir sekali, kami menggunakan kaedah penegasan testimoni untuk mengesahkan keputusan.

Ringkasan

Dalam artikel ini, kami memperkenalkan pengetahuan berkaitan Mocking in Golang dan alatan Mocking biasa, serta cara menggunakan alat testimoni dan ejekan untuk melaksanakan operasi Mocking dan melengkapkan ujian Mock bagi fungsi sasaran. Melalui aplikasi teknologi Mocking yang munasabah dan betul, kami boleh meningkatkan kebolehbacaan, keteguhan, kebolehpercayaan dan aspek lain kod. Pada masa yang sama, Mocking juga boleh membantu kami mencari dan menyelesaikan masalah yang mungkin berlaku dengan cepat dalam pelbagai kod, dan meningkatkan liputan dan ketepatan kod ujian.

Atas ialah kandungan terperinci Bincangkan penggunaan Mock di 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)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
4 minggu 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)

Apakah kelemahan debian openssl Apakah kelemahan debian openssl Apr 02, 2025 am 07:30 AM

OpenSSL, sebagai perpustakaan sumber terbuka yang digunakan secara meluas dalam komunikasi yang selamat, menyediakan algoritma penyulitan, kunci dan fungsi pengurusan sijil. Walau bagaimanapun, terdapat beberapa kelemahan keselamatan yang diketahui dalam versi sejarahnya, yang sebahagiannya sangat berbahaya. Artikel ini akan memberi tumpuan kepada kelemahan umum dan langkah -langkah tindak balas untuk OpenSSL dalam sistem Debian. Debianopenssl yang dikenal pasti: OpenSSL telah mengalami beberapa kelemahan yang serius, seperti: Kerentanan Pendarahan Jantung (CVE-2014-0160): Kelemahan ini mempengaruhi OpenSSL 1.0.1 hingga 1.0.1f dan 1.0.2 hingga 1.0.2 versi beta. Penyerang boleh menggunakan kelemahan ini untuk maklumat sensitif baca yang tidak dibenarkan di pelayan, termasuk kunci penyulitan, dll.

Bagaimana anda menggunakan alat PPROF untuk menganalisis prestasi GO? Bagaimana anda menggunakan alat PPROF untuk menganalisis prestasi GO? Mar 21, 2025 pm 06:37 PM

Artikel ini menerangkan cara menggunakan alat PPROF untuk menganalisis prestasi GO, termasuk membolehkan profil, mengumpul data, dan mengenal pasti kesesakan biasa seperti CPU dan isu memori.

Bagaimana anda menulis ujian unit di GO? Bagaimana anda menulis ujian unit di GO? Mar 21, 2025 pm 06:34 PM

Artikel ini membincangkan ujian unit menulis di GO, meliputi amalan terbaik, teknik mengejek, dan alat untuk pengurusan ujian yang cekap.

Perpustakaan apa yang digunakan untuk operasi nombor terapung di GO? Perpustakaan apa yang digunakan untuk operasi nombor terapung di GO? Apr 02, 2025 pm 02:06 PM

Perpustakaan yang digunakan untuk operasi nombor terapung dalam bahasa Go memperkenalkan cara memastikan ketepatannya ...

Apakah masalah dengan thread giliran di crawler colly go? Apakah masalah dengan thread giliran di crawler colly go? Apr 02, 2025 pm 02:09 PM

Masalah Threading Giliran di GO Crawler Colly meneroka masalah menggunakan Perpustakaan Colly Crawler dalam bahasa Go, pemaju sering menghadapi masalah dengan benang dan permintaan beratur. � ...

Berubah dari front-end ke pembangunan back-end, adakah lebih menjanjikan untuk belajar Java atau Golang? Berubah dari front-end ke pembangunan back-end, adakah lebih menjanjikan untuk belajar Java atau Golang? Apr 02, 2025 am 09:12 AM

Laluan Pembelajaran Backend: Perjalanan Eksplorasi dari Front-End ke Back-End sebagai pemula back-end yang berubah dari pembangunan front-end, anda sudah mempunyai asas Nodejs, ...

Bagaimana anda menentukan kebergantungan dalam fail go.mod anda? Bagaimana anda menentukan kebergantungan dalam fail go.mod anda? Mar 27, 2025 pm 07:14 PM

Artikel ini membincangkan menguruskan kebergantungan modul Go melalui Go.Mod, meliputi spesifikasi, kemas kini, dan resolusi konflik. Ia menekankan amalan terbaik seperti versi semantik dan kemas kini biasa.

Bagaimana anda menggunakan ujian yang didorong oleh jadual di GO? Bagaimana anda menggunakan ujian yang didorong oleh jadual di GO? Mar 21, 2025 pm 06:35 PM

Artikel ini membincangkan menggunakan ujian yang didorong oleh jadual di GO, satu kaedah yang menggunakan jadual kes ujian untuk menguji fungsi dengan pelbagai input dan hasil. Ia menyoroti faedah seperti kebolehbacaan yang lebih baik, penurunan duplikasi, skalabiliti, konsistensi, dan a

See all articles