SoFunction
Updated on 2025-05-11

Detailed explanation of ten ways for Python Faker to generate test data

Introduction

10 advanced tips for generating test data in Python Faker library

from faker import Faker
import pandas as pd
import json
from datetime import datetime
# Create a Faker instancefake = Faker('zh_CN')  # Use Chinese localization# Generate basic personal informationdef generate_user():
    return {
        "name": (),
        "address": (),
        "email": (),
        "phone_number": fake.phone_number(),
        "job": (),
        "company": (),
        "birth_date": fake.date_of_birth(minimum_age=18, maximum_age=80).isoformat(),
        "credit_card": fake.credit_card_full(),
        "profile": (nb_sentences=3)
    }
# Generate sample datasetusers = [generate_user() for _ in range(5)]
for user in users:
    print((user, ensure_ascii=False, indent=2))

1. Why test data generators are needed

During development, we often need a lot of realistic test data. Creating this data manually is time-consuming and error-prone, and using real data can pose privacy and security risks. The Faker library provides the perfect solution to generate various types of realistic and fake data.

Faker supports multiple languages ​​and locale settings, and can generate almost all types of data such as name, address, phone number, email, etc. It not only generates simple text data, but also creates complex associated data structures.

2. Installation and basic configuration

Installing Faker is very simple:

pip install faker

Basic usage examples:

from faker import Faker
# Create a Faker instancefake = Faker()  # Default English# fake = Faker('zh_CN') # Chinese# fake = Faker(['zh_CN', 'en_US']) # Multilingual# Generate basic dataprint(())          # Nameprint(())       # addressprint(())          # Text paragraphprint(())         # Emailprint(())          # date

3. Localized data generation

Faker supports more than 100 locale settings. Creating localized data is essential for international application testing:

# Use Chinese locale settingsfake_cn = Faker('zh_CN')
print(f"Chinese name: {fake_cn.name()}")
print(f"Chinese address: {fake_cn.address()}")
print(f"Chinese mobile phone: {fake_cn.phone_number()}")
# Japan Regional Settingsfake_jp = Faker('ja_JP')
print(f"Japanese name: {fake_jp.name()}")
print(f"Japanese address: {fake_jp.address()}")
# Multilingual supportmulti_fake = Faker(['en_US', 'zh_CN', 'ja_JP'])
print(multi_fake.name())  # Random use of one language

4. Custom Provider to create domain-specific data

When the built-in generator does not meet the needs, you can create a custom provider:

from  import BaseProvider
# Create a custom providerclass ProductProvider(BaseProvider):
    categories = ['Electronics', 'Household Products', 'clothing', 'food', 'books']
    electronic_products = ['cell phone', 'Laptop', 'flat', 'earphone', 'Smart Watch']
    def product_category(self):
        return self.random_element()
    def electronic_product(self):
        return self.random_element(self.electronic_products)
    def product_id(self):
        return f"PRD-{self.random_int(10000, 99999)}"
    def product_with_price(self):
        return {
            'id': self.product_id(),
            'name': f"{self.electronic_product()} {self.random_element(['Pro', 'Max', 'Ultra', 'Lite'])}",
            'price': round(self.random_number(digits=3) + self.random_element([0.99, 0.49, 0.79]), 2),
            'stock': self.random_int(0, 1000)
        }
# Add Provider to Faker instancefake = Faker()
fake.add_provider(ProductProvider)
# Use custom provider to generate dataprint(fake.product_category())
print(fake.electronic_product())
print(fake.product_id())
print(fake.product_with_price())

5. Generate consistent association data

A set of interrelated data is often needed in testing. Faker's seed mechanism ensures that multiple calls generate the same data:

# Set seeds to generate consistent data(1234)
fake = Faker()
# Create user-order-associated datadef create_user_with_orders(user_id):
    user = {
        'id': user_id,
        'name': (),
        'email': (),
        'address': ()
    }
    orders = []
    for i in range(fake.random_int(1, 5)):
        order = {
            'order_id': f"ORD-{user_id}-{i+1}",
            'user_id': user_id,
            'date': fake.date_this_year().isoformat(),
            'amount': round(fake.random_number(4)/100, 2),
            'status': fake.random_element(['Pending payment', 'Paid', 'Shipped', 'Completed'])
        }
        (order)
    return user, orders
# Generate 3 users and their ordersfor i in range(1, 4):
    user, orders = create_user_with_orders(i)
    print(f"user: {user}")
    print(f"Order: {orders}")
    print("---")

