Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bincangkan penggunaan Mock di Golang

Bincangkan penggunaan Mock di Golang

PHPz
PHPzasal
2023-04-23 19:29:061549semak imbas

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