일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 치비
- MSSQL
- 반복문
- 쌈채소
- 분산 식별자
- 애플 달팽이
- 텐더민트
- PKI
- 체리새우
- golang 강좌
- 무화과
- Config server
- rust
- 기본문법
- for
- 구피
- MSA
- rust 소개
- Tendermint
- 주말농장
- 카디날
- 물생활
- Feign
- 조건문
- did
- RSA
- Python 강좌
- 가재
- rust 강좌
- 분산 신원
- Today
- Total
comnic's Dev&Life
[Golang] 8. 테스트(Testing, Coverage) 본문
8. 테스트(Testing, Coverage)
8.1 단위 테스트(Unit Testing)
단위 테스트:
- 소프트웨어의 최소 단위(함수, 메소드, 모듈 등)에 대한 테스트를 수행하는 것입니다.
- Go 언어에서는 testing 패키지를 사용하여 단위 테스트를 작성합니다.
간단한 함수와 테스트코드를 작성하고 실행해 보겠습니다.
// calculator.go
package calculator
func Add(a, b int) int {
return a + b
}
위와 같이 덧셈을 하는 함수 하나를 구현한 후, 이를 테스트하기 위한 코드를 아래와 같이 작성합니다.
// calculator_test.go
package calculator
import "testing"
func TestAdd(t *testing.T) {
result := Add(2, 3)
expected := 5
if result != expected {
t.Errorf("Add(2, 3) returned %d, expected %d", result, expected)
}
}
- 테스트를 위해서는 동일한 폴더에 xxxx_test.go라는 이름으로 파일을 작성합니다.
- 테스트 함수의 이름은 TestXxxx(t *testing.T)로 작성합니다.
테스트 실행
$ go test
PASS
ok calculator 0.516s
위 소스에서 expected를 6으로 바꾸어 잘 못된 경우를 가정하고 실행해보면 아래와 같이 출력됩니다.
--- FAIL: TestAdd (0.00s)
calculator_test.go:12: Add(2, 3) returned 5, expected 6
FAIL
exit status 1
FAIL calculator 0.243s
테스트 함수는 testing.T 포인트를 인자로 받아서 처리하는데, 좀 더 자세히 알아보겠습니다.
8.2 testing.T 타입
*testing.T는 Go 언어에서 테스트를 작성하고 실행할 때 사용되는 테스트 핸들러(테스트 객체)를 나타냅니다. 이 핸들러를 통해 테스트 함수에서 여러 테스트 도구 및 동작을 사용할 수 있습니다.
주요 메서드들
- Errorf(format string, args ...interface{})
- 테스트가 실패한 경우 에러를 기록하고 테스트를 중단합니다.
- 포맷 문자열과 포맷 문자열에 대응하는 인자를 받아 에러를 기록합니다.
- Fail() / FailNow()
- Fail: 테스트를 실패 상태로 표시하고 계속 진행합니다.
- FailNow: 테스트를 실패 상태로 표시하고 즉시 중단합니다.
- Log(args ...interface{}) / Logf(format string, args ...interface{})
- Log: 메시지를 로그에 기록합니다.
- Logf: 포맷 문자열과 포맷 문자열에 대응하는 인자를 받아 메시지를 로그에 기록합니다.
- Skip(args ...interface{}) / Skipf(format string, args ...interface{})
- Skip: 테스트를 스킵하고 해당 테스트는 무시됩니다.
- Skipf: 포맷 문자열과 포맷 문자열에 대응하는 인자를 받아 테스트를 스킵하고 해당 테스트는 무시됩니다.
- Helper()
- 현재 테스트가 Helper 함수에서 호출된 경우를 확인할 때 사용됩니다.
- Helper 함수에서 호출된 경우, 해당 함수는 테스트 결과에 표시되지 않습니다.
- Name() string
- 현재 테스트 함수의 이름을 반환합니다.
- 테스트 함수의 이름을 획득하여 특정 로직을 수행하고자 할 때 사용됩니다.
- *Run(subTestName string, subTest func(t testing.T))
- 서브 테스트를 실행합니다. 서브 테스트가 실패하면 부모 테스트도 실패로 표시됩니다.
- 서브 테스트는 부모 테스트의 독립적인 테스트로 간주됩니다.
*testing.T를 이용하여 테스트 함수에서 다양한 동작을 수행하고 테스트 결과를 확인할 수 있습니다. 이를 통해 테스트 코드를 작성하면 소프트웨어의 품질을 향상시키고 유지보수를 용이하게 할 수 있습니다.
8.3 테스트 커버리지(Test Coverage)
- 소스 코드에서 얼마나 많은 부분이 테스트되었는지를 나타내는 지표입니다.
- go test 명령을 실행할 때 -cover 플래그를 사용하여 테스트 커버리지를 확인할 수 있습니다.
테스트 커버리지 확인:
go test -cover
위 예제를 그대로 실행해 보면 아래와 같이 출력됩니다.
PASS
coverage: 100.0% of statements
ok calculator 0.252s
모든 부분을 테스트 했기에 coverage가 100%로 나왔습니다.
여기서 위 소스 calculator.go에 아래와 같이 Sub 함수를 추가 해 보겠습니다.
// calculator.go
package calculator
func Add(a, b int) int {
return a + b
}
func Sub(a, b int) int {
return a - b
}
이대로 다시 coverage를 확인해 보면 아래와 같이 출력됩니다.
PASS
coverage: 50.0% of statements
ok calculator 0.492s
coverage가 50%가 나왔습니다. 이렇게 현재 프로젝트의 코드 중 몇 %가 테스트를 커버하는지 알 수 있습니다.
테스트 패키지를 사용하여 소프트웨어의 각 부분이 예상대로 동작하는지 확인하고, 테스트 커버리지를 통해 어느 정도의 코드가 테스트되었는지 확인할 수 있습니다. 이를 통해 코드의 신뢰성을 높일 수 있습니다.
'Golang' 카테고리의 다른 글
[Golang] 블룸필터(Bloom Filter)의 설명과 구현 (0) | 2024.01.06 |
---|---|
[Golang] 9. 디버깅(debugging) (1) | 2023.12.31 |
[Golang] 7. 동시성과 병렬성(고루틴, 채널) (0) | 2023.12.30 |
[Golang] 6. 데이터 구조(배열과 슬라이스, 맵과 구조체) (1) | 2023.12.30 |
[Golang] 5. 패키지(Package) (1) | 2023.12.30 |