Гид по технологиям

Gofakeit: генерация реалистичных тестовых данных для Go

5 min read Development Обновлено 10 Apr 2026
Gofakeit — генерация тестовых данных для Go
Gofakeit — генерация тестовых данных для Go

Маскот Go — синий гофер на фоне столбцов зелёных символов.

Надёжные и реалистичные тестовые данные жизненно важны для проверки качества и работоспособности приложений. Умение генерировать фейковые данные, которые имитируют реальные сценарии, помогает покрыть больше кейсов при тестировании.

В стандартной библиотеке Go нет встроенных средств для генерации фейковых данных, но в экосистеме Go доступно несколько пакетов. Один из популярных — Gofakeit.

Что такое Gofakeit

Gofakeit — это пакет для генерации фейковых данных в программах на Go. Он умеет создавать случайные имена, адреса, номера телефонов, банковские карты, абстрактные тексты и многое другое. Поддерживает настройку форматов, локализацию и генерацию реалистичных дат и времени.

Превью репозитория Gofakeit на GitHub.

Установка

В каталоге вашего проекта, после инициализации модуля, выполните:

go get github.com/brianvoe/gofakeit/v6  

Импорт в коде выглядит так:

import (  
    "github.com/brianvoe/gofakeit/v6"  
)  

Быстрый старт: базовая генерация

Gofakeit предоставляет функции для многих типов данных: имена, email, телефоны, компании, фразы и т. д. Ниже — пример, который генерирует несколько значений и выводит их в консоль.

package main  
  
import (   
    "fmt"  
    "github.com/brianvoe/gofakeit/v6"  
)  
  
func main() {  
    // Generate a fake name  
    name := gofakeit.Name()  
    fmt.Println("Name:", name)  
  
    // Generate a fake email address  
    email := gofakeit.Email()  
    fmt.Println("Email:", email)  
  
    // Generate a fake phone number  
    phone := gofakeit.Phone()  
    fmt.Println("Phone:", phone)  
  
    // Generate a fake company name  
    company := gofakeit.Company()  
    fmt.Println("Company:", company)  
  
    // Generate a fake credit card number  
    creditCard := gofakeit.CreditCardNumber()  
    fmt.Println("Credit Card:", creditCard)  
  
    // Generate a fake hacker phrase  
    hackerPhrase := gofakeit.HackerPhrase()  
    fmt.Println("Hacker Phrase:", hackerPhrase)  
  
    // Generate a fake job title  
    jobTitle := gofakeit.JobTitle()  
    fmt.Println("Job Title:", jobTitle)  
  
    // Generate a fake currency abbreviation  
    currency := gofakeit.CurrencyShort()  
    fmt.Println("Currency:", currency)  
}  

Этот пример демонстрирует базовую функциональность: простая генерация и вывод. Код пригоден для быстрых демонстраций и локальных тестов.

Генерация по struct-тегам

Gofakeit умеет инициализировать поля структуры на основе специальных fake тегов. Это полезно для массового создания сущностей с реалистичными полями.

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)  
}  

Gofakeit.Struct заполняет экспортируемые поля структуры в соответствии с шаблонами в fake теге. Это удобно для создания тестовых записей одного типа.

Результат вывода данных структуры с Gofakeit.

Генерация сложных текстов

Библиотека умеет генерировать предложения, абзацы и lorem ipsum:

package main  
  
import (  
    "fmt"  
  
    "github.com/brianvoe/gofakeit/v6"  
)  
  
func generateRandomSentence() string {  
    // Generate a random sentence with 6 words  
    sentence := gofakeit.Sentence(6)  
    return sentence  
}  
  
func generateRandomParagraph() string {  
    // Generate a random paragraph with 3 sentences, each having 4 to 8 words  
    paragraph := gofakeit.Paragraph(3, 4, 8, "/n")  
    return paragraph  
}  
  
func generateLoremIpsum() string {  
    // Generate 2 paragraphs of lorem ipsum text, each having 3 to 5 sentences  
    loremIpsum := gofakeit.LoremIpsumParagraph(3, 5, 12, "\\n")  
    return loremIpsum  
}  
  
func main() {  
    // Set up the random seed for consistent results (optional)  
    gofakeit.Seed(0)  
  
    // Generate and print random sentence  
    fmt.Println("Random Sentence:")  
    fmt.Println(generateRandomSentence())  
  
    // Generate and print random paragraph  
    fmt.Println("\\nRandom Paragraph:")  
    fmt.Println(generateRandomParagraph())  
  
    // Generate and print lorem ipsum text  
    fmt.Println("\\nLorem Ipsum Text:")  
    fmt.Println(generateLoremIpsum())  
}  

Примеры выше демонстрируют, как получать локализованные тексты, блоки lorem ipsum и настраивать длину генерируемых фрагментов.

Использование для тестирования баз данных

Gofakeit удобно применять для заполнения SQL-базы тестовыми данными через пакет database/sql. Это помогает проверить индексы, ограничения целостности, работу миграций и поведение при необычных значениях.

