Go로 가짜 테스트 데이터를 생성하는 방법
앱의 품질과 기능을 확실히 하려면, 신뢰성 있고 실질적인 테스트 데이터는 필수적입니다. 실제 상황을 모방한 가짜 데이터를 만드는 것은 여러 종류의 테스트에 아주 유용한 기술입니다.
표준 라이브러리에서는 가짜 데이터 생성을 직접 지원하지 않지만, Go 생태계 내에는 이를 위한 다양한 패키지들이 있습니다. 그 중에서도 널리 사용되는 패키지 중 하나가 바로 Gofakeit입니다.
Gofakeit 시작하기

Gofakeit은 Go 프로그램에서 가상 데이터를 만들어내기 위한 도구입니다.
이 패키지는 다양한 유형의 무작위 데이터 생성과 더불어, 특정 형식 준수, 현지화 지원, 그리고 실제와 유사한 시간 및 날짜 생성과 관련된 사용자 정의 옵션을 폭넓게 제공합니다.
새로운 Go 프로젝트를 시작한 후, 프로젝트 디렉토리에서 다음 명령어를 실행하여 Gofakeit을 외부 의존성으로 추가합니다.
go get github.com/brianvoe/gofakeit/v6
Gofakeit을 의존성으로 설정한 후에는, 아래와 같이 패키지를 불러올 수 있습니다.
import (
"github.com/brianvoe/gofakeit/v6"
)
전반적으로, Gofakeit은 가짜 데이터 생성 패키지에 필요한 대부분의 기능을 제공합니다.
Gofakeit을 이용한 기본적인 가짜 데이터 생성
Gofakeit은 이름, 이메일 주소, 전화번호, 회사명 등 다양한 종류의 데이터를 생성하는 데 사용할 수 있습니다.
다음은 Gofakeit을 사용하여 기본 가짜 데이터를 생성하는 방법입니다.
package main
import (
"fmt"
"github.com/brianvoe/gofakeit/v6"
)
func main() {
name := gofakeit.Name()
fmt.Println("Name:", name)
email := gofakeit.Email()
fmt.Println("Email:", email)
phone := gofakeit.Phone()
fmt.Println("Phone:", phone)
company := gofakeit.Company()
fmt.Println("Company:", company)
creditCard := gofakeit.CreditCardNumber()
fmt.Println("Credit Card:", creditCard)
hackerPhrase := gofakeit.HackerPhrase()
fmt.Println("Hacker Phrase:", hackerPhrase)
jobTitle := gofakeit.JobTitle()
fmt.Println("Job Title:", jobTitle)
currency := gofakeit.CurrencyShort()
fmt.Println("Currency:", currency)
}
주요 함수에서는 Gofakeit을 사용하여 여러 가지 가짜 값을 만들고, fmt 패키지의 Println 함수를 통해 콘솔에 출력합니다.
Gofakeit은 다양한 필드에 대한 가짜 데이터를 생성하기 위해 구조체 태그를 제공합니다. 이러한 구조체 태그를 사용하면, Gofakeit이 해당 필드를 가짜 데이터로 채웁니다.
import (
"fmt"
"time"
"github.com/brianvoe/gofakeit/v6"
)
type Person struct {
ID string `fake:"{uuid}"`
FirstName string `fake:"{firstname}"`
LastName string `fake:"{lastname}"`
Age int `fake:"{number:18,60}"`
Email string `fake:"{email}"`
Address string `fake:"{address}"`
CreatedAt time.Time `fake:"{date}"`
}
func main() {
var person Person
gofakeit.Struct(&person)
fmt.Printf("ID: %s\n", person.ID)
fmt.Printf("First Name: %s\n", person.FirstName)
fmt.Printf("Last Name: %s\n", person.LastName)
fmt.Printf("Age: %d\n", person.Age)
fmt.Printf("Email: %s\n", person.Email)
fmt.Printf("Address: %s\n", person.Address)
fmt.Printf("Created At: %s\n", person.CreatedAt)
}
Person 구조체의 각 필드에는 가짜 데이터 생성을 위한 구조체 태그가 설정되어 있습니다. 메인 함수 내에서 person 변수는 Person 구조체의 인스턴스를 나타냅니다.
gofakeit.Struct 메서드는 구조체의 공개된 필드를 해당 필드의 가짜 태그 값을 기반으로 임의의 데이터로 채웁니다. 그 다음으로, 주 함수는 생성된 구조체 필드 값을 콘솔에 출력합니다.

복잡한 가짜 데이터 생성
Gofakeit을 활용하면, Sentence, Paragraph, 그리고 LoremIpsumParagraph 함수를 이용하여 문장, 단락, 그리고 로렘 입숨 텍스트를 포함하는 복잡한 가짜 데이터를 생성할 수 있습니다.
package main
import (
"fmt"
"github.com/brianvoe/gofakeit/v6"
)
func generateRandomSentence() string {
sentence := gofakeit.Sentence(6)
return sentence
}
func generateRandomParagraph() string {
paragraph := gofakeit.Paragraph(3, 4, 8, "/n")
return paragraph
}
func generateLoremIpsum() string {
loremIpsum := gofakeit.LoremIpsumParagraph(3, 5, 12, "\n")
return loremIpsum
}
func main() {
gofakeit.Seed(0)
fmt.Println("Random Sentence:")
fmt.Println(generateRandomSentence())
fmt.Println("\nRandom Paragraph:")
fmt.Println(generateRandomParagraph())
fmt.Println("\nLorem Ipsum Text:")
fmt.Println(generateLoremIpsum())
}
generateRandomSentence 함수는 Gofakeit의 Sentence 함수를 이용하여 임의의 문장을 생성합니다. generateRandomParagraph 함수는 Paragraph 함수를 이용하여 임의의 단락을 생성합니다.
generateLoremIpsum 함수는 LoremIpsumParagraph 함수를 사용하여 무작위 로렘 입숨 단락을 생성합니다.
메인 함수에서는 generateRandomSentence, generateRandomParagraph 및 generateLoremIpsum 함수를 호출합니다. 프로그램은 이러한 함수의 결과를 콘솔에 출력합니다.
데이터베이스 테스트를 위한 가짜 데이터 생성
Gofakeit은 동적인 데이터 생성을 통해 테스트 과정을 간소화하고, 다양한 요구사항과의 호환성을 보장합니다.
Go에 내장된 database/sql 패키지를 사용하여 가짜 데이터를 SQL 데이터베이스에 채울 수 있습니다. 이를 통해 다양한 엣지 케이스를 테스트하고 데이터베이스 보안을 강화할 수 있습니다.
자주 묻는 질문
Q: 이 가짜 테스트 데이터는 어떻게 사용하나요?
단위 테스트를 작성하고 가짜 테스트 데이터를 제공함으로써, 프로그램의 작고 독립적인 부분이 올바르게 작동하는지 확인할 수 있습니다.
Q: Go에서는 어떤 테스트 패키지를 제공하나요?
Go는 테스트 패키지를 통해 강력한 내장 지원 기능을 제공합니다. 이를 통해 코드의 성능을 측정하고, 퍼징을 활용하여 다양한 테스트 데이터를 생성하고, 테스트를 구조화된 계층으로 관리할 수 있습니다.
Q: 로렘 입숨의 유래는 무엇인가요?
로렘 입숨은 개발자와 디자이너들이 실제 텍스트 대신 임시로 사용하는 일반적인 자리 표시자 텍스트입니다. 가짜 텍스트라는 점이 명확하기 때문에 유용하지만, 실제 텍스트와 유사한 형태를 유지합니다.