우리가 작성한 코드에 테스트 코드를 추가해보자.

Go는 더 쉽게 unit 테스트를 할 수 있도록 기본 제공한다.
특히 이름 지정규칙, Go의 테스트 패키지 및 go test 명령을 사용하면 테스트를 빠르게 작성 및 실행할 수 있다.

1. greetings 폴더로 이동해서 greetings_test.go 파일을 만들어보자.
go 에서는 파일명이 _test.go로 끝날 경우 go는 go test를 command를 통해 테스트를 실행한다. 

2. greetings_test.go에 아래 코드를 작성한다.

- 테스트 중인 코드와 동일한 패키지 내에 테스트 기능을 구현한다.
- Hello 함수를 테스트 하는 두개의 테스트 함수를 만든다. 이때 테스트 함수의 이름형식은 TestName 이며, 여기서 Name은 고유한 값이다.
- 테스트 함수는 테스트 패키지의 포인터를 사용한다.
- T는 매개변수로 이 매개 변수의 메소드를 이용해서 테스트 결과를 확인할 수 있다.

2-1. TestHelloName
Hello 함수를 호출한다. name에 값을 대입해서 테스트하면, 유효한 message가 리턴되어야 한다.
만약 에러나 예상치 못한 응답 메세지가 왔다면, T 매개변수의 Fatalif 메소드를 사용해 콘솔에 메세지를 표시하고 실행이 종료된다.

2-2. TestHelloEmpty
빈값으로 Hello 함수를 호출한다. 정상적으로 error 로직이 구현되어 있는지 확인할 수 있는 테스트 케이스이다.
만약 리턴값으로 빈값이 아닌 String이나 no error가 리턴될경우 위와 같이 T 매개변수의 Fatalif 메소드에 의해 테스트 종료된다.

package greetings

import (
    "testing"
    "regexp"
)

// TestHelloName calls greetings.Hello with a name, checking 
// for a valid return value.
func TestHelloName(t *testing.T) {
    name := "Gladys"
    want := regexp.MustCompile(`\b`+name+`\b`)
    msg, err := Hello("Gladys")
    if !want.MatchString(msg) || err != nil {
        t.Fatalf(`Hello("Gladys") = %q, %v, want match for %#q, nil`, msg, err, want)
    }
}

// TestHelloEmpty calls greetings.Hello with an empty string, 
// checking for an error.
func TestHelloEmpty(t *testing.T) {
    msg, err := Hello("")
    if msg != "" || err == nil {
        t.Fatalf(`Hello("") = %q, %v, want "", error`, msg, err)
    }
}

 

3. greetings 폴더의 커맨드 라인에서  go test 명령어를 이용해 테스트를 실행해보자.
go test 는 파일 이름이 _test.go로 끝나는 파일 내에 이름이 Test로 시작하는 test function 들을 실행시킨다.
-v 0옵션을 줘서 모든 테스트와 그 결과를 나열하는 자세한 결과를 확인할 수도 있다.

4. 실패 테스트를 작성해보자.
TestHelloName 함수는 Hello function에서 넘겨 받은 특정 name을 확인한다.
실패한 경우를 확인해보려면 greetings.Hello 함수에 이름이 더이상 포함되지 않도록 변경한다.
greetings/greetings.go 파일로 이동해서 아래 코드를 수정해보자.
기존에  message := fmt.Sprintf(randomFormat(), name) 이부분을 제거한다.

// Hello returns a greeting for the named person.
func Hello(name string) (string, error) {
    // If no name was given, return an error with a message.
    if name == "" {
        return name, errors.New("empty name")
    }
    // Create a message using a random format.
    // message := fmt.Sprintf(randomFormat(), name)
    message := fmt.Sprint(randomFormat())
    return message, nil
}

 

5. greetings 폴더의 command로 가서 다시 go test를 실행해보자.
만약 테스트가 실패할경우엔 -v 표시 없이도 실패한 메서드에 대한 자세한 정보를 확인할 수 있다.
우리가 수정한대로, TestHelloName 는 실패했고 기존의 TestHelloEmpty는 그대로 성공한 것을 확인할 수 있다.

 

+ Recent posts