Generate fake values for your tests.
module test
import khalyomede.faker { Faker }
fn test_it_generates_email() {
mut fake := Faker{}
email := fake.email()
// ...
}I created this package to avoid having to hard code testing values, like UUIDs, words, first names, ... When testing my features.
- Provide various functions to get semi-real values
- Supports the following languages:
- English
- Consumes the least virtual memory possible
- Ensures maximum uniqueness by keeping track of already picked values
Please do not use this library in production or when compiling V to a single binary.
This library uses heavy .txt files as source of data, and they are not embeded in the final compiled binary (primarily because they would make your executable much more heavy).
Plus, for simplicity, the package immediately calls panic() for each error encountered, which is unsuitable for production.
Use this library solely within your "*_test.v" file.
In your root folder, open a terminal and run this command:
v install khalyomede.faker- Locate your V modules folder (usually in "/$USER/.vmodules", so if you're using the root user, "/root/.vmodules")
- Create a folder named "khalyomede"
- Inside "khalyomed" folder, create a folder named "faker"
- Copy the entire content of this repositor in the "$USER/.vmodules/khalyomede/faker" repository
- Fake data
- Color
- Company
- Date
- Finance
- Geographic
- Identifiers
- Math
- Boolean
- Floating numbers
- Integers
- Unsigned integers
- Network
- Physical persons
- Text
- Utilities
- Web
- Switching language
- Extending/Custom fake data
- Deterministic same values (seed)
module test
import khalyomede.faker { Faker }
fn test_it_generates_base_url() {
mut fake := Faker{}
base_url := fake.base_url()
}module test
import khalyomede.faker { Faker }
fn test_it_returns_a_value() {
mut fake := Faker{}
terms_of_use_accepted := fake.boolean()
// ...
}module test
import khalyomede.faker { Faker }
fn test_it_generates_city() {
mut fake := Faker{}
city := fake.city()
// ...
}module test
import khalyomede.faker { Faker }
fn test_it_generates_company_name() {
mut fake := Faker{}
company := fake.company_name()
// ...
}module test
import khalyomede.faker { Faker }
fn test_it_generates_country_codes() {
mut fake := Faker{}
code2 := fake.country_code(format: .alpha_2)
code3 := fake.country_code(format: .alpha_3)
// ...
}module test
import khalyomede.faker { Faker }
fn test_it_generates_country_name() {
mut fake := Faker{}
name := fake.country_name()
// ...
}module test
import khalyomede.faker { Faker }
fn test_it_generates_currency_code() {
mut fake := Faker{}
code := fake.currency_code()
// ...
}module test
import khalyomede.faker { Faker }
fn test_it_generates_currency_symbol() {
mut fake := Faker{}
symbol := fake.currency_symbol()
// ...
}module test
import khalyomede.faker { Faker }
fn test_it_generates_ean_13() {
mut fake := Faker{}
code := fake.ean_13()
// ...
}module test
import khalyomede.faker { Faker }
fn test_it_generates_email() {
mut fake := Faker{}
email := fake.email()
// ...
}module test
import khalyomede.faker { Faker }
fn test_it_generates_f32() {
mut fake := Faker{}
number := fake.f32()
// ...
}module test
import khalyomede.faker { Faker }
fn test_it_generates_f32_between_range() {
mut fake := Faker{}
number := fake.f32_between(min: -35.546, max: 106.71)
// ...
}module test
import khalyomede.faker { Faker }
fn test_it_generates_f64() {
mut fake := Faker{}
number := fake.f64()
// ...
}module test
import khalyomede.faker { Faker }
fn test_it_generates_f64_between_range() {
mut fake := Faker{}
number := fake.f64_between(min: -35_000.546, max: 106_000.71)
// ...
}module test
import khalyomede.faker { Faker }
fn test_it_generates_first_name() {
mut fake := Faker{}
first_name := fake.first_name()
// ...
}module test
import khalyomede.faker { Faker }
fn test_it_generates_future_date() {
fake := Faker{}
meeting_date := fake.future_date()
// ...
}module test
import khalyomede.faker { Faker }
fn test_it_generates_i16() {
fake := Faker{}
number := fake.i16()
// ...
}module test
import khalyomede.faker { Faker }
fn test_it_generates_i16_between_range() {
fake := Faker{}
number := fake.i16_between(min: -121, max: 595)
// ...
}module test
import khalyomede.faker { Faker }
fn test_it_generates_i32() {
fake := Faker{}
number := fake.i32()
// ...
}module test
import khalyomede.faker { Faker }
fn test_it_generates_i32_between_range() {
fake := Faker{}
number := fake.i32_between(min: -1_229, max: 5_941)
// ...
}module test
import khalyomede.faker { Faker }
fn test_it_generates_i64() {
fake := Faker{}
number := fake.i64()
// ...
}module test
import khalyomede.faker { Faker }
fn test_it_generates_i64_between_range() {
fake := Faker{}
number := fake.i64_between(min: -12_500, max: 59_000)
// ...
}module test
import khalyomede.faker { Faker }
fn test_it_generates_i8() {
fake := Faker{}
number := fake.i8()
// ...
}module test
import khalyomede.faker { Faker }
fn test_it_generates_i8_between_range() {
fake := Faker{}
number := fake.i8_between(min: -12, max: 59)
// ...
}module test
import khalyomede.faker { Faker }
fn test_it_generates_ip_v4() {
mut fake := Faker{}
ip := fake.ip_v4()
// ...
}module test
import khalyomede.faker { Faker }
fn test_it_generates_ip_v6() {
mut fake := Faker{}
ip := fake.ip_v6()
// ...
}module test
import khalyomede.faker { Faker }
fn test_it_generates_job_title() {
mut fake := Faker{}
job := fake.job_title()
// ...
}module test
import khalyomede.faker { Faker }
fn test_it_generates_hex_color() {
mut fake := Faker{}
color := fake.hex_color()
// ...
}module test
import khalyomede.faker { Faker }
fn test_it_generates_last_name() {
mut fake := Faker{}
last_name := fake.last_name()
// ...
}module test
import khalyomede.faker { Faker }
fn test_it_generates_latitude() {
mut fake := Faker{}
latitude := fake.latitude()
// ...
}module test
import khalyomede.faker { Faker }
fn test_it_generates_longitude() {
mut fake := Faker{}
longitude := fake.longitude()
// ...
}module test
import khalyomede.faker { Faker }
fn test_it_generates_mac_address() {
mut fake := Faker{}
mac_address := fake.mac_address()
// ...
}module test
import khalyomede.faker { Faker }
fn test_it_generates_past_date() {
fake := Faker{}
payment_date := fake.past_date()
}### Random element
module test
import khalyomede.faker { Faker }
fn test_it_generates_random_fruit() {
mut fake := Faker{}
fruits := ["banana", "kiwi", "apple"]
fruit := fake.random_element(fruits)
// ...
}module test
import khalyomede.faker { Faker }
fn test_it_generates_sentence() {
mut fake := Faker{}
book_excerpt := fake.sentence()
}The different with street name is street is prefixed with the street number.
module test
import khalyomede.faker { Faker }
fn test_it_generates_street() {
mut fake := Faker{}
street := fake.street()
// ...
}The different with street is street name is not prefixed with the street number.
module test
import khalyomede.faker { Faker }
fn test_it_generates_street_name() {
mut fake := Faker{}
street_name := fake.street_name()
// ...
}module test
import khalyomede.faker { Faker }
fn test_it_generates_top_level_domain() {
mut fake := Faker{}
top_level_domain := fake.top_level_domain()
// ...
}module test
import faker { Faker }
fn test_it_generates_u16() {
mut fake := Faker{}
number := fake.u16()
// ...
}module test
import faker { Faker }
fn test_it_generates_u16_between_two_numbers() {
mut fake := Faker{}
number := fake.u16_between(min: 1, max: 65_535)
// ...
}module test
import faker { Faker }
fn test_it_generates_u32() {
mut fake := Faker{}
number := fake.u32()
// ...
}module test
import faker { Faker }
fn test_it_generates_u32_between_two_numbers() {
mut fake := Faker{}
number := fake.u32_between(min: 12_500, max: 55_000)
// ...
}module test
import faker { Faker }
fn test_it_generates_u64() {
mut fake := Faker{}
number := fake.u64()
// ...
}module test
import faker { Faker }
fn test_it_generates_u64_between_two_numbers() {
mut fake := Faker{}
number := fake.u64_between(min: 1, max: 1_000_000)
// ...
}module test
import faker { Faker }
fn test_it_generates_u8() {
mut fake := Faker{}
number := fake.u8()
// ...
}module test
import faker { Faker }
fn test_it_generates_u8_between_two_numbers() {
mut fake := Faker{}
number := fake.u8_between(min: 12, max: 50)
// ...
}module test
import khalyomede.faker { Faker }
fn test_it_generates_user_agent() {
mut fake := Faker{}
user_agent := fake.user_agent()
// ...
}module test
import khalyomede.faker { Faker }
fn test_it_returns_url() {
fake := Faker{}
payment_id := fake.uuid_v4()
// ...
}module test
import khalyomede.faker { Faker }
fn test_it_generates_visa_credit_card_number() {
mut fake := Faker{}
credit_card := fake.visa_credit_card_number()
// ...
}module test
import khalyomede.faker { Faker }
fn test_it_generates_word() {
mut fake := Faker{}
book_category := fake.word()
// ...
}module test
import khalyomede.faker { Faker }
fn test_it_generates_zip_code() {
mut fake := Faker{}
zip_code := fake.zip_code()
// ...
}### Switching language
module test
import khalyomede.faker { Faker }
fn test_it_switches_language() {
mut fake := Faker{lang: .en}
// ...
}module test
import khalyomede.faker { Faker }
fn test_it_switches_language_after_generating_data() {
mut fake := Faker{lang: .en}
book_excerpt := fake.sentence()
fake.using_lang(.en)
// ...
}module test
import khalyomede.faker { Faker }
struct CustomFaker {
Faker
}
fn (mut custom_faker CustomFaker) fruit() string {
return custom_faker.random_element(["banana", "orange", "apple"])
}
fn test_it_generates_fruit() {
mut fake := CustomFaker{}
fruit := fake.fruit()
// ...
}module test
import khalyomede.faker { Faker }
type CustomFaker = Faker
fn (custom_faker CustomFaker) fruit() string {
return custom_faker.random_element(["banana", "orange", "apple"])
}
fn test_it_generates_fruit() {
mut fake := CustomFaker{}
fruit := fake.fruit()
}module test
import khalyomede.faker { Faker }
fn test_it_generates_the_same_word_as_second_test() {
mut fake := Faker{}
fake.using_seed(36)
word := fake.word() // same as second test word
}
fn test_it_generates_the_same_word_as_first_test() {
mut fake := Faker{}
fake.using_seed(36)
word := fake.word() // same as first test word
}module test
import khalyomede.faker { Faker }
fn test_it_generates_the_same_word_as_second_test() {
mut fake := Faker{}
fake.using_seed(36)
first_word := fake.word() // same as second test's first word
fake.clear_seed()
second_word := fake.word() // Different than second test's second word
}
fn test_it_generates_the_same_word_as_first_test() {
mut fake := Faker{}
fake.using_seed(36)
first_word := fake.word() // same as first test's first word
fake.clear_seed()
second_word := fake.word() // Different than first test's second word
}- Why is the fake variable mutable?
- Why can't I use this module to compile my program to a single binary?
The Fake{} instance will use caching to improve subsequent call to the same function.
For example, calling 10 times fake.first_name() will read the total number of first names once, then it will hold the number of lines in cache.
This is to help pick a random index in the range [0, number of first names].
This also prevents to store a constant with the number of fake first names in the code. Note that this caching mecanism is shared across all your fake := Faker{} instances, which limits testing slowdown to the minimum on large test suites.
Faker is a struct that takes its random values for a subset of its method from files.
This is done to help running tests on low RAM devices such as CI from Github Actions.
On a big test suite, your virtual memory consumption will be the least possible since each call to Faker method will parse the file it needs to read the data from line by line, holding a single line in memory (instead of mounting the whole 8kb+ file in memory).
Another reason is that to return plain values without error handling (string instead of !string for example), this package immediately calls panic() (for example if the text file used as data source is unreadable etc...).
Open question: Do you have this need? Should we move to embedding all fake values in V file (in source code)? Let me know your uses cases by opening an issue.