6. Integrate with Pandas to create test data frames

Combine Faker with Pandas to easily create test dataframes:

import pandas as pd
from faker import Faker
import numpy as np
fake = Faker('zh_CN')
# Create simulated sales datadef create_sales_dataframe(rows=1000):
    data = {
        'date': [fake.date_between(start_date='-1y', end_date='today') for _ in range(rows)],
        'product': [fake.random_element(['cell phone', 'computer', 'flat', 'earphone', 'watch']) for _ in range(rows)],
        'region': [() for _ in range(rows)],
        'sales_rep': [() for _ in range(rows)],
        'quantity': [fake.random_int(1, 10) for _ in range(rows)],
        'unit_price': [fake.random_int(100, 5000) for _ in range(rows)]
    }
    df = (data)
    # Add a calculated column    df['total'] = df['quantity'] * df['unit_price']
    # Make sure the date type is correct    df['date'] = pd.to_datetime(df['date'])
    # Sort by date    df = df.sort_values('date')
    return df
# Create a sales data framesales_df = create_sales_dataframe()
print(sales_df.head())
print(sales_df.info())
# Basic Statistical Analysisprint(sales_df.groupby('product')['total'].sum())
print(sales_df.groupby('region')['total'].sum().sort_values(ascending=False).head(5))

7. Bulk generation of structured JSON test data

Generate API test data and documentation examples:

import json
from faker import Faker
from datetime import datetime, timedelta
fake = Faker()
# Generate API response datadef generate_api_response(num_items=10):
    response = {
        "status": "success",
        "code": 200,
        "timestamp": ().isoformat(),
        "data": {
            "items": [generate_product() for _ in range(num_items)],
            "pagination": {
                "page": 1,
                "per_page": num_items,
                "total": fake.random_int(100, 500),
                "pages": fake.random_int(5, 50)
            }
        }
    }
    return response
def generate_product():
    return {
        "id": fake.uuid4(),
        "name": f"{fake.color_name()} {fake.random_element(['T-SHIRT', 'Pants', 'shoe', 'hat'])}",
        "description": (),
        "price": round(fake.random_number(4)/100, 2),
        "category": fake.random_element(["Men's", "Women's Clothing", "Children's Clothing", "sports", "Accessories"]),
        "rating": round((1, 5), 1),
        "reviews_count": fake.random_int(0, 1000),
        "created_at": fake.date_time_this_year().isoformat(),
        "tags": (nb=fake.random_int(1, 5))
    }
# Generate and save JSON dataapi_data = generate_api_response(5)
print((api_data, indent=2))
# Save to filewith open('sample_api_response.json', 'w') as f:
    (api_data, f, indent=2)

8. Simulate time series data

Creating time series data is critical to testing monitoring applications and data visualization:

import pandas as pd
import numpy as np
from faker import Faker
from datetime import datetime, timedelta
fake = Faker()
# Generate simulated server monitoring datadef generate_server_metrics(days=30, interval_minutes=15):
    # Calculate the total number of data points    total_points = int((days * 24 * 60) / interval_minutes)
    # Generate time series    start_date = () - timedelta(days=days)
    timestamps = [start_date + timedelta(minutes=i*interval_minutes) for i in range(total_points)]
    # Create basic trend data    base_cpu = ((0, days * , total_points)) * 15 + 40
    base_memory = ((0, days *  * 2, total_points)) * 10 + 65
    base_disk = (60, 85, total_points)  # Slow growth trend    # Add random fluctuations    cpu_usage = base_cpu + (0, 5, total_points)
    memory_usage = base_memory + (0, 3, total_points)
    disk_usage = base_disk + (0, 1, total_points)
    # Simulate occasional peaks    peak_indices = (range(total_points), size=int(total_points*0.01), replace=False)
    cpu_usage[peak_indices] += (20, 40, size=len(peak_indices))
    memory_usage[peak_indices] += (15, 25, size=len(peak_indices))
    # Make sure the values ​​are within a reasonable range    cpu_usage = (cpu_usage, 0, 100)
    memory_usage = (memory_usage, 0, 100)
    disk_usage = (disk_usage, 0, 100)
    # Create a data frame    df = ({
        'timestamp': timestamps,
        'cpu_usage': cpu_usage,
        'memory_usage': memory_usage,
        'disk_usage': disk_usage,
        'network_in': (scale=5, size=total_points),
        'network_out': (scale=3, size=total_points),
        'server_id': fake.random_element(['srv-01', 'srv-02', 'srv-03', 'srv-04']),
    })
    return df
