Fuzzy attributes¶
Note
Now that FactoryBoy includes the factory.Faker
class, most of
these built-in fuzzers are deprecated in favor of their
Faker equivalents. Further
discussion here:
https://github.com/FactoryBoy/factory_boy/issues/271/
Some tests may be interested in testing with fuzzy, random values.
This is handled by the factory.fuzzy
module, which provides a few
random declarations.
Note
Use import factory.fuzzy
to load this module.
FuzzyAttribute¶
-
class
factory.fuzzy.
FuzzyAttribute
[source]¶ The
FuzzyAttribute
uses an arbitrary callable as fuzzer. It is expected that successive calls of that function return various values.-
fuzzer
¶ The callable that generates random values
-
FuzzyText¶
-
class
factory.fuzzy.
FuzzyText
(length=12, chars=string.ascii_letters, prefix='')[source]¶ The
FuzzyText
fuzzer yields random strings beginning with the givenprefix
, followed bylength
charactes chosen from thechars
character set, and ending with the givensuffix
.-
length
¶ int, the length of the random part
-
prefix
¶ text, an optional prefix to prepend to the random part
-
suffix
¶ text, an optional suffix to append to the random part
-
chars
¶ - char iterable, the chars to choose from; defaults to the list of ascii
- letters and numbers.
-
FuzzyChoice¶
-
class
factory.fuzzy.
FuzzyChoice
(choices)[source]¶ The
FuzzyChoice
fuzzer yields random choices from the given iterable.Note
The passed in
choices
will be converted into a list upon first use, not at declaration time.This allows passing in, for instance, a Django queryset that will only hit the database during the database, not at import time.
-
choices
¶ The list of choices to select randomly
-
FuzzyInteger¶
-
class
factory.fuzzy.
FuzzyInteger
(low[, high[, step]])[source]¶ The
FuzzyInteger
fuzzer generates random integers within a given inclusive range.The
low
bound may be omitted, in which case it defaults to 0:>>> fi = FuzzyInteger(0, 42) >>> fi.low, fi.high 0, 42 >>> fi = FuzzyInteger(42) >>> fi.low, fi.high 0, 42
-
low
¶ int, the inclusive lower bound of generated integers
-
high
¶ int, the inclusive higher bound of generated integers
-
step
¶ int, the step between values in the range; for instance, a
FuzzyInteger(0, 42, step=3)
might only yield values from[0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42]
.
-
FuzzyDecimal¶
-
class
factory.fuzzy.
FuzzyDecimal
(low[, high[, precision=2]])[source]¶ The
FuzzyDecimal
fuzzer generates randomdecimals
within a given inclusive range.The
low
bound may be omitted, in which case it defaults to 0:>>> FuzzyDecimal(0.5, 42.7) >>> fi.low, fi.high 0.5, 42.7 >>> fi = FuzzyDecimal(42.7) >>> fi.low, fi.high 0.0, 42.7 >>> fi = FuzzyDecimal(0.5, 42.7, 3) >>> fi.low, fi.high, fi.precision 0.5, 42.7, 3
-
low
¶ decimal, the inclusive lower bound of generated decimals
-
high
¶ decimal, the inclusive higher bound of generated decimals
-
precision
¶ -
int, the number of digits to generate after the dot. The default is 2 digits.
-
FuzzyFloat¶
-
class
factory.fuzzy.
FuzzyFloat
(low[, high])[source]¶ The
FuzzyFloat
fuzzer provides randomfloat
objects within a given inclusive range.>>> FuzzyFloat(0.5, 42.7) >>> fi.low, fi.high 0.5, 42.7 >>> fi = FuzzyFloat(42.7) >>> fi.low, fi.high 0.0, 42.7
-
low
¶ decimal, the inclusive lower bound of generated floats
-
high
¶ decimal, the inclusive higher bound of generated floats
-
FuzzyDate¶
-
class
factory.fuzzy.
FuzzyDate
(start_date[, end_date])[source]¶ The
FuzzyDate
fuzzer generates random dates within a given inclusive range.The
end_date
bound may be omitted, in which case it defaults to the current date:>>> fd = FuzzyDate(datetime.date(2008, 1, 1)) >>> fd.start_date, fd.end_date datetime.date(2008, 1, 1), datetime.date(2013, 4, 16)
-
start_date
¶ datetime.date
, the inclusive lower bound of generated dates
-
end_date
¶ datetime.date
, the inclusive higher bound of generated dates
-
FuzzyDateTime¶
-
class
factory.fuzzy.
FuzzyDateTime
(start_dt, [end_dt, ]force_year=None, force_month=None, force_day=None, force_hour=None, force_minute=None, force_second=None, force_microsecond=None)[source]¶ The
FuzzyDateTime
fuzzer generates random timezone-aware datetime within a given inclusive range.The
end_dt
bound may be omitted, in which case it defaults todatetime.datetime.now()
localized into the UTC timezone.>>> fdt = FuzzyDateTime(datetime.datetime(2008, 1, 1, tzinfo=UTC)) >>> fdt.start_dt, fdt.end_dt datetime.datetime(2008, 1, 1, tzinfo=UTC), datetime.datetime(2013, 4, 21, 19, 13, 32, 458487, tzinfo=UTC)
The
force_XXX
keyword arguments force the related value of generated datetimes:>>> fdt = FuzzyDateTime(datetime.datetime(2008, 1, 1, tzinfo=UTC), datetime.datetime(2009, 1, 1, tzinfo=UTC), ... force_day=3, force_second=42) >>> fdt.evaluate(2, None, False) # Actual code used by ``SomeFactory.build()`` datetime.datetime(2008, 5, 3, 12, 13, 42, 124848, tzinfo=UTC)
-
start_dt
¶ datetime.datetime
, the inclusive lower bound of generated datetimes
-
end_dt
¶ datetime.datetime
, the inclusive upper bound of generated datetimes
-
force_microsecond
¶ int or None; if set, forces the
microsecond
of generated datetime.
-
FuzzyNaiveDateTime¶
-
class
factory.fuzzy.
FuzzyNaiveDateTime
(start_dt, [end_dt, ]force_year=None, force_month=None, force_day=None, force_hour=None, force_minute=None, force_second=None, force_microsecond=None)[source]¶ The
FuzzyNaiveDateTime
fuzzer generates random naive datetime within a given inclusive range.The
end_dt
bound may be omitted, in which case it defaults todatetime.datetime.now()
:>>> fdt = FuzzyNaiveDateTime(datetime.datetime(2008, 1, 1)) >>> fdt.start_dt, fdt.end_dt datetime.datetime(2008, 1, 1), datetime.datetime(2013, 4, 21, 19, 13, 32, 458487)
The
force_XXX
keyword arguments force the related value of generated datetimes:>>> fdt = FuzzyNaiveDateTime(datetime.datetime(2008, 1, 1), datetime.datetime(2009, 1, 1), ... force_day=3, force_second=42) >>> fdt.evaluate(2, None, False) # Actual code used by ``SomeFactory.build()`` datetime.datetime(2008, 5, 3, 12, 13, 42, 124848)
-
start_dt
¶ datetime.datetime
, the inclusive lower bound of generated datetimes
-
end_dt
¶ datetime.datetime
, the inclusive upper bound of generated datetimes
-
force_microsecond
¶ int or None; if set, forces the
microsecond
of generated datetime.
-
Custom fuzzy fields¶
Alternate fuzzy fields may be defined.
They should inherit from the BaseFuzzyAttribute
class, and override its
fuzz()
method.
Managing randomness¶
Using random
in factories allows to “fuzz” a program efficiently.
However, it’s sometimes required to reproduce a failing test.
factory.fuzzy
uses a separate instance of random.Random
,
and provides a few helpers for this:
-
factory.fuzzy.
get_random_state
()[source]¶ Call
get_random_state()
to retrieve the random generator’s current state.
-
factory.fuzzy.
set_random_state
(state)[source]¶ Use
set_random_state()
to set a custom state into the random generator (fetched fromget_random_state()
in a previous run, for instance)
-
factory.fuzzy.
reseed_random
(seed)[source]¶ The
reseed_random()
function allows to load a chosen seed into the random generator.
Custom BaseFuzzyAttribute
subclasses SHOULD
use factory.fuzzy._random
as a randomness source; this ensures that
data they generate can be regenerated using the simple state from
get_random_state()
.