Go Academy · บทเรียน

ตัวแทนการทดสอบ: ม็อกและสตับ

ใช้ interface เพื่อให้ทดสอบได้ง่ายและฉีดดีเพนเดนซี

บทเรียน 3 จาก 413 ขั้นตอน

ตัวแทนการทดสอบ: ม็อกและสตับ เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การเขียนการทดสอบหน่วยด้วย testing
  2. การทดสอบแบบขับเคลื่อนด้วยตาราง
  3. ตัวแทนการทดสอบ: ม็อกและสตับ
  4. ความครอบคลุมการทดสอบและ testify
← กลับไปที่ Go Academy