Go 트랙에서의 테스트

Exercism에서 Go 연습 문제를 테스트하는 방법을 배워요.


Exercism 프로젝트 디렉터리에서 연습 문제 디렉터리로 이동한 뒤 go test를 실행하면 Go 연습 문제를 풀 수 있어요.

cd exercism/project/directory/go/leap
go test

데이터 레이스 감지기를 사용한 테스트

go test를 실행하는 것 외에도, 일부 연습 문제는 풀이가 데이터 레이스 버그를 일으키지 않는지 확인하기 위해 데이터 레이스 감지기 플래그와 함께 실행해야 해요. 관련 연습 문제에서는 데이터 레이스 감지기 플래그 -race와 함께 테스트를 실행하라는 안내를 찾을 수 있어요. 데이터 레이스를 확인하려면 go test -race를 실행해요. 예를 들어:

cd exercism/project/directory/go/bank-account
go test -race

벤치마크 실행하기

대부분의 연습 문제에는 벤치마크가 들어 있어서, 풀이를 바꾸면 성능에 어떤 영향을 주는지 확인할 수 있어요. 연습 문제의 벤치마크를 실행하려면 연습 문제 디렉터리 안에서 go test -v --bench . --benchmem 명령을 사용해요.

다음 출력을 살펴봐요.

BenchmarkReverse-16       403594              2537 ns/op             176 B/op         34 allocs/op

이것은 벤치마크 시간을 안정적으로 측정하는 데 403594번의 반복이 걸렸다는 뜻이에요. 평균 속도는 루프 한 번에 2537ns였어요. 연산마다 34번의 메모리 할당이 일어났고, 평균 176바이트였어요.

테스트 가능한 예제

예제 테스트는 일부 연습 문제에서 사용되며, 표준 연습 문제 테스트와 함께 실행돼요. 이 예제는 연습 문제의 API를 문서화하고 검증하는 데 쓰이며, 기대하는 연습 문제 API가 무엇인지 파악하는 데 유용할 수 있어요.

go fmt

코드를 제출하기 전에 go fmt를 실행해 주세요.

힌트와 팁

연습 문제 코딩하기

각 연습 문제의 README.md에는 일반적인 설명이 있지만, Go 테스트 프로그램은 훨씬 구체적이에요. 테스트 프로그램을 열어서 잠깐 살펴봐요. 반칙처럼 느껴져도 일단 해봐요. 도움이 되는 주석과 테스트 데이터, 그리고 테스트 함수들의 이름만이라도 찾아봐요. 아무것도 작성하기 전에 go test를 실행해서 오류 메시지가 어디서부터 시작해야 할지 알려주는지 확인해 봐요.

첫 번째 목표는 테스트에 실패하더라도 일단 컴파일되는 무언가를 만드는 거예요. 그러려면 함수를 "스텁"으로 만들어야 해요. 그 말은, 반환해야 하는 값만 빼고 본문을 비워 두라는 뜻이에요. 컴파일이 되게 하려고 그냥 return 0이나 return "", 또는 아무거나 써요. 때로는 함수 시그니처를 알아내기 위해 테스트 프로그램으로 돌아가서 더 자세히 읽어야 할 때도 있어요. 필요한 함수 시그니처를 모두 파악하고 나면, 테스트 프로그램은 0이 잘못된 답이라고 알려줄 거예요. 이제 함수 본문을 채우기 시작해요.

고치기

테스트는 보통 첫 번째 오류에서 멈춰요. 그 오류 하나를 고치고, 오류가 없어질 때까지 반복해요. go test에는 유용한 옵션이 있어요. go test -v는 더 자세한 출력을 보여줘요. go test -run <regexp>는 이름이 <regexp>와 일치하는 테스트만 실행해요.

패닉은 출력이 아주 많아요. 처음에는 무서워 보일 수 있지만, 용기를 내봐요. 패닉 출력의 맨 위에서 패닉 메시지를 확인해요. 그러면 문제에 대한 일반적인 설명을 알 수 있어요. 그다음 나머지를 읽으면서 여러분의 코드가 처음 등장하는 부분을 찾아요. 그러면 대개 문제를 정확히 짚어줘요.

동시성 프로그램의 문제를 찾으려면 go test -race를 시도해 봐요.

코드 정리하기

다시 한번 말할게요, go fmt를 실행해요. Golint는 go fmt가 잡지 못하는 코드 스타일 문제를 알려줄 수 있어요. 코드의 잠재적인 문제를 경고하는 go vet도 살펴볼 수 있어요. 코드 리뷰에서 자주 나오는 의견을 읽고 마음에 새겨봐요. 동시성이 관련된 연습 문제라면, 테스트를 통과하더라도 go test -race를 시도해 봐요. 벤치마크 성능을 위해 최적화하더라도 가독성을 염두에 둬요. 최적화가 때로는 간결하고 읽기 쉬운 해법을 발견하도록 도와줄 수 있지만, 성능을 쫓다 보면 가독성을 포기하고 싶은 유혹이 생길 수 있어요.

보너스 테스트

몇몇 연습 문제에는 go test만으로는 실행되지 않는 보너스 테스트가 있어요. 일반 연습 문제와 함께 보너스 연습 문제도 풀고 있다면, go test -tags bonus를 입력하거나 테스트 프로그램 문서에 나와 있는 비슷한 명령을 입력해야 해요.