#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/

+ Recent posts