cari
Rumahpembangunan bahagian belakangGolangBincangkan penggunaan Mock di Golang

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)
}

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

    // 按照需要进行其他断言
}

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/.../

Seterusnya, kami mentakrifkan antara muka dan menambah kaedah padanya:

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

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

mockery --name OrderDetailFetcher

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
}

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

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)
}

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
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
Golang dan Python: Memahami PerbezaanGolang dan Python: Memahami PerbezaanApr 18, 2025 am 12:21 AM

Perbezaan utama antara Golang dan Python adalah model konvensional, sistem jenis, prestasi dan kelajuan pelaksanaan. 1. Golang menggunakan model CSP, yang sesuai untuk tugas serentak yang tinggi; Python bergantung pada multi-threading dan gil, yang sesuai untuk tugas I/O-intensif. 2. Golang adalah jenis statik, dan Python adalah jenis dinamik. 3. Golang mengumpulkan kelajuan pelaksanaan bahasa adalah cepat, dan pembangunan bahasa yang ditafsirkan Python adalah pantas.

Golang vs C: Menilai perbezaan kelajuanGolang vs C: Menilai perbezaan kelajuanApr 18, 2025 am 12:20 AM

Golang biasanya lebih perlahan daripada C, tetapi Golang mempunyai lebih banyak kelebihan dalam pengaturcaraan serentak dan kecekapan pembangunan: 1) Koleksi sampah Golang dan model konkurensi menjadikannya berfungsi dengan baik dalam senario konvensyen yang tinggi; 2) C memperoleh prestasi yang lebih tinggi melalui pengurusan memori manual dan pengoptimuman perkakasan, tetapi mempunyai kerumitan pembangunan yang lebih tinggi.

Golang: bahasa utama untuk pengkomputeran awan dan devOpsGolang: bahasa utama untuk pengkomputeran awan dan devOpsApr 18, 2025 am 12:18 AM

Golang digunakan secara meluas dalam pengkomputeran awan dan devOps, dan kelebihannya terletak pada kesederhanaan, kecekapan dan keupayaan pengaturcaraan serentak. 1) Dalam pengkomputeran awan, Golang dengan cekap mengendalikan permintaan serentak melalui mekanisme goroutine dan saluran. 2) Di DevOps, kompilasi cepat Golang dan ciri-ciri silang platform menjadikannya pilihan pertama untuk alat automasi.

Golang dan C: Memahami kecekapan pelaksanaanGolang dan C: Memahami kecekapan pelaksanaanApr 18, 2025 am 12:16 AM

Golang dan C masing -masing mempunyai kelebihan sendiri dalam kecekapan prestasi. 1) Golang meningkatkan kecekapan melalui pengumpulan goroutine dan sampah, tetapi boleh memperkenalkan masa jeda. 2) C menyedari prestasi tinggi melalui pengurusan memori manual dan pengoptimuman, tetapi pemaju perlu menangani kebocoran memori dan isu -isu lain. Apabila memilih, anda perlu mempertimbangkan keperluan projek dan timbunan teknologi pasukan.

Golang vs Python: Konvensyen dan MultithreadingGolang vs Python: Konvensyen dan MultithreadingApr 17, 2025 am 12:20 AM

Golang lebih sesuai untuk tugas -tugas kesesuaian yang tinggi, sementara Python mempunyai lebih banyak kelebihan dalam fleksibiliti. 1.Golang dengan cekap mengendalikan kesesuaian melalui goroutine dan saluran. 2. Pilihannya harus berdasarkan keperluan khusus.

Golang dan C: Perdagangan dalam prestasiGolang dan C: Perdagangan dalam prestasiApr 17, 2025 am 12:18 AM

Perbezaan prestasi antara Golang dan C terutamanya ditunjukkan dalam pengurusan ingatan, pengoptimuman kompilasi dan kecekapan runtime. 1) Mekanisme pengumpulan sampah Golang adalah mudah tetapi boleh menjejaskan prestasi, 2) Pengurusan memori manual C dan pengoptimuman pengkompil lebih cekap dalam pengkomputeran rekursif.

Golang vs Python: Aplikasi dan Kes GunakanGolang vs Python: Aplikasi dan Kes GunakanApr 17, 2025 am 12:17 AM

PilihgolangforhighperformanceandConcurrency, IdealForBackEndServicesandnetworkprogramming; SelectPythonForrapidDevelopment, datascience, danMachinelearningDuetoitSversativilityAndextiveLibraries.

Golang vs Python: Perbezaan dan Persamaan UtamaGolang vs Python: Perbezaan dan Persamaan UtamaApr 17, 2025 am 12:15 AM

Golang dan Python masing -masing mempunyai kelebihan mereka sendiri: Golang sesuai untuk prestasi tinggi dan pengaturcaraan serentak, sementara Python sesuai untuk sains data dan pembangunan web. Golang terkenal dengan model keserasiannya dan prestasi yang cekap, sementara Python terkenal dengan sintaks ringkas dan ekosistem perpustakaan yang kaya.

See all articles

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)
1 bulan yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
1 bulan yang laluBy尊渡假赌尊渡假赌尊渡假赌
Akan R.E.P.O. Ada Crossplay?
1 bulan yang laluBy尊渡假赌尊渡假赌尊渡假赌

Alat panas

Versi Mac WebStorm

Versi Mac WebStorm

Alat pembangunan JavaScript yang berguna

SublimeText3 Linux versi baharu

SublimeText3 Linux versi baharu

SublimeText3 Linux versi terkini

Muat turun versi mac editor Atom

Muat turun versi mac editor Atom

Editor sumber terbuka yang paling popular

SublimeText3 versi Inggeris

SublimeText3 versi Inggeris

Disyorkan: Versi Win, menyokong gesaan kod!

Penyesuai Pelayan SAP NetWeaver untuk Eclipse

Penyesuai Pelayan SAP NetWeaver untuk Eclipse

Integrasikan Eclipse dengan pelayan aplikasi SAP NetWeaver.