Goでダミーデータを作成するなら gofakeit を使おう

こんにちは。ATOM開発チームの上野です。

ATOMには、お客様の広告アカウントの実績データをBigQueryに連携する機能があります。 この機能をお客様に紹介するため、サンプルとなるデータセットを構築する必要がありました。 そこで、ランダムなデータを簡単に生成できる go fakeit を活用することにしました。

go fakeit は、Goで簡単にランダムなデータを生成できるライブラリです。 名前、メールアドレス、住所、クレジットカード情報など、多様なデータを生成できるだけでなく、独自に定義したデータ構造にも対応可能です。 今回は go fakeit の基本的な使い方を紹介します。


go fakeit のインストール

まず、以下のコマンドで go fakeit をインストールします。

$ go get github.com/brianvoe/gofakeit/v7

go fakeit の基本機能

1. モックデータの作成

開発中のAPIのテスト時に、go fakeit を使ってリアルなモックデータを作成できます。

package main

import (
    "fmt"
    "github.com/brianvoe/gofakeit/v7"
)

type User struct {
    FirstName string `fake:"{firstname}"`
    LastName  string `fake:"{lastname}"`
    Email     string `fake:"{email}"`
}

func main() {
    var user User
    gofakeit.Struct(&user)
    fmt.Printf("ユーザーデータ: %+v\n", user)
}

実行結果(例):

ユーザーデータ: {FirstName:Emily LastName:Smith Email:emily.smith@example.com}

2. Fake(f *gofakeit.Faker) の実装

カスタム型のデータを生成するには、Fake メソッドを実装します。

type CustomData struct {
    Value string
}

func (c *CustomData) Fake(f *gofakeit.Faker) {
    c.Value = f.LoremIpsumSentence(3)
}

3. カスタム関数の追加

独自のカスタム関数を登録し、特定のデータを生成することも可能です。

gofakeit.AddFuncLookup("customword", gofakeit.Info{
    Category:    "custom",
    Description: "Generates a custom word",
    Generate: func(r *gofakeit.Faker) interface{} {
        return "customWord"
    },
})
fmt.Println(gofakeit.Get("customword"))

その他の機能については、公式のFunctions (README)も参照してください。


実戦の例: 広告アカウントの実績データを生成する

1. ダミーデータをCSV形式で出力

システムの負荷テストやデータの可視化のために、大量のダミーデータをCSV形式で出力することも可能です。

package main

import (
    "encoding/csv"
    "fmt"
    "os"
    "github.com/brianvoe/gofakeit/v7"
)

type Campaign struct {
    CampaignID   string  `fake:"{uuid}"`
    Date         string  `fake:"{date}"`
    Impressions  int     `fake:"{number:1000,50000}"`
    Clicks       int     `fake:"{number:10,5000}"`
    Conversions  int     `fake:"{number:1,500}"`
}

func generateCSV(filename string, records int) error {
    file, err := os.Create(filename)
    if err != nil {
        return err
    }
    defer file.Close()

    writer := csv.NewWriter(file)
    defer writer.Flush()

    // ヘッダーを書き込む
    writer.Write([]string{"CampaignID", "Date", "Impressions", "Clicks", "Conversions"})

    for i := 0; i < records; i++ {
        var campaign Campaign
        gofakeit.Struct(&campaign)

        writer.Write([]string{
            campaign.CampaignID,
            campaign.Date,
            fmt.Sprintf("%d", campaign.Impressions),
            fmt.Sprintf("%d", campaign.Clicks),
            fmt.Sprintf("%d", campaign.Conversions),
        })
    }
    return nil
}

func main() {
    if err := generateCSV("campaign.csv", 100); err != nil {
        fmt.Println("CSV生成エラー:", err)
    } else {
        fmt.Println("CSVファイル campaign.csv を作成しました。")
    }
}

このコードを実行すると、campaign.csv に100件の広告アカウントのダミーデータが書き出されます。 実際の運用では、生成したデータをGoogle Cloud Storageにアップロードし、BigQueryにロードすることでサンプルデータセットを提供できます。


まとめ

go fakeit は、開発やテストのためにリアルなデータを簡単に生成できる便利なライブラリです。 特に、構造体に対して自動的にデータを埋められる機能はとても便利です。

また、対応していないデータタイプがある場合でも、独自の関数を追加することで柔軟に対応できるのも魅力です。

開発・テストの効率化に go fakeit をぜひ活用してみてください!