Faker
Generate fake values for your tests.
module test
import khalyomede.faker { Faker }
fn test_it_generates_email() {
mut fake := Faker{}
email := fake.email()
// ...
}
Summary
About
I created this package to avoid having to hard code testing values, like UUIDs, words, first names, ... When testing my features.
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
Disclaimer
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()
Use this library solely within your "*_test.v" file.
Installation
Using V installer
In your root folder, open a terminal and run this command:
v install khalyomede.faker
Manual installation
- 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
Examples
- 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)
Base URL
module test
import khalyomede.faker { Faker }
fn test_it_generates_base_url() {
mut fake := Faker{}
base_url := fake.base_url()
}
Boolean
module test
import khalyomede.faker { Faker }
fn test_it_returns_a_value() {
mut fake := Faker{}
terms_of_use_accepted := fake.boolean()
// ...
}
City
module test
import khalyomede.faker { Faker }
fn test_it_generates_city() {
mut fake := Faker{}
city := fake.city()
// ...
}
Company name
module test
import khalyomede.faker { Faker }
fn test_it_generates_company_name() {
mut fake := Faker{}
company := fake.company_name()
// ...
}
Country code
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)
// ...
}
Country name
module test
import khalyomede.faker { Faker }
fn test_it_generates_country_name() {
mut fake := Faker{}
name := fake.country_name()
// ...
}
Currency code
module test
import khalyomede.faker { Faker }
fn test_it_generates_currency_code() {
mut fake := Faker{}
code := fake.currency_code()
// ...
}
Currency symbol
module test
import khalyomede.faker { Faker }
fn test_it_generates_currency_symbol() {
mut fake := Faker{}
symbol := fake.currency_symbol()
// ...
}
EAN-13
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()
// ...
}
f32
module test
import khalyomede.faker { Faker }
fn test_it_generates_f32() {
mut fake := Faker{}
number := fake.f32()
// ...
}
f32 between
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)
// ...
}
f64
module test
import khalyomede.faker { Faker }
fn test_it_generates_f64() {
mut fake := Faker{}
number := fake.f64()
// ...
}
f64 between
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)
// ...
}
First name
module test
import khalyomede.faker { Faker }
fn test_it_generates_first_name() {
mut fake := Faker{}
first_name := fake.first_name()
// ...
}
Future date
module test
import khalyomede.faker { Faker }
fn test_it_generates_future_date() {
fake := Faker{}
meeting_date := fake.future_date()
// ...
}
i16
module test
import khalyomede.faker { Faker }
fn test_it_generates_i16() {
fake := Faker{}
number := fake.i16()
// ...
}
i16 between
module test
import khalyomede.faker { Faker }
fn test_it_generates_i16_between_range() {
fake := Faker{}
number := fake.i16_between(min: -121, max: 595)
// ...
}
i32
module test
import khalyomede.faker { Faker }
fn test_it_generates_i32() {
fake := Faker{}
number := fake.i32()
// ...
}
i32 between
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)
// ...
}
i64
module test
import khalyomede.faker { Faker }
fn test_it_generates_i64() {
fake := Faker{}
number := fake.i64()
// ...
}
i64 between
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)
// ...
}
i8
module test
import khalyomede.faker { Faker }
fn test_it_generates_i8() {
fake := Faker{}
number := fake.i8()
// ...
}
i8 between
module test
import khalyomede.faker { Faker }
fn test_it_generates_i8_between_range() {
fake := Faker{}
number := fake.i8_between(min: -12, max: 59)
// ...
}
IP V4
module test
import khalyomede.faker { Faker }
fn test_it_generates_ip_v4() {
mut fake := Faker{}
ip := fake.ip_v4()
// ...
}
IP V6
module test
import khalyomede.faker { Faker }
fn test_it_generates_ip_v6() {
mut fake := Faker{}
ip := fake.ip_v6()
// ...
}
Job title
module test
import khalyomede.faker { Faker }
fn test_it_generates_job_title() {
mut fake := Faker{}
job := fake.job_title()
// ...
}
Hex color
module test
import khalyomede.faker { Faker }
fn test_it_generates_hex_color() {
mut fake := Faker{}
color := fake.hex_color()
// ...
}
Last name
module test
import khalyomede.faker { Faker }
fn test_it_generates_last_name() {
mut fake := Faker{}
last_name := fake.last_name()
// ...
}
Latitude
module test
import khalyomede.faker { Faker }
fn test_it_generates_latitude() {
mut fake := Faker{}
latitude := fake.latitude()
// ...
}
Longitude
module test
import khalyomede.faker { Faker }
fn test_it_generates_longitude() {
mut fake := Faker{}
longitude := fake.longitude()
// ...
}
MAC address
module test
import khalyomede.faker { Faker }
fn test_it_generates_mac_address() {
mut fake := Faker{}
mac_address := fake.mac_address()
// ...
}
Past date
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)
// ...
}
Sentence
module test
import khalyomede.faker { Faker }
fn test_it_generates_sentence() {
mut fake := Faker{}
book_excerpt := fake.sentence()
}
Street
The different with
street name
module test
import khalyomede.faker { Faker }
fn test_it_generates_street() {
mut fake := Faker{}
street := fake.street()
// ...
}
Street name
The different with
street
module test
import khalyomede.faker { Faker }
fn test_it_generates_street_name() {
mut fake := Faker{}
street_name := fake.street_name()
// ...
}
Top level domain
module test
import khalyomede.faker { Faker }
fn test_it_generates_top_level_domain() {
mut fake := Faker{}
top_level_domain := fake.top_level_domain()
// ...
}
u16
module test
import faker { Faker }
fn test_it_generates_u16() {
mut fake := Faker{}
number := fake.u16()
// ...
}
u16 between
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)
// ...
}
u32
module test
import faker { Faker }
fn test_it_generates_u32() {
mut fake := Faker{}
number := fake.u32()
// ...
}
u32 between
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)
// ...
}
u64
module test
import faker { Faker }
fn test_it_generates_u64() {
mut fake := Faker{}
number := fake.u64()
// ...
}
u64 between
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)
// ...
}
u8
module test
import faker { Faker }
fn test_it_generates_u8() {
mut fake := Faker{}
number := fake.u8()
// ...
}
u8 between
module test
import faker { Faker }
fn test_it_generates_u8_between_two_numbers() {
mut fake := Faker{}
number := fake.u8_between(min: 12, max: 50)
// ...
}
User agent
module test
import khalyomede.faker { Faker }
fn test_it_generates_user_agent() {
mut fake := Faker{}
user_agent := fake.user_agent()
// ...
}
UUID v4
module test
import khalyomede.faker { Faker }
fn test_it_returns_url() {
fake := Faker{}
payment_id := fake.uuid_v4()
// ...
}
Visa credit card number
module test
import khalyomede.faker { Faker }
fn test_it_generates_visa_credit_card_number() {
mut fake := Faker{}
credit_card := fake.visa_credit_card_number()
// ...
}
Word
module test
import khalyomede.faker { Faker }
fn test_it_generates_word() {
mut fake := Faker{}
book_category := fake.word()
// ...
}
Zip code
module test
import khalyomede.faker { Faker }
fn test_it_generates_zip_code() {
mut fake := Faker{}
zip_code := fake.zip_code()
// ...
}
### Switching language
From instanciation
module test
import khalyomede.faker { Faker }
fn test_it_switches_language() {
mut fake := Faker{lang: .en}
// ...
}
In between tests
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)
// ...
}
Extending/Custom fake data
Using struct inheritance
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()
// ...
}
Using a type alias
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()
}
Deterministic same values (seed)
Same random values across different tests
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
}
Clearing the seed afterward
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
}
Q&A
- Why is the fake variable mutable?
- Why can't I use this module to compile my program to a single binary?
Why is the fake variable mutable?
The
Fake{}
For example, calling 10 times
fake.first_name()
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{}
Why can't I use this module to compile my program to a single binary?
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
!string
panic()
Open question