무지개곰
article thumbnail
반응형

웹 애플리케이션을 개발하면 해당 애플리케이션의 신뢰성을 확인하고 기능을 테스트하는 것이 중요합니다. Go 언어에서는 표준 라이브러리인 'net/http'를 사용하여 웹 서버를 구축하고 테스트할 수 있습니다. 이번 글에서 Go에서 웹 서버를 테스트하는 방법과 'NewRequest'와 'NewRecoder'메서드의 사용법을 자세하게 알아보겠습니다.

기본적인 테스트 코드 작성 방법은 아래의 링크에 기록해 두었습니다.

https://rainbow96bear.tistory.com/entry/Go-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%BD%94%EB%93%9C-%EC%9E%91%EC%84%B1%ED%95%98%EA%B8%B0-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EB%B2%A4%EC%B9%98%EB%A7%88%ED%81%AC

 

[Go] 테스트 코드 작성하기 (테스트, 벤치마크)

개발 방법 중 하나로 TDD 방법이 중요하게 꼽히고 있습니다. Test-Driven Development의 약자인 TDD는 테스트가 코드 작성 전에 먼저 작성되고, 그 후에 코드가 작성되는 개발 절차입니다. TDD방식의 개발

rainbow96bear.tistory.com

목차

NewRequest와 NewRecorder

테스트 코드 작성


NewRequest와 NewRecorder

Go 언어에서 웹 서버를 테스트하기 위하여 'net/http/httptest'패키지를 사용합니다. 이 패키지는 가상의 HTTP요청을 생성하고 응답을 기록하는 데 사용됩니다. 이를 통하여 테스트 코드에서 HTTP 핸들러 함수를 호출하고 응답을 검증하는 것이 가능합니다.

NewRequest

'net/http/httptest'패키지에 있는 'NewRequest'는 가상의 HTTP 요청을 생성하는 함수입니다. 'NewRequest'는 아래와 같이 정의되어 있습니다.

func NewRequest(method, target string, body io.Reader) *Request

method : HTTP 요청의 메서드를 작성합니다. (ex : GET, POST, PUT, DELETE)

target : 요청의 대상 URL 경로를 입력합니다. (ex : /manage/newpost)

body : 요청의 바디에 포함될 데이터를 읽을 수 있는 io.Reader 인터페이스를 입력합니다.

예시

req := httptest.NewRequest("GET", "/search", nil)

NewRecorder

'net/http/httptest'패키지에 있는 'NewRecorder'는 가상의 HTTP 응답을 기록하는 함수입니다. 'NewRecorder'는 아래와 같이 정의되어 있습니다.

func NewRecorder() *ResponseRecorder

ResponseRecorder타입은 핸들러에 전달하는 ResponseWriter의 인스턴스가 될 것입니다. ResponseRecorder타입은 http.ResponseWriter를 구현한 것으로 프로그램의 모든 변화를 기록합니다.

예시

res := httptest.NewRecorder()

테스트 코드 작성

간단한 웹 서버 예시를 통하여 'net/http/httptest'패키지를 이용한 테스트 예시를 알아보겠습니다.

예시

예시 코드의 경우 아래의 github 주소에 올려두었습니다.

https://github.com/rainbow96bear/golang_practice/tree/master/codeTest/serverTest

server.go

package main

import (
	"encoding/json"
	"fmt"
	"net/http"

	"github.com/gorilla/mux"
)

type User struct {
	Name string `json:"name"`
}

func main(){
	port := 8080

	r := mux.NewRouter()

	r.HandleFunc("/test",testHandler).Methods("GET")

	http.ListenAndServe(fmt.Sprintf("%d:",port),r)
}

func testHandler(w http.ResponseWriter, r *http.Request){
	var user User
	decoder := json.NewDecoder(r.Body)
	err := decoder.Decode(&user)

	if err != nil {
		http.Error(w, err.Error(), http.StatusBadRequest)
	}
	w.Write([]byte(fmt.Sprintf("%s님 반갑습니다.", user.Name)))
}

server_test.go

package main

import (
	"fmt"
	"net/http"
	"net/http/httptest"
	"strings"
	"testing"
)

func TestMyhandler(t *testing.T){
	requestBody := `{"name":"rainbowbear"}`
	
	req := httptest.NewRequest("GET","/test", strings.NewReader(requestBody))
	req.Header.Set("Content_type", "application/json")
	
	rr := httptest.NewRecorder()

	testHandler(rr, req)

    if rr.Code != http.StatusOK {
        t.Errorf("Expected status code %d, but got %d", http.StatusOK, rr.Code)
    }

	expectedResponseBody := "rainbowbear님 반갑습니다."

    if rr.Body.String() != expectedResponseBody {
        t.Errorf("Expected body %s, but got %s", expectedResponseBody, rr.Body.String())
    }
}

웹 서버의 경우 요청이 들어오면 json을 읽고 json에 포함된 이름을 포함한 인사를 전달합니다.

테스트 코드의 경우 'http.NewRequest'를 사용하여 가상의 요청을 생성하였습니다. Methods는 GET으로 path는 /test로 json 정보를 전달하였습니다.

응답받은 정보는 'http.NewRecorder'를 통하여 저장을 하였고 'rr.Code''rr.Body.String()'을 통하여 저장된 정보를 활용하였습니다.

실행 + 결과

테스트를 실행하는 방법은 아래의 명령어를 실행하면 됩니다.

go test -v

'TestMyHandler'의 매개변수를 보면 알 수 있듯 test메서드를 사용하는 것이기에 go test로 실행가능하며 '-v'옵션을 통하여 자세한 정보를 보여줍니다.

기대한 값과 동일하여 테스트가 성공한 것을 확인할 수 있습니다.

반응형
profile

무지개곰

@무지개곰

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!