본문 바로가기

GO lang/web

[GO] Web - 테스트 코드 작성방법(TDD)

기존에 작업한 "Web - Text, json, URL 쿼리 방식" 코드에 대한 테스트 코드입니다.

테스트 코드를 작성하기 전에 2개의 패키지를 설치해야 함.

 

설치 위치 - 본인의 프로젝트 폴더에서 실행.
설치방법
1. go get github.com/smartystreets/goconvey
2. 환경변수 path에 추가 ===> "%GOPATH%\bin"
3. go get github.com/stretchr/testify/assert

 

./myapp/app_test.go - 5가지의 테스트 경우를 점검함.

 

package myapp

import (
	"encoding/json"
	"github.com/stretchr/testify/assert"
	"io/ioutil"
	"net/http"
	"net/http/httptest"
	"strings"
	"testing"
)

// 루트폴더에 접근시, 정상상태 응답 및 응답 텍스트 비교
func TestIndexPathHandler(t *testing.T) {
	assert := assert.New(t)
	res := httptest.NewRecorder()
	req := httptest.NewRequest("GET", "/", nil)

	mux := NewHttpHandler()
	mux.ServeHTTP(res, req)
	// barHandler(res, req)
	assert.Equal(http.StatusOK, res.Code)

	data, _ := ioutil.ReadAll(res.Body)
	assert.Equal("Hello World", string(data))

}

// /bar 접근시, 정상상태 응답 및 응답 텍스트 비교
func TestBarPathHandler_WithoutName(t *testing.T) {
	assert := assert.New(t)
	res := httptest.NewRecorder()
	req := httptest.NewRequest("GET", "/bar", nil)

	mux := NewHttpHandler()
	mux.ServeHTTP(res, req)
	// barHandler(res, req)
	assert.Equal(http.StatusOK, res.Code)

	data, _ := ioutil.ReadAll(res.Body)
	assert.Equal("Hello name: World!", string(data))

}

// URL 쿼리정보로 /bar 접근시, 정상상태 응답 및 응답 텍스트 비교
func TestBarPathHandler_WithName(t *testing.T) {
	assert := assert.New(t)
	res := httptest.NewRecorder()
	req := httptest.NewRequest("GET", "/bar?name=kimbs", nil)

	mux := NewHttpHandler()
	mux.ServeHTTP(res, req)
	// barHandler(res, req)
	assert.Equal(http.StatusOK, res.Code)

	data, _ := ioutil.ReadAll(res.Body)
	assert.Equal("Hello name: kimbs!", string(data))

}

// /foo 접근시, 정상상태 응답
func TestFooPathHandler_WithoutJson(t *testing.T) {
	assert := assert.New(t)
	res := httptest.NewRecorder()
	req := httptest.NewRequest("GET", "/foo", nil)

	mux := NewHttpHandler()
	mux.ServeHTTP(res, req)
	assert.Equal(http.StatusBadRequest, res.Code)
}

// json데이터로 /foo 접근시, 정상상태 응답 및 응답 텍스트 비교
func TestFooPathHandler_WithJson(t *testing.T) {
	assert := assert.New(t)
	res := httptest.NewRecorder()
	req := httptest.NewRequest("POST", "/foo",
		strings.NewReader(`{"first_name":"bs","last_name":"kim","email":"kimbs@kimbs.com"}`))

	mux := NewHttpHandler()
	mux.ServeHTTP(res, req)
	assert.Equal(http.StatusCreated, res.Code)

	user := new(User)
	err := json.NewDecoder(res.Body).Decode(user)
	assert.Nil(err)
	assert.Equal("bs", user.FirstName)
	assert.Equal("kim", user.LastName)
}

 

테스트 실행 방법

프로젝트 폴더에서 goconvey 실행, 실행되지 않으면 "%GOPATH%\bin" 폴더에 goconvey 파일이 있는지 확인.

없으면 다시 설치하고 있다면 path 등록을 못한 경우임.

 

프로젝트 폴더에서 goconvey 실행 > http://localhost:8080/ 접속해서 테스트 서버가 정상동작하는지 확인

 

'GO lang > web' 카테고리의 다른 글

[GO] Todo list - interface 구현1  (0) 2021.11.18
[GO] Todo list - refactoring(구조변경)  (0) 2021.11.17
[GO] Todo list - map 자료구조  (0) 2021.11.17
[GO] Web - Restful API, TDD  (0) 2021.11.04
[GO] Web - Text, json, URL 쿼리 방식  (0) 2021.11.04