Pengganti Pengujian: Mock dan Stub
Interface untuk kemudahan pengujian dan injeksi dependensi
Pengganti Pengujian: Mock dan Stub adalah pelajaran Go Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Go Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Go Academy mencakup 4 pelajaran total.
Ikhtisar objek pengganti pengujian
Objek pengganti pengujian menggantikan dependensi nyata dalam pengujian. Jenisnya: pengganti tetap (mengembalikan respons yang telah ditentukan), tiruan (memverifikasi interaksi), pencatat (mencatat pemanggilan), palsu (implementasi yang berfungsi di memori).
Antarmuka memungkinkan objek pengganti pengujian
Rancang fungsi agar menerima antarmuka, bukan tipe konkret. Dalam produksi, masukkan implementasi nyata; dalam pengujian, masukkan objek pengganti pengujian.
type UserStore interface {
FindByID(id int) (*User, error)
}
func GetUser(store UserStore, id int) (*User, error) {
return store.FindByID(id)
}Pengganti tetap manual
Pengganti tetap adalah struktur sederhana yang mengimplementasikan antarmuka dan mengembalikan nilai yang telah dikonfigurasi sebelumnya:
type stubStore struct{ user *User; err error }
func (s *stubStore) FindByID(_ int) (*User, error) { return s.user, s.err }
// In test:
store := &stubStore{user: &User{Name: "Alice"}}
result, _ := GetUser(store, 1)Tiruan manual
Tiruan mencatat pemanggilan dan memverifikasinya:
type mockStore struct {
called bool
gotID int
user *User
}
func (m *mockStore) FindByID(id int) (*User, error) {
m.called = true; m.gotID = id
return m.user, nil
}
// Assert: if !mock.called { t.Error(...) }testify/mock
Paket testify/mock menghasilkan atau menuliskan objek tiruan dengan ekspektasi pemanggilan dan konfigurasi nilai pengembalian:
type MockStore struct { mock.Mock }
func (m *MockStore) FindByID(id int) (*User, error) {
args := m.Called(id)
return args.Get(0).(*User), args.Error(1)
}
// In test:
m := new(MockStore)
m.On("FindByID", 1).Return(&User{}, nil)
m.AssertExpectations(t)gomock
go.uber.org/mock/gomock (sebelumnya golang/mock) menghasilkan tiruan dari antarmuka. Gunakan CLI mockgen untuk membuatnya; gunakan EXPECT() untuk menetapkan ekspektasi.
Palsu
Implementasi palsu adalah implementasi yang berfungsi di memori. Misalnya, penyimpanan pengguna dalam memori yang menyimpan pengguna di sebuah peta. Implementasi palsu lebih berat untuk ditulis, tetapi lebih realistis dan tidak serapuh tiruan.
type fakeStore struct{ users map[int]*User }
func (f *fakeStore) FindByID(id int) (*User, error) {
u, ok := f.users[id]
if !ok { return nil, ErrNotFound }
return u, nil
}httptest untuk klien HTTP
net/http/httptest menyediakan server dan pencatat pengujian HTTP dalam proses—objek palsu standar untuk dependensi berbasis HTTP.
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
json.NewEncoder(w).Encode(User{Name: "Alice"})
}))
defer ts.Close()Kapan menggunakan setiap objek pengganti
Pengganti tetap: respons tetap sederhana. Tiruan: memverifikasi jumlah pemanggilan atau argumen. Palsu: perilaku kompleks. Hindari terlalu banyak tiruan—implementasi palsu dan komponen nyata dalam pengujian integrasi lebih andal.
Menghindari pengujian rapuh
Tiruan yang menegaskan urutan pemanggilan atau nilai argumen secara persis menjadi rapuh ketika implementasi berkembang. Jika memungkinkan, pilih pengganti tetap dengan penegasan keluaran atau implementasi palsu.
Menemukan antarmuka
Ekstrak antarmuka setelah mengidentifikasi permukaan tipe konkret yang digunakan oleh pemanggil (ISP). Go mendukung pemenuhan antarmuka secara implisit—tidak diperlukan modifikasi pada tipe konkret.
Pemeriksaan Singkat
Apa perbedaan utama antara pengganti tetap dan tiruan?
Ringkasan: Objek Pengganti Pengujian
Poin penting:
- Rancang berdasarkan antarmuka agar objek pengganti pengujian dapat digunakan
- Pengganti tetap: mengembalikan data yang telah ditentukan; Tiruan: memverifikasi interaksi
- httptest untuk HTTP; implementasi palsu dalam memori untuk penyimpanan
- Hindari terlalu banyak tiruan—pilih implementasi palsu untuk perilaku kompleks
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Pengganti Pengujian: Mock dan Stub” gratis?
Ya — teks lengkap “Pengganti Pengujian: Mock dan Stub” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Go Academy, upgrade ke CoddyKit PRO. Kursus Go Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Pengganti Pengujian: Mock dan Stub”?
Interface untuk kemudahan pengujian dan injeksi dependensi Kamu berlatih Go Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Go Academy?
Tidak diperlukan pengalaman sebelumnya. Go Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Pengganti Pengujian: Mock dan Stub” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Go Academy ini?
Ya. Setiap pelajaran Go Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Menulis Pengujian Unit dengan testing
- Pengujian Berbasis Tabel
- Pengganti Pengujian: Mock dan Stub
- Cakupan Pengujian dan testify