ตัวแทนการทดสอบ: ม็อกและสตับ
ใช้ interface เพื่อให้ทดสอบได้ง่ายและฉีดดีเพนเดนซี
ตัวแทนการทดสอบ: ม็อกและสตับ เป็นบทเรียน Go Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Go Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน
ภาพรวมตัวจำลองการทดสอบ
ตัวจำลองการทดสอบจะเข้ามาแทนที่การพึ่งพาจริงในการทดสอบ ประเภทต่าง ๆ ได้แก่ สตับ (ส่งคืนการตอบกลับที่เตรียมไว้), ม็อก (ตรวจสอบการโต้ตอบ), สปาย (บันทึกการเรียกใช้) และ ตัวจำลองเสมือน (การใช้งานจริงในหน่วยความจำ)
อินเทอร์เฟซช่วยให้ใช้ตัวจำลองการทดสอบได้
ออกแบบฟังก์ชันให้รับอินเทอร์เฟซแทนชนิดรูปธรรม ในระบบจริงให้ส่งการใช้งานจริงเข้าไป ส่วนในการทดสอบให้ส่งตัวจำลองการทดสอบเข้าไป
type UserStore interface {
FindByID(id int) (*User, error)
}
func GetUser(store UserStore, id int) (*User, error) {
return store.FindByID(id)
}สตับแบบเขียนเอง
สตับคือโครงสร้างอย่างง่ายที่ใช้งานอินเทอร์เฟซและส่งคืนค่าที่กำหนดไว้ล่วงหน้า:
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)ม็อกแบบเขียนเอง
ม็อกจะบันทึกการเรียกใช้และตรวจสอบการเรียกเหล่านั้น:
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
แพ็กเกจ testify/mock สร้างหรือเขียนอ็อบเจ็กต์ม็อกพร้อมการคาดหมายการเรียกใช้และการกำหนดค่าที่ส่งคืน:
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 (เดิมคือ golang/mock) สร้างม็อกจากอินเทอร์เฟซ ใช้ mockgen CLI เพื่อสร้าง และใช้ EXPECT() เพื่อตั้งค่าการคาดหมาย
ตัวจำลองเสมือน
ตัวจำลองเสมือนคือการใช้งานจริงในหน่วยความจำ เช่น ที่เก็บผู้ใช้ในหน่วยความจำซึ่งเก็บ users ไว้ในแมป ตัวจำลองเสมือนเขียนได้ยากกว่า แต่สมจริงและเปราะบางน้อยกว่าม็อก
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 สำหรับไคลเอนต์ HTTP
net/http/httptest มีเซิร์ฟเวอร์ทดสอบ HTTP และตัวบันทึกที่ทำงานภายในกระบวนการเดียวกัน ซึ่งเป็นตัวจำลองมาตรฐานสำหรับการพึ่งพาที่ใช้ HTTP
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
json.NewEncoder(w).Encode(User{Name: "Alice"})
}))
defer ts.Close()ควรใช้ตัวจำลองแต่ละแบบเมื่อใด
สตับ: การตอบกลับคงที่อย่างง่าย ม็อก: ตรวจสอบจำนวนครั้งและอาร์กิวเมนต์ที่เรียกใช้ ตัวจำลองเสมือน: พฤติกรรมที่ซับซ้อน หลีกเลี่ยงการใช้ม็อกมากเกินไป เพราะตัวจำลองเสมือนและองค์ประกอบจริงในการทดสอบการทำงานร่วมกันเชื่อถือได้มากกว่า
หลีกเลี่ยงการทดสอบที่เปราะบาง
ม็อกที่ตรวจสอบลำดับการเรียกใช้หรือค่าของอาร์กิวเมนต์แบบตรงตัวจะเปราะบางเมื่อการใช้งานเปลี่ยนแปลงไป ควรเลือกใช้สตับที่ตรวจสอบเอาต์พุตหรือตัวจำลองเสมือนเมื่อเป็นไปได้
การค้นหาอินเทอร์เฟซ
แยกอินเทอร์เฟซหลังจากระบุส่วนของชนิดรูปธรรมที่ผู้เรียกใช้งานแล้ว (ISP) Go รองรับการทำให้อินเทอร์เฟซสมบูรณ์โดยปริยาย จึงไม่จำเป็นต้องแก้ไขชนิดรูปธรรม
ตรวจสอบอย่างรวดเร็ว
ความแตกต่างหลักระหว่างสตับกับม็อกคืออะไร
ทบทวน: ตัวจำลองการทดสอบ
ประเด็นสำคัญ:
- ออกแบบโดยอิงอินเทอร์เฟซเพื่อให้ใช้ตัวจำลองการทดสอบได้
- สตับ: ส่งคืนข้อมูลที่เตรียมไว้ ม็อก: ตรวจสอบการโต้ตอบ
- httptest สำหรับ HTTP และตัวจำลองเสมือนในหน่วยความจำสำหรับที่เก็บข้อมูล
- หลีกเลี่ยงการใช้ม็อกมากเกินไป ควรเลือกตัวจำลองเสมือนสำหรับพฤติกรรมที่ซับซ้อน
เรียนรู้ Go ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 51
- บทเรียน
- 203
คำถามที่พบบ่อย
บทเรียน “ตัวแทนการทดสอบ: ม็อกและสตับ” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ตัวแทนการทดสอบ: ม็อกและสตับ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Go Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ตัวแทนการทดสอบ: ม็อกและสตับ”
ใช้ interface เพื่อให้ทดสอบได้ง่ายและฉีดดีเพนเดนซี คุณปฏิบัติ Go Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Go Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Go Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “ตัวแทนการทดสอบ: ม็อกและสตับ” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Go Academy นี้ได้ไหม
ได้ บทเรียน Go Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การเขียนการทดสอบหน่วยด้วย testing
- การทดสอบแบบขับเคลื่อนด้วยตาราง
- ตัวแทนการทดสอบ: ม็อกและสตับ
- ความครอบคลุมการทดสอบและ testify