テスト用のダミーデータくらいAIに作らせましょう

こんにちは。
機能の実装やテストを行う時はテストデータ(ダミーデータ)が必要になるもんですが、
まさか未だに手打ちしてませんよね？
先日知り合いが負荷テスト用のデータを手打ちで作っているところを目撃してしまい、とても悲しくなりました。

pythonでrandomを利用して作るのもありですが、ファイルを生成するコードの書き方は分かっていても毎回新しく書くのはめんどくさいですよね。
データのバリエーションを増やしたい場合は特にそうです。

そんな時はもうAIに任せましょう。
例えば全てのユーザーの中から渋谷に住んでいる人だけを探す機能を実装する時は日本の住所のデータが欲しいですよね。
できれば100万人分くらい。

100万人分の住所データを用意するのは簡単です。
AIに「各行が日本の住所であるCSVファイル作成して。100万行で」と質問しましょう。
そうしたらCSVファイルを作成するpythonコードを書いてくれます。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4043411/1d5cc6e2-0d8d-435b-be0d-574dd5a58480.png)


↓Claudeが書いてくれたCSVファイル生成コード
```python:make_test_data.py
import random
import csv

# Define components for Japanese addresses
prefectures = [
    '東京都', '大阪府', '京都府', '北海道', '愛知県', '神奈川県', '埼玉県', '千葉県', 
    '兵庫県', '福岡県', '宮城県', '広島県', '沖縄県', '静岡県', '茨城県', '岡山県'
]

tokyo_wards = [
    '渋谷区', '新宿区', '中央区', '港区', '千代田区', '豊島区', '目黒区', '世田谷区',
    '杉並区', '板橋区', '練馬区', '足立区', '葛飾区', '江戸川区', '品川区', '大田区',
    '文京区', '台東区', '墨田区', '江東区', '荒川区', '北区', '中野区'
]

other_cities = [
    '札幌市', '仙台市', 'さいたま市', '千葉市', '横浜市', '川崎市', '相模原市', '新潟市',
    '静岡市', '浜松市', '名古屋市', '京都市', '大阪市', '堺市', '神戸市', '岡山市',
    '広島市', '福岡市', '北九州市', '熊本市'
]

districts = [
    '中央', '北', '南', '東', '西', '上', '下', '緑', '青葉', '宮前', '高津', '多摩',
    '麻生', '都島', '福島', '此花', '旭', '城東', '鶴見', '住之江', '住吉', '東淀川'
]

areas = [
    '神宮前', '代々木', '表参道', '恵比寿', '六本木', '銀座', '丸の内', '大手町', '有楽町',
    '日本橋', '秋葉原', '東京', '札幌', '博多', '天神', '栄', '難波', '心斎橋', '梅田',
    '天王寺', '三宮', '元町', '北浜', '本町', '四条', '烏丸', '御所', '祇園', '中洲'
]

street_nums = ['1', '2', '3', '4', '5', '6', '7', '8', '9']
building_nums = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12']

def generate_tokyo_address():
    ward = random.choice(tokyo_wards)
    area = random.choice(areas)
    street = random.choice(street_nums)
    building = random.choice(building_nums)
    return f'東京都{ward}{area}{street}-{building}-{random.randint(1, 20)}'

def generate_other_address():
    prefecture = random.choice([p for p in prefectures if p != '東京都'])
    city = random.choice(other_cities)
    district = random.choice(districts)
    street = random.choice(street_nums)
    return f'{prefecture}{city}{district}区{random.choice(areas)}{street}丁目{random.randint(1, 20)}-{random.randint(1, 30)}'

def generate_address():
    # 40% Tokyo addresses, 60% other prefectures
    if random.random() < 0.4:
        return generate_tokyo_address()
    else:
        return generate_other_address()

def create_large_address_csv(filename, num_rows=1000000):
    with open(filename, 'w', newline='', encoding='utf-8') as csvfile:
        writer = csv.writer(csvfile)
        writer.writerow(['住所'])  # Header
        
        for _ in range(num_rows):
            writer.writerow([generate_address()])
    
    print(f"Created {filename} with {num_rows} addresses")

# Usage
create_large_address_csv('japan_addresses_1m.csv', 1000000)
```

41MBでちょっと笑っちゃいました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4043411/07067467-b412-4be3-9b4c-92b48315e624.png)

make_test_data.pyで作られたファイルの中身はこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4043411/b17e3257-ad59-4284-9bc6-ca666cc5ccb7.png)


とても簡単でしょう？
これで負荷テストもバッチリです