웹 애플리케이션을 개발하면 해당 애플리케이션의 신뢰성을 확인하고 기능을 테스트하는 것이 중요합니다. Go 언어에서는 표준 라이브러리인 'net/http'를 사용하여 웹 서버를 구축하고 테스트할 수 있습니다. 이번 글에서 Go에서 웹 서버를 테스트하는 방법과 'NewRequest'와 'NewRecoder'메서드의 사용법을 자세하게 알아보겠습니다.
기본적인 테스트 코드 작성 방법은 아래의 링크에 기록해 두었습니다.
목차
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'옵션을 통하여 자세한 정보를 보여줍니다.
기대한 값과 동일하여 테스트가 성공한 것을 확인할 수 있습니다.
'Go language' 카테고리의 다른 글
[Go] Go 서버를 통하여 Mysql 사용하기 (go-sql-driver) (0) | 2023.09.17 |
---|---|
[Go] cookie와 session 다루기 (0) | 2023.09.14 |
[Go] 테스트 코드 작성하기 (테스트, 벤치마크) (0) | 2023.09.13 |
[Go] 데이터 압축하기 (compress/gzip 사용하기) (0) | 2023.09.11 |
[Go] RESTful API 설계 (HTTP 메서드 사용, gorila/mux) (0) | 2023.09.05 |