-
[ Golang ] Go 루틴을 테스트 하기 (gomock)개발/golang 2021. 3. 11. 23:53
아래와 같은 크롤러가 있고 Mocking 하기위해서 HttpClient 라는 인터페이스를 만들어주었다.
아래 크롤러는 Http Status Code 가 200 이 나온값만 반환하는 로직이다.
실제 우리가 테스트할때에는 실제 Http 요청을 하면 아래 코드가 정상적으로 동작하는지 확인할수 없기때문에 다음과 같은 테스트 코드를 작성한다.
type HttpClient interface { Request(url string, result chan HttpResponse) } type HttpResponse struct { StatusCode int Url string Body string } type Crawler struct { h HttpClient } func NewCrawler(h HttpClient) Crawler { return Crawler{h: h} } func (c *Crawler) DoAction(urls []string) []HttpResponse { ch := make(chan HttpResponse) for _, url := range urls { go c.h.Request(url, ch) } httpResponses := make([]HttpResponse, 0) for range urls { result := <-ch if result.StatusCode == 200 { httpResponses = append(httpResponses, result) } } return httpResponses }
3개의 크롤링 타겟을 요청하고 이중 한개는 강제로 404 를 반환하게한다.
이때 404 에 걸린 타겟은 반환되지않는다.
func TestCrawler(t *testing.T) { t.Run("Given three crawling target When one fails Then Only successful responses are returned", func(t *testing.T) { urls := []string{"https://www.naver.com", "https://google.com", "https://www.cafe24.com"} ctrl := gomock.NewController(t) defer ctrl.Finish() m := mock_exmaple.NewMockHttpClient(ctrl) m.EXPECT().Request(gomock.Any(), gomock.Any()). Do(func(arg0, arg1 interface{}) { url := arg0.(string) response := exmaple_gorutine.HttpResponse{ Body: "<html></html>", StatusCode: 200, Url: url, } if url == "https://www.naver.com" { response.StatusCode = 404 } arg1.(chan exmaple_gorutine.HttpResponse) <- response }). Times(len(urls)) c := exmaple_gorutine.NewCrawler(m) responses := c.DoAction(urls) assert.Len(t, responses, 2) successUrls := make([]string, 0) for _, response := range responses { successUrls = append(successUrls, response.Url) } assert.Contains(t, successUrls, "https://google.com") assert.Contains(t, successUrls, "https://www.cafe24.com") assert.NotContains(t, successUrls, "https://www.naver.com") }) }
github.com/hoyeonUM/golang-example/tree/main/exmaple_gorutine
'개발 > golang' 카테고리의 다른 글
[ Golang ] Rest Api 스펙이 틀릴때 (타입이 틀릴때) Json decode(Unmarshal) 하기 (0) 2021.04.02 [ Golang ] JSON Object 키 넣은 순서대로 정렬하기 (0) 2021.04.02 [ Golang ] Go 루틴 최대갯수를 제한하기 (0) 2021.04.02 mariadb 에서 elasticsearch 실시간 연동하기 (0) 2021.03.30