# Generate server monitoring datametrics_df = generate_server_metrics(days=7)
print(metrics_df.head())
# Save to CSVmetrics_df.to_csv('server_metrics.csv', index=False)

9. Create user profile and behavioral data

Use Faker to build detailed user profile and behavioral data:

from faker import Faker
import random
import json
from datetime import datetime, timedelta
fake = Faker('zh_CN')
# Create user profile and associate behavior datadef generate_user_profile():
    # Basic properties    gender = fake.random_element(['male', 'female'])
    first_name = fake.first_name_male() if gender == 'male' else fake.first_name_female()
    last_name = fake.last_name()
    # Generate user's date of birth, age range 18-65    birth_date = fake.date_of_birth(minimum_age=18, maximum_age=65)
    age = (().date() - birth_date).days // 365
    # Generate geographic location    province = ()
    city = ()
    # Create interest tags    interests = fake.random_elements(
        elements=('travel', 'gourmet food', 'fitness', 'read', 'Movie', 'music', 'photography', 'game', 'Shopping', 'invest', 'science and technology', 'physical education'),
        length=(2, 5),
        unique=True
    )
    # Random income level    income_levels = ['5000 or less', '5000-10000', '10000-20000', '20000-30000', '30000 or above']
    income = fake.random_element(income_levels)
    #Educational Level    education_levels = ['high school', 'College', 'Bachelor', 'master', 'PhD']
    education = fake.random_element(education_levels)
    # Occupational Category    job = ()
    # User behavior data    visit_frequency = (1, 30)  # Number of visits per month    avg_session_time = (60, 3600)  # Average session duration (seconds)    # Preference data    preferred_categories = fake.random_elements(
        elements=('Electronics', 'clothing', 'Home', 'food', 'Beauty', 'books', 'sports', 'Mother and Baby'),
        length=(1, 4),
        unique=True
    )
    # Recent login data    last_login = fake.date_time_between(start_date='-30d', end_date='now').isoformat()
    # Purchase behavior    purchase_count = (0, 20)
    # Simulate several purchase records    purchases = []
    if purchase_count > 0:
        for _ in range(min(5, purchase_count)):
            purchase_date = fake.date_time_between(start_date='-1y', end_date='now')
            ({
                'purchase_id': fake.uuid4(),
                'date': purchase_date.isoformat(),
                'amount': round((50, 2000), 2),
                'items': (1, 10),
                'category': fake.random_element(preferred_categories) if preferred_categories else 'Uncategorized'
            })
    # Assemble the complete file    profile = {
        'user_id': fake.uuid4(),
        'username': fake.user_name(),
        'name': f"{last_name}{first_name}",
        'gender': gender,
        'birth_date': birth_date.isoformat(),
        'age': age,
        'email': (),
        'phone': fake.phone_number(),
        'location': {
            'province': province,
            'city': city,
            'address': ()
        },
        'demographics': {
            'income': income,
            'education': education,
            'occupation': job
        },
        'interests': interests,
        'behavior': {
            'visit_frequency': visit_frequency,
            'avg_session_time': avg_session_time,
            'preferred_categories': preferred_categories,
            'last_login': last_login
        },
        'purchases': {
            'count': purchase_count,
            'total_spent': round(sum(p['amount'] for p in purchases), 2) if purchases else 0,
            'recent_items': purchases
        },
        'registration_date': fake.date_time_between(start_date='-5y', end_date='-1m').isoformat(),
        'is_active': (chance_of_getting_true=90)
    }
    return profile
# Generate 10 user profilesusers = [generate_user_profile() for _ in range(10)]
# Print user profile exampleprint((users[0], ensure_ascii=False, indent=2))

10. Simulate database integration with Django

Use Faker to populate test data in Django projects:

