#0. go test 함수, 파일 만들기
1. 파일
*_test.go 형식으로 만듭니다.
예시 1
파일 : main.go
테스트 파일 : main_test.go
2.함수
func TestXxx(*testing.T) 형식으로 만듭니다.
예시 1
함수 : func Check()
테스트 함수 : TestCheck(t *testing.T)
예시 2 (함수가 소문자로 시작하는 경우 _ 추가)
함수 : func checkNumbers()
테스트 함수 : Test_checkNumbers(t *testing.T)
#1. 테스트 명령어
go test . : 현재 경로에 있는 go 테스트 파일을 실행한다.
go test -v . : 현재 경로에 있는 go 테스트 파일을 실행하는데, -v(verbosed 약자) 옵션으로 추가 정보를 표시한다. (테스트 파일안에 잇는 각 함수에 대한 테스트 결과 표시)
go test -cover . : 현재 경로에 있는 테스트 코드들이 얼마나 test 되었는지 %(백분율)로 보여줌.
go test -coverprofile=coverage.out : coverage 정보를 coverage.out이라는 파일을 만들어 저장시켜줌
go tool cover -html=coverage.out : coverage.out이라는 파일을 html기반으로 크롬에서 보기 쉽게 해줌(크롬으로 열어보면 테스트된 부분을 표시해줌)
go tool cover -html=coverage.out -o cover.html : coverage.out 파일을 html형식으로 만들어줌(크롬으로 열어보면 테스트된 부분을 표시해줌)
#2. 테스트 실습
maim.go와 main_test.go로 테스트 실습.
package main
import "fmt"
func main() {
n := 2
_, msg := isPrime(n)
fmt.Println(msg)
}
func isPrime(n int) (bool, string) {
// 0과 1 처리(0과 1은 소수가 아님)
if n == 0 || n == 1 {
return false, fmt.Sprintf("%d is not prime, by definition!", n)
}
// 0보다 작은 수의 경우
if n < 0 {
return false, "Negative numbers are not prime, by definition!"
}
// 소수인지 아닌지 체크
for i := 2; i <= n/2; i++ {
if n%i == 0 {
// 소수가 아닌 경우
return false, fmt.Sprintf("%d is not a prime number because it is divisible by %d", n, i)
}
}
//소수인 경우
return true, fmt.Sprintf("%d is a prime number!", n)
}
1. main.go 파일
소수인지 체크하는 프로그램으로써. 소수인 경우, 소수가 아닌 경우, 0과1인 경우, 0보다작은 경우(-1)를 체크한다.
이 main.go로 테스트 파일을 만들어보면.
package main
import "testing"
func Test_isPrime(t *testing.T) {
/* 0인 경우 테스트 */
result, msg := isPrime(0)
// isPrime 함수에 0을 넣고 result에 false를 예상했지만 true를 얻은 경우 테스트 실패
if result {
t.Errorf("with %d as test parameter, got true, but expected false", 0)
}
// isPrime 함수에 0을 넣고 msg에 "0 is not prime, by definition!"를 예상했지만 틀린 경우 테스트 실패
if msg != "0 is not prime, by definition!" {
t.Error("wrong message returned:", msg)
}
/* 7인 경우 테스트 */
result, msg = isPrime(7)
// isPrime 함수에 7을 넣고 result에 true를 예상했지만 false를 얻은 경우 테스트 실패
if !result {
t.Errorf("with %d as test parameter, got false, but expected true", 7)
}
// isPrime 함수에 7을 넣고 msg에 "7 is a prime number!"를 예상했지만 틀린 경우 테스트 실패
if msg != "7 is a prime number!" {
t.Error("wrong message returned:", msg)
}
/* -1인 경우 테스트 */
result, msg = isPrime(-1)
// isPrime 함수에 -1을 넣고 result에 false를 예상했지만 true를 얻은 경우 테스트 실패
if result {
t.Errorf("with %d as test parameter, got true, but expected false", -1)
}
// isPrime 함수에 -1을 넣고 msg에 "Negative numbers are not prime, by definition!"를 예상했지만 틀린 경우 테스트 실패
if msg != "Negative numbers are not prime, by definition!" {
t.Error("wrong message returned:", msg)
}
/* 10인 경우 테스트 */
result, msg = isPrime(10)
// isPrime 함수에 10을 넣고 result에 false를 예상했지만 true를 얻은 경우 테스트 실패
if result {
t.Errorf("with %d as test parameter, got true, but expected false", 10)
}
// isPrime 함수에 10을 넣고 msg에 "10 is not a prime number because it is divisible by 2"를 예상했지만 틀린 경우 테스트 실패
if msg != "10 is not a prime number because it is divisible by 2" {
t.Error("wrong message returned:", msg)
}
}
2. main_test.go 파일
isPrime함수에 0, 7, -1, 10을 넣었을때의 경우를 테스트, 즉 모든 예외의 경우를 테스트 함.
그러나 이렇게 하나씩 짜는건 매우 비효율적 이므로 "테이블 테스트" 방식으로 짜는게 더 간단해짐.
#3. 결과
1. go test -v, go test -cover 명령어로 테스트 범위와 통과 확인.
2. go test . -coverprofile=coverage.out 명령어로 coverage.out 파일을 만들어줌
3. go tool cover -html=coverage.out(윈도우에서는 .out없이) 명령어로 html 파일로 확인. (초록색 부분이 cover(테스트 코드 작성 완료))
출처
https://www.udemy.com/course/introduction-to-testing-in-go-golang/
'프로그래밍 > Go(golang) 테스트 공부' 카테고리의 다른 글
#4. golang 채널과 고루틴을 사용하는 함수에 대한 테스트 코드(with 유데미) (0) | 2023.11.12 |
---|---|
#3. golang 사용자 입력에 대한 테스트 코드(with 유데미) (0) | 2023.11.11 |
#2. golang 터미널에 대한 출력을 확인하는 테스트(with 유데미) (0) | 2023.11.06 |
#1. golang 테이블 드리븐 테스트(with 유데미) (0) | 2023.10.30 |