#0. 테이블 드리븐 테스트(Table Driven Test)

테이블 드리븐 테스트란 함수에 대한 여러 입력 값과 예상 결과를 배열이나 슬라이스와 같은 데이터 구조를 사용하여 입력 값과 예상 결과를 나열하고, 각 입력 값에 대한 예상 결과를 검증하는 테스트 기법.

 

#1. 실습

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) {
	primeTests := []struct {
		name     string
		testNum  int
		expected bool
		msg      string
	}{
    	// 1. testNum의 이름, 2. 테스트할 값, 3. 예상되는 값(bool), 4. 예상되는 msg(string)
		{"prime", 7, true, "7 is a prime number!"},
		{"not prime", 8, false, "8 is not a prime number because it is divisible by 2!"},
		{"zero", 0, false, "0 is not prime, by definition!"},
		{"one", 1, false, "1 is not prime, by definition!"},
		{"negative number", -11, false, "Negative numbers are not prime, by definition!"},
	}

	for _, e := range primeTests {
		//테스트 값을 넣어주고 반환값을 얻음
		result, msg := isPrime(e.testNum)
		// 예상되는 값(bool)이 true 이지만 false를 얻은 경우 테스트 실패
		if e.expected && !result {
			t.Errorf("%s: expected true but got false", e.name)
		}
		// 예상되는 값(bool)이 false 이지만 true를 얻은 경우 테스트 실패
		if !e.expected && result {
			t.Errorf("%s: expected false but got true", e.name)
		}

		// 반환된 값(string)과 예상되는 값(string) 메세지가 다른 경우 테스트 실패
		if e.msg != msg {
			t.Errorf("%s: expected %s but got %s", e.name, e.msg, msg)
		}
	}
}

2. main_test.go 파일(func Test_isPrime)

primeTests라는 구조체 슬라이스를 만들어 줍니다. name(값 이름),  testNum(테스트할 값), expected(예상되는 값), msg(예상되는 값(메시지)) 형식으로 값을 넣어 주고, primeTests를 반복문 으로 돌면서 primeTests 구조체 슬라이스 안에 있는 예상되는 값들과 isPrime함수에 testNum(테스트할 값)을 넣고 반환되는 값을 비교하면서 테스트를 실행 합니다.

 

#2. 결과

테스트 통과

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/

#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