Hello 함수를 이용해서 테스트를 추가해보자.
Unit 테스트를 위해 Go의 내장된 서포트가 테스트를 쉽게 만들어준다. 특히 네이밍 컨벤션, testing package, Go test command 를 이용하면 테스트를 빠르게 작성하고 수행할 수 있다.
greeting
폴더에 greeting_test.go 를 만들어준다.*_test.go
는 go test command에 해당 파일이 test 함수를 포함하고 있다는 것을 알려준다,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)
}
}
테스트 코드.
-테스트 함수는 테스트 할 코드와 같은 패키지 안에서 수행한다.
greetings.Hello
함수를 테스트 하기 위해 두가지의 테스트 함수를 만들었다. 테스트 함수는 Test*
의 어떤 테스트를 명시하는 이름 형태를 갖는다. 또한, test 함수는 testing 패키지의 testing 포인터를 갖는다. 매개변수로 testring의 T타입을 갖는데 이것을 사용해서 리포팅하거나 로깅을 할 수 있다.
두 테스트는 다음과 같다.
-TestHelloName
은 유효한 값을 응답하는 name 값을 갖는 Hello("Gladys")
함수를 호출한다. 만약 error 나 예상하지 못한 값이 리턴되면 t
의 Fatalf()
를 사용해서 console에 메시지를 출력하고 실행을 종료한다.
TestHelloEmpty
는 빈 문자열을 갖는 Hello("")
함수를 호출한다. 해당 테스트는 에러 핸들링이 제대로 되는지 확인하기 위함이다. 만약 함수가 빈 스트링이 아니거나 error가 없다고 리턴하면, Fatalf()
를 사용해서 console에 메시지를 출력하고 실행을 종료한다.greetings
디렉토리에서 테스트를 수행하기 위해 command line을 입력한다.go test
command 는 test file 안에 있는 test 함수를 실행한다. -v
flag 를 추가하면 모든 테스트의 리스트와 결과를 얻을 수 있다.
테스트는 반드시 pass 해야 한다.
$ go test
PASS
ok example.com/greetings 0.364s
$ go test -v
=== RUN TestHelloName
--- PASS: TestHelloName (0.00s)
=== RUN TestHelloEmpty
--- PASS: TestHelloEmpty (0.00s)
PASS
ok example.com/greetings 0.372s
greetings.Hello
함수를 망가뜨려서 실패 테스트를 해보자.TestHelloName
는 리턴 값을 체크한다. 실패 테스트 결과를 얻기 위해 greetings.Hello
함수가 더 이상 name을 포함하지 않게 수정한다.
greetings/greetings.go
에서 다음 코드를 Hello(name string)
대신 교체한다. 초록색으로 되어있는 부분이 의도적으로 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
}
greetings
디렉토리에서, 테스트 함수 실행을 위해 go test
command를 수행한다.