테스트 대역: 모의 객체와 스텁
테스트 용이성과 의존성 주입을 위한 인터페이스
테스트 대역: 모의 객체와 스텁은(는) CoddyKit의 무료 Go Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 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()를 사용하십시오.
가짜 구현
가짜 구현은 실제로 작동하는 메모리 내 구현입니다. 예를 들어 맵에 사용자를 저장하는 메모리 내 사용자 저장소가 있습니다. 가짜 구현은 작성하기 더 복잡하지만 모의 객체보다 현실적이고 덜 취약합니다.
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
}HTTP 클라이언트에서 httptest 사용하기
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는 암시적 인터페이스 구현을 지원하므로 구체적인 형식을 수정할 필요가 없습니다.
빠른 확인
스텁과 모의 객체의 가장 큰 차이점은 무엇입니까?
복습: 테스트 대역
핵심 내용:
- 테스트 대역을 사용할 수 있도록 인터페이스를 기준으로 설계
- 스텁: 미리 준비한 데이터를 반환함. 모의 객체: 상호작용을 검증함
- HTTP에는 httptest, 저장소에는 메모리 내 가짜 구현 사용
- 모의 객체를 과도하게 사용하지 말고 복잡한 동작에는 가짜 구현을 선호
자주 묻는 질문
“테스트 대역: 모의 객체와 스텁” 강의는 무료인가요?
네 — “테스트 대역: 모의 객체와 스텁” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Go Academy 강의 전체를 잠금 해제할 수 있습니다. Go Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“테스트 대역: 모의 객체와 스텁”에서 뭘 배우나요?
테스트 용이성과 의존성 주입을 위한 인터페이스 브라우저에서 직접 실행하는 실습 코드로 Go Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Go Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Go Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“테스트 대역: 모의 객체와 스텁” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Go Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Go Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- testing으로 단위 테스트 작성
- 테이블 기반 테스트
- 테스트 대역: 모의 객체와 스텁
- 테스트 커버리지와 testify