[Golang] Add a Test

개발者·2022년 2월 2일
0

Effective Go

목록 보기
1/1

Hello 함수를 이용해서 테스트를 추가해보자.

Unit 테스트를 위해 Go의 내장된 서포트가 테스트를 쉽게 만들어준다. 특히 네이밍 컨벤션, testing package, Go test command 를 이용하면 테스트를 빠르게 작성하고 수행할 수 있다.

  1. greeting 폴더에 greeting_test.go 를 만들어준다.
    파일이름 끝이 *_test.go 는 go test command에 해당 파일이 test 함수를 포함하고 있다는 것을 알려준다,
  2. greeting_test.go에는 아래와 같은 코드가 들어 있다.
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 나 예상하지 못한 값이 리턴되면 tFatalf() 를 사용해서 console에 메시지를 출력하고 실행을 종료한다.

  • TestHelloEmpty 는 빈 문자열을 갖는 Hello("") 함수를 호출한다. 해당 테스트는 에러 핸들링이 제대로 되는지 확인하기 위함이다. 만약 함수가 빈 스트링이 아니거나 error가 없다고 리턴하면, Fatalf() 를 사용해서 console에 메시지를 출력하고 실행을 종료한다.
  1. 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
  1. 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
}
  1. greetings 디렉토리에서, 테스트 함수 실행을 위해 go test command를 수행한다.

Reference

profile
solrasido

0개의 댓글