Go 언어의 `testing` 패키지는 어떻게 사용하나요?
_____A1: `testing` 패키지는 Go 언어에서 단위 테스트, 벤치마크 테스트, 예제 테스트 등을 작성하고 실행할 수 있게 도와주는 표준 라이브러리입니다. 테스트 함수 작성, 테스트 실행, 실패 기록, 벤치마크 작성 등을 지원합니다.
---
Q2: 기본적인 단위 테스트는 어떻게 작성하나요?
A2: 테스트 파일은 소스 코드와 같은 패키지에 `xxx_test.go`라는 이름으로 만듭니다. 테스트 함수는 `func TestXXX(t *testing.T)` 형식으로 작성하며, `Test`로 시작해야 합니다. 예를 들어:
```go
func TestAdd(t *testing.T) {
got := Add(2, 3)
want := 5
if got != want {
t.Errorf("Add(2, 3) = %d; want %d", got, want)
}
}
```
---
Q3: 테스트 함수의 매개변수 `*testing.T`는 무엇인가요?
A3: `*testing.T`는 테스트 상태를 관리하는 구조체로, 테스트 실패를 보고하거나 로그 출력을 할 때 사용합니다. 주요 메서드로는 `t.Error()`, `t.Errorf()`, `t.Fatal()`, `t.Fatalf()` 등이 있습니다. `Error*`는 테스트를 실패 상태로 만들지만 함수는 계속 실행하고, `Fatal*`는 즉시 테스트를 중단합니다.
---
Q4: 벤치마크 테스트는 어떻게 작성하나요?
A4: 벤치마크 함수는 `func BenchmarkXXX(b *testing.B)` 형식이며, `Benchmark`로 시작해야 합니다. 벤치마크 대상 코드를 `for i := 0; i < b.N; i++` 루프 안에 넣어 실행합니다. 예:
```go
func BenchmarkAdd(b *testing.B) {
for i := 0; i < b.N; i++ {
Add(2, 3)
}
}
```
---
Q5: 테스트를 실행하는 명령어는 무엇인가요?
A5: `$ go test` 명령어를 프로젝트 혹은 패키지 디렉토리에서 실행하면 테스트를 자동으로 찾아 실행합니다. 특정 함수만 실행하려면 `$ go test -run TestFuncName` 을 사용합니다. 벤치마크 실행은 `$ go test -bench=.` 처럼 `-bench` 옵션을 씁니다.
---
Q6: 실패한 테스트에서 로그를 출력하려면 어떻게 해야 하나요?
A6: `t.Log()`와 `t.Logf()`를 통해 메시지를 출력할 수 있고, 테스트가 실패할 때만 출력하려면 `-test.v` 옵션으로 자세한 출력을 활성화하세요. 예를 들어 `$ go test -v` 로 실행하면 로그가 보입니다.
---
Q7: 테스트 초기화나 종료 작업은 어떻게 처리하나요?
A7: 테스트별 초기화는 테스트 함수 안에서 직접 합니다. 패키지 전체에 공통 설정이 필요한 경우 `func TestMain(m *testing.M)` 함수를 정의하여 사용합니다. `TestMain`에서 초기화 후 `os.Exit(m.Run())` 으로 테스트를 실행하며, 종료 작업도 수행할 수 있습니다.
```go
func TestMain(m *testing.M) {
// 초기화 코드
code := m.Run()
// 종료 코드
}
```
---
Q8: 하위 테스트(subtest)는 어떻게 작성하나요?
A8: 테스트 함수 내에서 `t.Run("name", func(t *testing.T) { ... })` 형태로 하위 테스트를 만듭니다. 하위 테스트는 독립적으로 실행되며, 하위 테스트 단위로 실행하거나 스킵하기 좋습니다.
```go
func TestSomething(t *testing.T) {
t.Run("case1", func(t *testing.T) {
// case1 테스트
})
t.Run("case2", func(t *testing.T) {
// case2 테스트
})
}
```
---
Q9: 테스트를 임의로 건너뛰고 싶으면 어떻게 하나요?
A9: `t.Skip()` 혹은 `t.Skipf()`를 호출하면 해당 테스트를 건너뜁니다. 예를 들어 특정 환경에서만 실행하도록 제한할 때 유용합니다.
```go
if runtime.GOOS == "windows" {
t.Skip("Skip on Windows")
}
```
---
Q10: 예제 테스트(Example tests)는 어떤 용도로 사용하나요?
A10: 문서와 테스트를 겸하는 예제 코드를 작성할 때 사용합니다. 함수명은 `ExampleXXX` 로 작성하며, 코드 마지막에 출력 예상값(`// Output:`)을 주석으로 표시하면 자동으로 실행 검증도 해 줍니다.
```go
func ExampleAdd() {
fmt.Println(Add(1, 2))
// Output: 3
}
```
---
Q11: `testing.T`와 `testing.B` 차이는 무엇인가요?
A11: `testing.T`는 단위테스트를 위한 타입이고, `testing.B`는 벤치마크 테스트를 위한 타입입니다. 두 타입 모두 로그 출력과 실패/성공 제어 기능이 있지만, 벤치마크 측정용 반복 횟수 관리 기능(`b.N`)이 있습니다.
---
Q12: 테스트 커버리지는 어떻게 확인하나요?
A12: `$ go test -cover` 옵션으로 간단한 커버리지 통계를 얻을 수 있습니다. 좀 더 자세한 커버리지 리포트는 `$ go test -coverprofile=coverage.out`로 생성한 후 `$ go tool cover -html=coverage.out` 명령어로 웹 브라우저에서 시각적으로 확인할 수 있습니다.
---
이상으로 Go `testing` 패키지의 기본 사용법과 주요 기능을 FAQ 형식으로 정리하였습니다.
이 패키지를 사용하면 단위 테스트, 벤치마크 테스트, 예제 테스트 등을 쉽게 작성할 수 있습니다.
아래에서는 `testing` 패키지의 사용법에 대해 자세히 설명하겠습니다.
1. 테스트 파일 구조 Go에서 테스트 파일은 일반적으로 `_test.go`로 끝나는 파일에 작성됩니다.
예를 들어, `example.go` 파일에 대한 테스트는 `example_test.go` 파일에 작성됩니다.
Go는 이러한 파일을 자동으로 인식하여 테스트를 실행합니다.
2. 테스트 함수 작성 테스트 함수는 `Test`로 시작하고, `*testing.T` 타입의 매개변수를 받아야 합니다.
아래는 간단한 테스트 함수의 예입니다.
```go package example import "testing" func Add(a, b int) int { return a + b } func TestAdd(t *testing.T) { result := Add(1,
2) expected := 3 if result != expected { t.Errorf("Add(1,
2) = %d; want %d", result, expected) } } ``` 위의 예제에서 `TestAdd` 함수는 `Add` 함수의 결과가 예상한 값과 일치하는지 확인합니다.
만약 일치하지 않으면 `t.Errorf`를 호출하여 오류 메시지를 출력합니다.
3. 테스트 실행 테스트를 실행하려면 터미널에서 다음 명령어를 사용합니다.
```bash go test ``` 이 명령어는 현재 디렉토리의 모든 `_test.go` 파일을 찾아 테스트를 실행합니다.
특정 파일만 테스트하고 싶다면 다음과 같이 명령어를 사용할 수 있습니다.
```bash go test -run TestAdd ```
4. 벤치마크 테스트 `testing` 패키지는 벤치마크 테스트도 지원합니다.
벤치마크 함수는 `Benchmark`로 시작하고, `*testing.B` 타입의 매개변수를 받아야 합니다.
아래는 벤치마크 테스트의 예입니다.
```go func BenchmarkAdd(b *testing.B) { for i := 0; i < b.N; i++ { Add(1,
2) } } ``` 벤치마크 테스트를 실행하려면 다음 명령어를 사용합니다.
```bash go test -bench=. ```
5. 예제 테스트 예제 테스트는 코드의 사용 예를 문서화하고, 동시에 테스트를 수행하는 방법입니다.
예제 함수는 `Example`로 시작해야 하며, `*testing.T` 매개변수를 받아야 합니다.
아래는 예제 테스트의 예입니다.
```go func ExampleAdd() { result := Add(1,
2) fmt.Println(result) // Output: 3 } ``` 위의 예제에서 `ExampleAdd` 함수는 `Add` 함수의 사용 예를 보여주며, 주석으로 기대하는 출력을 명시합니다.
6. 테스트 패키지 및 모듈 Go는 패키지 기반의 언어이므로, 각 패키지에 대해 독립적인 테스트를 작성할 수 있습니다.
또한 Go 모듈을 사용하면 의존성을 관리하고, 특정 버전의 패키지를 사용할 수 있습니다.
7. 테스트 커버리지 Go는 테스트 커버리지를 측정하는 기능도 제공합니다.
커버리지를 측정하려면 다음 명령어를 사용합니다.
```bash go test -cover ``` 이 명령어는 테스트가 얼마나 많은 코드 라인을 커버하는지를 보여줍니다.
8. Go의 `testing` 패키지는 테스트를 작성하고 실행하는 데 매우 유용한 도구입니다.
단위 테스트, 벤치마크, 예제 테스트를 통해 코드의 품질을 높이고, 버그를 조기에 발견할 수 있습니다.
Go 언어의 테스트 기능을 적극 활용하여 안정적이고 신뢰할 수 있는 코드를 작성하는 것이 중요합니다.
작성자:
박지혜 [비회원]
| 작성일자: 1년 전
2024-09-19 01:50:34
조회수: 131 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 131 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.