httptest 소개 및 사용
httptest
패 키 지 를 제공 하여 테스트 를 보조 해 야 한다.인 터 페 이 스 는 IP 주소 나 도 메 인 이름 으로 접근 해 야 하기 때문에
httptest
가방 에서 서비스 주 소 를 기본 으로 정의 합 니 다.const DefaultRemoteAddr = "1.2.3.4"
중요 한 방법
NewRequest(요청 체)
NewRequest
http 요청 체 를 만 드 는 방법 입 니 다.방법 정의:
func NewRequest(method, target string, body io.Reader) *http.Request
method
매개 변 수 는 테스트 인 터 페 이 스 를 나타 내 는 HTTP 방법 입 니 다.target
매개 변 수 는 인터페이스 가 정의 하 는 경 로 를 나타 낸다.body
매개 변 수 는 요청 체 를 나타 낸다.NewRecorder(응답 체)
방법 정의:
func NewRecorder() *ResponseRecorder
NewRecorder 방법 은 http 의 응답 체 를 만 드 는 데 사 용 됩 니 다.되 돌아 오 는 유형 은
*httptest.ResponseRecorder
이 고 인터페이스 되 돌아 오 는 정 보 를 포함 하 며 등가http.ResponseWriter
이다.ResponseRecorder 형식 정의:
type ResponseRecorder struct {
// http .
Code int
//
HeaderMap http.Header
// Body
Body *bytes.Buffer
// Flush
Flushed bool
}
NewServer(http 서비스)
방법 정의:
func NewServer(handler http.Handler) *Server
뉴 서버 방법 은 새로운 서 비 스 를 만 들 고 시작 하 는 데 사 용 됩 니 다.SSL 이 있 는 서 비 스 를 만 드 는 데 사용 되 는 NewTLSServer 도 있 습 니 다.
type Server struct {
URL string //
Listener net.Listener
// TLS
TLS *tls.Config
Config *http.Server
}
next/http 라 이브 러 리 생 성 인터페이스 테스트
요청 인터페이스 정의:
func testAPI(w http.ResponseWriter, r *http.Request){}
테스트 방법 정의:
func Test_testApi(t *testing.T) {
tests := []struct {
name string
}{
{
name: "test api",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
ts := httptest.NewServer(http.HandlerFunc(testAPI))
defer ts.Close()
params := struct{
"params" string
}{
"params": "paramsBody"
}
paramsByte, _ := json.Marshal(params)
resp, err := http.Post(ts.URL, "application/json", bytes.NewBuffer(paramsByte))
if err != nil {
t.Error(err)
}
defer resp.Body.Close()
t.Log(resp.StatusCode)
if resp.StatusCode != http.StatusCreated && resp.StatusCode != http.StatusOK {
body, _ := ioutil.ReadAll(resp.Body)
t.Error(string(body))
}
})
}
}
테스트 할 때
httptest.NewServer
를 통 해 testAPI 인 터 페 이 스 를 만 드 는 서 비 스 를 만 듭 니 다.그리고 http.Post 방법 을 통 해 우리 가 만 든 서 비 스 를 호출 하여 인터페이스 테스트 에서 요청 한 목적 을 달성 합 니 다.그리고 인터페이스 가 돌아 오 는 정보 가 정확 한 지 판단 한다.Gin 프레임 의 인터페이스 테스트
요청 인터페이스 정의:
func testAPI(ctx *gin.Context){}
테스트 방법 정의:
func Test_testAPI(t *testing.T) {
//
router := gin.Default()
router.POST("/test", testAPI)
tests := []struct {
name string
want string
}{
{
name: "test api",
want: "ok",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
params := struct{
"params" string
}{
"params": "paramsBody"
}
paramsByte, _ := json.Marshal(params)
w := httptest.NewRecorder()
req := httptest.NewRequest("POST", "/test", bytes.NewBuffer(paramsByte))
setup.api.router.ServeHTTP(w, req)
assert.Equal(t, http.StatusOK, w.Code)
result, _ := ioutil.ReadAll(w.Body)
var ret string
if err := json.Unmarshal(result, &ret); err != nil {
t.Error(err)
}
assert.Equal(t, tt.want, ret)
})
}
}
테스트 할 때 gin 의 경 로 를 정의 한 다음 httptest.NewRecorder 와 httptest.NewRequest 대상 을 만 들 고 gin 경로 의 ServeHTTP 방법 으로 인 터 페 이 스 를 실행 해 야 합 니 다.
ServeHTTP 는*gin.Engine 이
http.Handler
인 터 페 이 스 를 실현 했다.이런 방식 을 통 해 요청 인터페이스의 목적 을 달성 하 다.그리고 인터페이스 가 돌아 오 는 정보 가 정확 한 지 판단 한다.작은 매듭
인터페이스의 테스트 는 개발 에서 매우 중요 합 니 다.저 는 net/http 와 gin 을 사용 하여 인 터 페 이 스 를 만 드 는 테스트 사례 를 소개 합 니 다.
httptest 패 키 지 를 통 해 인터페이스 에 대해 유닛 테스트 를 편리 하 게 할 수 있 으 며,별도의 서 비 스 를 통 해 테스트 할 필요 가 없습니다.
Ref
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
set containerThere is no built-in set container in Go How to implement Set struct{} => type struct{}{} => 0bytes How to create set :=...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.