httptest 소개 및 사용

4710 단어 golanghttptestgin
우 리 는 인 터 페 이 스 를 다 쓴 후에 인 터 페 이 스 를 테스트 하고 golang 표준 라 이브 러 리 에서httptest패 키 지 를 제공 하여 테스트 를 보조 해 야 한다.
인 터 페 이 스 는 IP 주소 나 도 메 인 이름 으로 접근 해 야 하기 때문에httptest가방 에서 서비스 주 소 를 기본 으로 정의 합 니 다.
const DefaultRemoteAddr = "1.2.3.4"

중요 한 방법
NewRequest(요청 체)NewRequesthttp 요청 체 를 만 드 는 방법 입 니 다.
방법 정의:
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
  • https://golang.org/pkg/net/http/httptest/
  • 좋은 웹페이지 즐겨찾기