Ключевые рекомендации:

  • Сначала используйте транзакцию и откат, чтобы не засорять тестовую БД.
  • Генерируйте наборы данных, охватывающие граничные значения (максимальная длина строк, пустые значения, необычные символы).
  • Не используйте реальные персональные данные в тестах — генерация должна исключать настоящие PII.

Практическая методология генерации тестовых данных

Шаги для повторяемого процесса создания тестовых данных:

  1. Определите набор сущностей и обязательные поля.
  2. Опишите требования по валидации (форматы, диапазоны, уникальность).
  3. Составьте шаблоны fake для структур. Для сложных зависимостей генерируйте поэтапно (создайте сначала пользователей, затем связанные записи).
  4. Используйте фиксированную seed для детерминированных тестов и случайные seed для нагрузочного тестирования.
  5. Загружайте данные в транзакции и проверяйте поведение миграций.

Когда генерация фейковых данных не подойдёт

  • Для тестов, где требуется точная реалистичная статистика (например, реальные временные зависимости продаж) — простая генерация может искажать распределения.
  • Для стресс-тестов реального кластера с крупными данными — простая локальная генерация может быть слишком медленной; лучше использовать специализированные конвейеры и параллелизацию.
  • Если нужен строгий соответствующий реальным PII набор данных — не используйте настоящие данные без согласия и обработки.

Альтернативные подходы и пакеты

  • Стандартный пакет testing + table-driven тесты: для юнит-тестирования логики.
  • Faker-пакеты: github.com/jaswdr/faker, github.com/bxcodec/faker — альтернативы с разной функциональностью.
  • Специализированные генераторы данных для нагрузочного тестирования и симуляции трафика.

Рекомендации по безопасности и конфиденциальности

  • Никогда не смешивайте реальные PII с сгенерированными данными в одной тестовой выборке.
  • Для данных, моделирующих личные данные, применяйте анонимизацию и псевдонимизацию.
  • Если тесты выполняются в облаке, храните генераторы и seed в безопасном хранилище и ограничьте доступ.

Критерии приёмки для тестовой выборки

  • Набор данных покрывает валидные, невалидные и граничные состояния для каждой сущности.
  • Все уникальные ограничения в БД проверены (конфликты по уникальным индексам).
  • Тесты с детерминированным seed дают ожидаемые результаты при повторном запуске.
  • Генерация данных выполняется в пределах допустимого времени для CI-пайплайна.

Роль‑ориентированные чеклисты

Разработчик:

  • Написать unit-тесты с небольшими наборами сгенерированных данных.
  • Использовать фиктивный seed для детерминированности.

Тестировщик:

  • Создать наборы с краевыми значениями и строками с Unicode и спецсимволами.
  • Проверить уникальные индексы и поведение при коллизиях.

Инженер DevOps:

  • Интегрировать генерацию данных в CI с ограничением по времени.
  • Убедиться, что тестовые данные не попадают в прод.

Тестовые сценарии и критерии приёмки

  • Тест: заполнение таблицы users 10k строк — критерий: вставка завершена за N минут (зависит от окружения).
  • Тест: валидация email — критерий: 95% сгенерированных email проходят базовую регулярную проверку.
  • Тест: уникальность ключа — критерий: при попытке вставить записи с одинаковым уникальным полем БД выбрасывает ошибку.

Краткое глоссарий в одну строку

  • Seed — начальное значение для генератора случайных чисел, делает выводы детерминированными.
  • fake-тег — строка в struct-теге, указывающая шаблон для генерации поля.

FAQ

Как использовать сгенерированные данные в тестах?

Пишите unit- и интеграционные тесты, подставляйте в них сгенерированные значения для проверки отдельных и составных частей приложения.

Какие ещё инструменты предоставляет Go для тестирования?

Пакет testing поддерживает unit-тесты, бенчмарки и fuzz-тестирование; он хорошо сочетается с генераторами данных.

Почему lorem ipsum всё ещё используется?

Lorem ipsum — удобный шаблон-заполнитель: он выглядит как текст, но не содержит осмысленного содержания, поэтому подходит для макетов и тестов интерфейсов.

Конец и краткое резюме

Gofakeit — гибкий инструмент для создания разнообразных тестовых данных в Go. Он хорошо подходит для unit-, интеграционных тестов и подготовки тестовых баз данных. Для критичных сценариев дополняйте генерацию моделями распределения и избегайте использования реальных персональных данных.

Important: проверяйте соответствие сгенерированных данных требованиям вашей модели данных и правилам безопасности.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

CSS font-family: как менять шрифты на сайте
Frontend

CSS font-family: как менять шрифты на сайте

График амортизации кредита в Excel — пошагово
Финансы

График амортизации кредита в Excel — пошагово

Разгон Raspberry Pi 4 — безопасный пошаговый гид
Аппаратное обеспечение

Разгон Raspberry Pi 4 — безопасный пошаговый гид

Как запустить Windows 11 на Mac — варианты и советы
Mac

Как запустить Windows 11 на Mac — варианты и советы

Мошенничество с возвратом средств через техподдержку
Безопасность

Мошенничество с возвратом средств через техподдержку

Диагональная обрезка в Canva — как сделать эффектно
Дизайн

Диагональная обрезка в Canva — как сделать эффектно