개발 방법 중 하나로 TDD 방법이 중요하게 꼽히고 있습니다. Test-Driven Development의 약자인 TDD는 테스트가 코드 작성 전에 먼저 작성되고, 그 후에 코드가 작성되는 개발 절차입니다. TDD방식의 개발을 하기 위한 go에서 test를 작성하는 방법에 대하여 알아보겠습니다.
목차
테스트
벤치마크
테스트
go 언어에서 가장 기본이 되는 테스트를 작성하는 방법에 대하여 알아보겠습니다.
작성방법
1. 테스트 코드는 '_test.go'확장자를 가집니다. 테스트할 패키지와 같은 디렉터리에 '_test.go'확장자를 가지는 파일을 생성합니다.
2. 테스트 파일의 package 명은 테스트 할 파일의 package 명과 동일합니다.
3. 테스트를 하기 위하여 'testing'패키지를 import 합니다.
4. 일반 go 파일의 경우 main함수 등을 작성하였다면 테스트파일에서는 'func TestXxx(t *Testing.T)'형태의 함수를 작성합니다.
5. Test 함수 안에 테스트할 내용을 작성합니다.
예시
예시 코드의 경우 아래의 github 주소에 올려두었습니다.
https://github.com/rainbow96bear/golang_practice/tree/master/codeTest/testing
sampleCode.go
package main
func Add(a, b int) int {
return a + b
}
sampleCode_test.go
package main
import "testing"
func TestAdd(t *testing.T) {
result := Add(4, 7)
expected1 := 11
expected2 := 13
if result != expected1 {
t.Errorf("Expected %d but got %d", expected1, result)
}
if result != expected2 {
t.Errorf("Expected %d but got %d", expected2, result)
}
}
'sampleCode_test.go'의'TestAdd' 함수를 보면 Add(4, 7)을 불러오고 있습니다. test파일에서 package이름이 같은 파일에서 정보를 읽어오기 때문에 'sampleCode.go'의 'Add'를 읽어와 테스트하였습니다. if문을 활용하여 비교를 하여 테스트를 실행하였습니다.
실행 + 결과
테스트를 실행하는 방법은 아래의 명령어를 실행하면 됩니다.
go test
테스트가 성공한 경우와 실패한 경우의 결과는 이와 같습니다. 실패하였을 경우 't.Errorf'에 작성한 내용이 출력되는 것을 볼 수 있습니다.
주요 메서드
t.Errorf(format string, args ...interface{}) : 테스트를 실패로 표시하고 오류 메시지를 출력합니다.
t.Fatalf(format string, args ...interface{}) : 테스트를 실패로 표시하고 오류 메시지를 출력한 뒤 테스트를 중단합니다.
t.LogF(format string, args ...interface{}) : 로그 메시지를 출력하며 테스트를 실패로 표시하지 않습니다.
t.Skip(reason string) : 테스트를 스킵하고 이유를 출력합니다.
t.SkipNow() : 테스트를 즉시 스킵합니다.
벤치마크
벤치마크는 코드의 성능을 측정할 때 사용하는 테스트입니다. 함수 또는 코드 세그먼트의 실행 시간을 측정하여 보여줍니다.
작성방법
1. 테스트할 패키지와 같은 디렉터리에 '_test.go'확장자를 가진 파일을 생성합니다.
2. 테스트 파일의 package 명은 테스트할 파일의 package 명과 동일합니다.
3. 테스트를 하기 위하여 'testing' 패키지를 import 합니다.
4. 일반 Go 파일의 경우 main 함수를 작성하였다면 벤치마크 파일에서는 'func BenchmarkXxx(b *testing.B)'형태의 함수를 작성합니다.
5. Benchmark 함수 안에 테스트할 내용을 작성합니다.
예시
예시 코드의 경우 아래의 github 주소에 올려두었습니다.
https://github.com/rainbow96bear/golang_practice/tree/master/codeTest/benchmark
sampleCode.go
package benchmark
func Add(a, b int) int {
return a + b
}
sampleCode_test.go
package benchmark
import "testing"
func BenchmarkAdd(b *testing.B) {
for i := 0; i < b.N; i++ {
Add(3, 7)
}
}
'sampleCode_test.go'의 'BenchmarkAdd'함수를 보면 Add(3, 7)을 불러오고 있습니다. test파일에서 package이름이 같은 파일에서 정보를 읽어오기 때문에 'sample.go'파일의 'Add'를 읽어와 테스트하였습니다. for문을 이용하여 반복하여 실행시간의 평균을 구합니다.
실행 + 결과
테스트를 실행하는 방법은 아래의 명령어를 실행하면 됩니다.
go test -bench=.
결과의 아래에서 3번째 줄을 해석하면 BenchmarkAdd를 8개의 병렬 고루틴으로 실행하였고 1000000000번을 수행하였으며 반복이 0.2389ns동안 진행되었다는 것을 의미합니다.
마지막 줄은 benchmark 패키지의 실행시간이 0.444s였다는 것을 의미합니다.
주요 메서드
b.ResetTimer() : 타이머를 재설정하고 벤치마크 루프의 실행 시간을 측정합니다.
b.StartTimer() : 타이머를 시작하여 벤치마크 루프의 실행 시간을 측정합니다.
b.StopTimer() : 타이머를 일시 중지하여 벤치마크 루프의 실행 시간 측정을 중지합니다.
b.N : 벤치마크 루프의 반복 횟수를 반환합니다.
'Go language' 카테고리의 다른 글
[Go] cookie와 session 다루기 (0) | 2023.09.14 |
---|---|
[Go] 웹 서버 테스트하기 (net/http/httptest 패키지) (0) | 2023.09.13 |
[Go] 데이터 압축하기 (compress/gzip 사용하기) (0) | 2023.09.11 |
[Go] RESTful API 설계 (HTTP 메서드 사용, gorila/mux) (0) | 2023.09.05 |
[Go] 웹 서버에서 Query, JSON 처리 (2) | 2023.09.03 |