Rust数据模拟库fakedata_generator的使用:快速生成测试数据的Rust插件库

Rust数据模拟库fakedata_generator的使用:快速生成测试数据的Rust插件库

data generator for Rust

关于

这个库提供了生成随机值(“假数据”)的功能。它还处于早期阶段,有些值还没有完全随机化。基本文档如下。

使用

将库作为依赖项添加到你的Cargo.toml中。

[dependencies]
fakedata_generator = "0.4"

现在可以用use fakedata_generator::*加载库。

extern crate fakedata_generator;
use fakedata_generator::*;

fn main() {
    let random_word = gen_enum("some,random,words".to_string());
    println!("Random word is: {}", random_word); 
}

生成器

无参数生成器

email

返回一个随机电子邮件地址,它是用户名和域名生成器的组合。

函数签名

gen_email() -> String

示例调用

let email: String = gen_email();
// email = shaneIxD@we.net

username

返回一个随机用户名。

函数签名

gen_username() -> String

示例调用

let user: String = gen_username();
// user = ahmadajmi

domain

返回一个随机域名。

函数签名

gen_domain() -> String

示例调用

let domain: String = gen_domain();
// domain = "names.us"

http method

从定义的列表中返回一个随机HTTP方法。

函数签名

gen_http_method() -> String

示例调用

let method: String = gen_http_method();
// method = "GET"

ipv4

返回一个随机IP地址。

函数签名

gen_ipv4() -> String

示例调用

let ip: String = gen_ipv4();
// ip = "168.11.40.75"

gen_prime

随机返回前1000个素数之一。

函数签名

gen_prime() -> usize

示例调用

let prime: usize = gen_prime();
// prime = 6323

有参数生成器

enum

从指定的字符串集合中返回随机字符串。

函数签名

gen_enum(input: String) -> String

示例调用

let word: String = gen_enum("hello,hola,hallo".to_string());
// word = "hola"

int

返回范围内的随机整数。

函数签名

gen_int(input: String) -> String

示例调用

let num: String = gen_enum("1,100".to_string());
// num = "42"

private ipv4

在以下3个范围内创建私有IPv4地址。

函数签名

gen_private_ip(input: usize) -> String

示例调用

let private_ipv4: String = gen_private_ipv4(10);
// num = 10.64.197.255

passwords

无特殊字符

创建一个随机字符串。

函数签名

gen_password(input: usize) -> String

示例调用

let pw: String = gen_password(32);
// pw = "bNNpAmShvQYbKbMdhByK17lqaFcgarrF"
有特殊字符

创建一个带特殊字符的随机字符串。

函数签名

gen_password_with_special_chars(input: usize) -> String

示例调用

let pw: String = gen_password_with_special_chars(32);
// pw = "F=>:e+KX;Uu/Zg#i*MQN//6r%a^K?K°0"

Corpora生成器

gen_switch函数从Corpora项目中获取JSON格式的数据。

函数签名

gen_switch(input: String) -> String

示例调用

let word: String = gen_switch("cat".to_string());
// word = "European Shorthair"

let fabric: String = gen_switch("fabric".to_string());
// word = "longcloth"

完整示例代码

extern crate fakedata_generator;
use fakedata_generator::*;

fn main() {
    // 生成随机邮箱
    let email = gen_email();
    println!("生成的随机邮箱: {}", email);
    
    // 生成随机用户名
    let username = gen_username();
    println!("生成的随机用户名: {}", username);
    
    // 生成随机域名
    let domain = gen_domain();
    println!("生成的随机域名: {}", domain);
    
    // 生成随机HTTP方法
    let http_method = gen_http_method();
    println!("生成的随机HTTP方法: {}", http_method);
    
    // 生成随机IPv4地址
    let ipv4 = gen_ipv4();
    println!("生成的随机IPv4地址: {}", ipv4);
    
    // 生成随机素数
    let prime = gen_prime();
    println!("生成的随机素数: {}", prime);
    
    // 从给定选项中随机选择
    let choice = gen_enum("选项A,选项B,选项C".to_string());
    println!("随机选择的选项: {}", choice);
    
    // 生成1-100范围内的随机整数
    let random_num = gen_int("1,100".to_string());
    println!("1-100范围内的随机数: {}", random_num);
    
    // 生成私有IPv4地址
    let private_ip = gen_private_ipv4(10);
    println!("生成的私有IPv4地址: {}", private_ip);
    
    // 生成16位随机密码(无特殊字符)
    let password = gen_password(16);
    println!("16位随机密码(无特殊字符): {}", password);
    
    // 生成16位随机密码(含特殊字符)
    let special_password = gen_password_with_special_chars(16);
    println!("16位随机密码(含特殊字符): {}", special_password);
    
    // 从Corpora数据集中获取随机值
    let animal = gen_switch("cat".to_string());
    println!("随机动物种类: {}", animal);
}

