#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 명령어로 테스트 범위와 통과 확인.
 

html 파일로 테스트 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/

+ Recent posts