TDD란?
유닛 테스트 작성법과 Go testing 패키지를 활용한 디버깅 방법을 설명하기 전에, 먼저 TDD(Test-Driven Development, 테스트 주도 개발) 개념을 간단히 짚고 넘어가겠습니다.
TDD는 소프트웨어 개발 방법론 중 하나로, 실제 코드를 작성하기 전에 테스트 코드를 먼저 작성하는 방식을 의미합니다. 즉, 먼저 실패하는 테스트를 만들고, 그 테스트를 통과시키기 위한 최소한의 코드를 작성한 뒤, 마지막으로 리팩토링을 진행하는 순서로 개발이 이루어집니다. 이러한 접근 방식은 코드 품질을 높이고, 기능 추가나 수정 시 발생할 수 있는 오류를 빠르게 발견하는 데 큰 도움을 줍니다.
TDD에 대한 자세한 내용은 구글링을 통해 보다 더 좋은 자료를 참고할 수 있습니다.
testing 패키지란?
go test는 Go 언어에서 기본으로 제공되는 테스트 실행 도구로, 개발자가 작성한 테스트 코드(*_test.go 파일)를 자동으로 탐색해 실행해 주는 매우 강력한 기능을 갖추고 있습니다. Go는 언어 차원에서 테스트를 공식적으로 지원하고 있기 때문에, 별도의 외부 라이브러리 없이도 다양한 테스트 시나리오를 쉽게 구현할 수 있습니다. 예를 들어 코드의 개별 기능을 검증하는 유닛 테스트(Unit Test), 여러 구성 요소가 함께 동작하는지 확인하는 기능 테스트(Functional Test), 시스템 단위에서 데이터의 흐름과 연동을 확인하는 통합 테스트(Integration Test) 등 다양한 단계의 테스트를 모두 go test 한 도구로 수행할 수 있습니다.
이처럼 테스트 코드가 언어 자체와 깊이 결합되어 있다는 점은 Go의 큰 장점 중 하나입니다. 개발자가 새로운 기능을 추가하거나 기존 코드를 수정할 때, 테스트를 함께 실행하는 것만으로도 잠재적인 버그를 빠르게 발견할 수 있기 때문입니다. 실제로 팀 단위의 개발 환경에서는 작은 코드 변경이 전체 서비스에 영향을 줄 수 있기 때문에 테스트 자동화는 소프트웨어의 신뢰성을 높이는 핵심 요소로 자리 잡고 있습니다.
특히 go test는 CI/CD 파이프라인과 연동하기도 매우 쉽습니다. GitHub Actions, Jenkins, GitLab CI 등 어떤 플랫폼을 사용하더라도 별도의 복잡한 설정 없이 테스트 스텝을 추가하는 것만으로 자동화된 검증 프로세스를 구축할 수 있습니다. 그 결과, 코드가 어떤 단계에서 깨졌는지 빠르게 확인할 수 있고, 배포 전에 품질을 한 번 더 보장하는 역할을 수행하게 됩니다. 이런 이유로 go test는 단순한 테스트 도구를 넘어, Go 개발자라면 반드시 익혀야 하는 개발 문화의 일부라고 할 수 있습니다.
testing 실습하기
이번 포스팅에서는 테스트 실습을 위해 간단한 예제를 준비했습니다. 먼저 pkg/sum/totalSum.go 파일에 두 숫자를 더해서 합계를 반환하는 매우 단순한 sum 함수를 작성했습니다. 이 함수는 실제 비즈니스 로직을 단순화한 형태지만, 테스트의 기본 구조를 이해하기에는 충분한 예시입니다. 그리고 이 함수가 기대한 대로 동작하는지를 검증하기 위해, 같은 디렉토리에 totalSum_test.go 파일을 작성했습니다. 이 파일 내부에는 Go testing 패키지를 활용한 유닛 테스트 코드가 포함되어 있으며, 다양한 입력값에 대해 함수가 올바른 결과를 반환하는지 체크하도록 구성했습니다. 이와 같은 방식은 실무에서도 자주 사용되는 패턴으로, 함수 단위의 테스트를 통해 코드의 신뢰성을 확보하는 데 매우 효과적입니다.
pkg/sum/totalSum.go
// pkg/sum/totlaSum.go
package sum
func InefficientSum(num int) int {
result := 0
for i := 1; i <= num; i++ {
result += i
}
return result
}
pkg/sum/totalSum_test.go
// pkg/sum/totlaSum_test.go
package sum
import (
"testing"
)
func TestInefficientSum(t *testing.T) {
tests := []struct {
input int
expected int
}{
{input: 10, expected: 55},
{input: 100, expected: 5050},
{input: 9876, expected: 48772626},
{input: 123456789, expected: 7620789436823655},
}
for _, test := range tests {
result := InefficientSum(test.input)
if result != test.expected {
t.Errorf("InefficientSum(%d) = %d; want %d", test.input, result, test.expected)
}
}
}
원하는 위치에 브레이크포인트를 설정한 후, VSCode에서 테스트 함수 위에 표시되는 "debug test" 버튼을 클릭하여 디버깅을 시작할 수 있습니다. 이를 통해 테스트 코드의 흐름을 단계별로 살펴보고, 각 변수의 값을 직접 확인할 수 있습니다. 이렇게 하면 코드가 의도한 대로 동작하는지, 그리고 예상과 다른 값이 어디에서 발생하는지를 쉽게 찾을 수 있습니다.

명령어로 수행하는 방법은 다음과 같습니다.
go test ./...
실습 링크
https://github.com/stdhsw/go-testing
GitHub - stdhsw/go-testing
Contribute to stdhsw/go-testing development by creating an account on GitHub.
github.com
'Go언어' 카테고리의 다른 글
| 안전하게 개발하기 레츠GO! #4 graceful shutdown (0) | 2025.11.21 |
|---|---|
| 안전하게 개발하기 레츠GO! #3 go benchmark (0) | 2025.11.20 |
| 안전하게 개발하기 레츠GO! #1 디버깅 (0) | 2025.11.18 |
| Go언어의 benchmark와 test (0) | 2025.11.18 |
| Go언어에서의 Generic 이해하기 (1) | 2025.03.27 |