1 回复

Rust数据模拟库fakedata_generator使用指南

fakedata_generator是一个用于快速生成测试数据的Rust库,特别适合在开发和测试阶段使用。它可以生成各种类型的随机数据,包括姓名、地址、电子邮件、日期等。

安装

在Cargo.toml中添加依赖:

[dependencies]
fakedata_generator = "0.1"

基本用法

1. 生成随机姓名

use fakedata_generator::name;

fn main() {
    let full_name = name::full_name();
    println!("随机姓名: {}", full_name);
    
    let first_name = name::first_name();
    println!("名: {}", first_name);
    
    let last_name = name::last_name();
    println!("姓: {}", last_name);
}

2. 生成随机地址

use fakedata_generator::address;

fn main() {
    let street_address = address::street_address();
    println!("街道地址: {}", street_address);
    
    let city = address::city();
    println!("城市: {}", city);
    
    let country = address::country();
    println!("国家: {}", country);
    
    let postal_code = address::postal_code();
    println!("邮政编码: {}", postal_code);
}

3. 生成随机互联网相关数据

use fakedata_generator::internet;

fn main() {
    let email = internet::email();
    println!("电子邮件: {}", email);
    
    let username = internet::username();
    println!("用户名: {}", username);
    
    let domain = internet::domain();
    println!("域名: {}", domain);
    
    let ipv4 = internet::ipv4();
    println!("IPv4地址: {}", ipv4);
}

高级用法

1. 自定义数据生成器

use fakedata_generator::Generator;

fn main() {
    let mut generator = Generator::new();
    
    // 添加自定义规则
    generator.add_rule("product_code", |_| {
        format!("PRD-{:04}", rand::random::<u16>() % 10000)
    });
    
    let product_code = generator.generate("product_code");
    println!("产品代码: {}", product_code);
}

2. 生成结构化数据

use fakedata_generator::{name, address, internet};
use serde::{Serialize, Deserialize};

#[derive(Serialize, Deserialize, Debug)]
struct User {
    id: u32,
    name: String,
    email: String,
    address: String,
    phone: String,
}

fn generate_user(id: u32) -> User {
    User {
        id,
        name: name::full_name(),
        email: internet::email(),
        address: format!("{}, {}, {}", 
            address::street_address(), 
            address::city(), 
            address::country()),
        phone: format!("+1-{}-{}-{}", 
            rand::random::<u16>() % 900 + 100, 
            rand::random::<u16>() % 900 + 100, 
            rand::random::<u16>() % 9000 + 1000),
    }
}

fn main() {
    let user = generate_user(1);
    println!("生成用户: {:#?}", user);
}

3. 生成批量测试数据

use fakedata_generator::{name, internet};

fn generate_users(count: usize) -> Vec<(String, String)> {
    (0..count)
        .map(|_| (name::full_name(), internet::email()))
        .collect()
}

fn main() {
    let users = generate_users(5);
    for (i, (name, email)) in users.iter().enumerate() {
        println!("用户 {}: {} <{}>", i + 1, name, email);
    }
}

支持的生成器类型