# In management/commands/generate_fake_data.py of Django projectfrom  import BaseCommand
from faker import Faker
from  import User
from  import Profile, Product, Order, OrderItem
import random
from  import timezone
from datetime import timedelta
class Command(BaseCommand):
    help = 'Generate test data'
    def add_arguments(self, parser):
        parser.add_argument('--users', type=int, default=50, help='Number of users')
        parser.add_argument('--products', type=int, default=100, help='Product Quantity')
        parser.add_argument('--orders', type=int, default=200, help='Order Quantity')
    def handle(self, *args, **options):
        fake = Faker('zh_CN')
        num_users = options['users']
        num_products = options['products']
        num_orders = options['orders']
        ((f'Start generating{num_users}A user...'))
        # Generate user and profile        for i in range(num_users):
            username = fake.user_name()
            # Avoid duplication of usernames            while (username=username).exists():
                username = fake.user_name()
            user = .create_user(
                username=username,
                email=(),
                password='password123',  # Fixed password in the development environment to facilitate testing                first_name=fake.first_name(),
                last_name=fake.last_name(),
                date_joined=fake.date_time_between(start_date='-2y', end_date='now')
            )
            profile = (
                user=user,
                phone_number=fake.phone_number(),
                address=(),
                bio=(),
                birth_date=fake.date_of_birth(minimum_age=18, maximum_age=80)
            )
        ((f'generate{num_users}A user完成!'))
        # Generate Products        ((f'Start generating{num_products}A product...'))
        categories = ['Electronics', 'clothing', 'Home', 'food', 'Beauty', 'books', 'sports', 'Mother and Baby']
        for i in range(num_products):
            category = (categories)
            (
                name=f"{().title()} {fake.random_element(['Pro', 'Plus', 'Max', 'Mini'])}",
                description=(),
                price=round((10, 5000), 2),
                stock=(0, 1000),
                category=category,
                sku=f"SKU-{fake.random_number(digits=6)}",
                created_at=fake.date_time_between(start_date='-1y', end_date='now'),
                is_active=(chance_of_getting_true=90)
            )
        ((f'generate{num_products}A product完成!'))
        # Generate orders and order items        ((f'Start generating{num_orders}One order...'))
        users = list(())
        products = list(())
        for i in range(num_orders):
            user = (users)
            order_date = fake.date_time_between(start_date='-1y', end_date='now')
            status_choices = ['pending', 'processing', 'shipped', 'delivered', 'cancelled']
            status = (status_choices)
            # Set the corresponding date according to the order status            placed_at = order_date
            processed_at = placed_at + timedelta(hours=(1, 24)) if status != 'pending' else None
            shipped_at = processed_at + timedelta(days=(1, 3)) if status in ['shipped', 'delivered'] else None
            delivered_at = shipped_at + timedelta(days=(1, 5)) if status == 'delivered' else None
            order = (
                user=user,
                status=status,
                placed_at=placed_at,
                processed_at=processed_at,
                shipped_at=shipped_at,
                delivered_at=delivered_at,
                shipping_address=(),
                payment_method=fake.random_element(['credit_card', 'debit_card', 'paypal', 'alipay', 'wechat_pay']),
                shipping_fee=round((0, 50), 2)
            )
            # Generate 1-5 order items for each order            items_count = (1, 5)
            order_products = (products, items_count)
            for product in order_products:
                quantity = (1, 5)
                price_at_purchase =  * (1 - (0, 0.2))  #Mock Discount                (
                    order=order,
                    product=product,
                    quantity=quantity,
                    price_at_purchase=round(price_at_purchase, 2)
                )
            # Calculate and update the total order amount            order.total_amount = sum( * item.price_at_purchase for item in ())
            ()
        ((f'generate{num_orders}One order完成!'))
        (('All test data generation is completed!'))

11. Performance and safety precautions

When using Faker, you should pay attention to some performance and security precautions:

Performance optimization: When generating data in large batches, useseed()and a single Faker instance for performance:

# Slower way[Faker().name() for _ in range(10000)]
# Faster wayfake = Faker()
[() for _ in range(10000)]

Memory management: Use generator mode when generating large amounts of data:

def user_generator(count):
    fake = Faker()
    for _ in range(count):
        yield {
            "name": (),
            "email": (),
            "address": ()
        }
# Iterate over and not load all data at oncefor user in user_generator(1000000):
    process_user(user)  # Process one data at a time

Privacy considerations: Although it is fake data, the risk of accidental overlap between fake data and real information should be avoided.

12. Conclusion

Faker is an indispensable tool in Python development and testing. It can not only generate various types of test data, but also provide convenience for database filling, API testing, and UI development. Proficiency in Faker will significantly improve development efficiency, especially when large amounts of data are needed to test application performance, verify data processing logic, and develop user interfaces.

The above is a detailed explanation of the ten ways Python Faker generates test data. For more information about Python Faker generating test data, please follow my other related articles!