fakedata_generator支持多种数据类型的生成:

  • 姓名(全名、名、姓)
  • 地址(街道、城市、国家、邮编)
  • 互联网相关(邮箱、用户名、域名、IP)
  • 日期和时间
  • 数字(整数、浮点数)
  • 文本(段落、句子、单词)
  • 布尔值
  • 颜色(十六进制、RGB)
  • 公司信息(名称、标语)

本地化支持

可以通过设置locale来生成特定语言环境的数据:

use fakedata_generator::{name, Generator};

fn main() {
    let mut generator = Generator::new();
    generator.set_locale("zh_CN");
    
    let chinese_name = name::full_name();
    println!("中文姓名: {}", chinese_name);
}

性能考虑

对于需要生成大量测试数据的场景,建议:

  1. 重用Generator实例
  2. 批量生成数据
  3. 考虑使用多线程生成数据

fakedata_generator是一个轻量级库,非常适合在测试环境中使用,可以帮助开发者快速构建测试数据集,提高开发效率。

完整示例代码

下面是一个综合使用fakedata_generator生成完整测试数据的示例:

use fakedata_generator::{name, address, internet, date};
use serde::{Serialize, Deserialize};
use rand::Rng;

#[derive(Serialize, Deserialize, Debug)]
struct Employee {
    id: u32,
    personal_info: PersonalInfo,
    contact_info: ContactInfo,
    employment_details: EmploymentDetails,
}

#[derive(Serialize, Deserialize, Debug)]
struct PersonalInfo {
    name: String,
    gender: String,
    birth_date: String,
    ssn: String,
}

#[derive(Serialize, Deserialize, Debug)]
struct ContactInfo {
    email: String,
    phone: String,
    address: String,
}

#[derive(Serialize, Deserialize, Debug)]
struct EmploymentDetails {
    department: String,
    position: String,
    salary: f64,
    hire_date: String,
}

fn generate_employee(id: u32) -> Employee {
    let mut rng = rand::thread_rng();
    
    // 生成性别
    let gender = if rng.gen_bool(0.5) { "Male" } else { "Female" };
    
    // 生成SSN (模拟)
    let ssn = format!("{:03}-{:02}-{:04}", 
        rng.gen_range(100..999),
        rng.gen_range(10..99),
        rng.gen_range(1000..9999));
    
    Employee {
        id,
        personal_info: PersonalInfo {
            name: name::full_name(),
            gender: gender.to_string(),
            birth_date: date::birthdate(18..65), // 18-65岁之间的生日
            ssn,
        },
        contact_info: ContactInfo {
            email: internet::email(),
            phone: format!("+1-{}-{}-{}", 
                rng.gen_range(200..999),
                rng.gen_range(200..999),
                rng.gen_range(1000..9999)),
            address: format!("{}, {}, {} {}", 
                address::street_address(),
                address::city(),
                address::state(),
                address::postal_code()),
        },
        employment_details: EmploymentDetails {
            department: match rng.gen_range(0..5) {
                0 => "Engineering",
                1 => "Marketing",
                2 => "Sales",
                3 => "HR",
                _ => "Finance",
            }.to_string(),
            position: match rng.gen_range(0..4) {
                0 => "Manager",
                1 => "Developer",
                2 => "Designer",
                _ => "Analyst",
            }.to_string(),
            salary: rng.gen_range(30000..150000) as f64,
            hire_date: date::past_date(0..3650), // 过去0-3650天内的日期
        },
    }
}

fn main() {
    // 生成10个员工测试数据
    let employees: Vec<Employee> = (1..=10)
        .map(|id| generate_employee(id))
        .collect();
    
    // 打印生成的员工数据
    for emp in employees {
        println!("{:#?}\n", emp);
    }
    
    // 也可以将数据序列化为JSON保存
    // let json = serde_json::to_string_pretty(&employees).unwrap();
    // std::fs::write("employees.json", json).unwrap();
}

这个完整示例展示了如何:

  1. 生成结构化的员工测试数据
  2. 组合使用多种数据生成器(name, address, internet, date)
  3. 使用随机数生成更真实的数据
  4. 生成批量测试数据
  5. 支持将数据序列化为JSON格式保存
回到顶部