Package: autofaker
AutoFaker is a Python library designed to minimize the setup/arrange phase of your unit tests by removing the need to manually
write code to create anonymous variables as part of a test cases setup/arrange phase.This library is heavily inspired byAutoFixtureand was initially created
for simplifying how to write unit tests for ETL (Extract-Transform-Load) code running from a python library on an
Apache Spark cluster in Big Data solutions.When writing unit tests you normally start with creating objects that represent the initial state of the test.
This phase is called thearrangeor setup phase of the test.
In most cases, the system you want to test will force you to specify much more information than you really care about,
so you frequently end up creating objects with no influence on the test itself just simply to satisfy the compiler/interpreterAutoFakeris available from PyPI and should be installed usingpippip install autofakerAutoFaker can help by creating such anonymous variables for you. Here's a simple example:importunittestfromautofakerimportAutodataclassCalculator:defadd(self,number1:int,number2:int):returnnumber1+number2classCalculatorTests(unittest.TestCase):deftest_can_add_two_numbers(self):# arrangenumbers=Autodata.create_many(int,2)sut=Autodata.create(Calculator)# actresult=sut.add(numbers[0],numbers[1])# assertself.assertEqual(numbers[0]+numbers[1],result)Since the point of this library is to simplify thearrangestep of writing unit tests, we can use the@autodataand@fakedataare available to explicitly state
whether to use anonymous variables or fake data and construct our system under test.
To use this you can either define the types or the arguments as function arguments to the decorator, or specify
argument annotationsimportunittestfromautofakerimportautodataclassCalculator:defadd(self,number1:int,number2:int):returnnumber1+number2classCalculatorTests(unittest.TestCase):@autodata(Calculator,int,int)deftest_can_add_two_numbers_using_test_arguments(self,sut,number1,number2):result=sut.add(number1,number2)self.assertEqual(number1+number2,result)@autodata()deftest_can_add_two_numbers_using_annotated_arguments(self,sut:Calculator,number1:int,number2:int):result=sut.add(number1,number2)self.assertEqual(number1+number2,result)There are times when completely anonymous variables don't make much sense, especially in data centric scenarios.
For these use cases this library usesFakerfor generating fake data. This option
is enabled by settinguse_fake_datatoTruewhen calling theAutodata.create()functionfromdataclassesimportdataclassfromautofakerimportAutodata@dataclassclassDataClass:id:intfirst_name:strlast_name:straddress:strjob:strdata=Autodata.create(DataClass,use_fake_data=True)print(f'id:{data.id}')print(f'name:{data.name}')print(f'job:{data.job}\n')The following code above might output something like:id:     8952
name:   Justin Wise
job:    Chief Operating OfficerSupported data typesCurrently autofaker supports creating anonymous variables for the following data types:Built-in types:intfloatstrcomplexrangebytesbytearrayDatetime types:datetimedateClasses:Simple classes@dataclassNested classes (and recursion)Classes containing lists of other typesEnum classesDataframes:Pandas dataframeExample usagesCreate anonymous built-in types likeint,float,strand datetime types likedatetimeanddateprint(f'anonymous string:{Autodata.create(str)}')print(f'anonymous int:{Autodata.create(int)}')print(f'anonymous float:{Autodata.create(float)}')print(f'anonymous complex:{Autodata.create(complex)}')print(f'anonymous range:{Autodata.create(range)}')print(f'anonymous bytes:{Autodata.create(bytes)}')print(f'anonymous bytearray:{Autodata.create(bytearray)}')print(f'anonymous datetime:{Autodata.create(datetime)}')print(f'anonymous date:{Autodata.create(datetime.date)}')The code above might output the followinganonymous string:    f91954f1-96df-463f-a427-665c99213395
anonymous int:       2066712686
anonymous float:     725758222.8712853
anonymous datetime:  2017-06-19 02:40:41.000084
anonymous date:      2019-11-10 00:00:00Creates an anonymous classclassSimpleClass:id=-1text='test'cls=Autodata.create(SimpleClass)print(f'id ={cls.id}')print(f'text ={cls.text}')The code above might output the followingid = 2020177162
text = ac54a65d-b4a3-4eda-a840-eb948ad10d5fCreate a collection of an anonymous classclassSimpleClass:id=-1text='test'classes=Autodata.create_many(SimpleClass)forclsinclasses:print(f'id ={cls.id}')print(f'text ={cls.text}')print()The code above might output the followingid = 242996515
text = 5bb60504-ccca-4104-9b7f-b978e52a6518

id = 836984239
text = 079df61e-a87e-4f26-8196-3f44157aabd6

id = 570703150
text = a3b86f08-c73a-4730-bde7-4bdff5360ef4Creates an anonymous dataclassfromdataclassesimportdataclass@dataclassclassDataClass:id:inttext:strcls=Autodata.create(DataClass)print(f'id ={cls.id}')print(f'text ={cls.text}')The code above might output the followingid = 314075507
text = 4a3b3cae-f4cf-4502-a7f3-61115a1e0d2aCreates an anonymous dataclass using fake data@dataclassclassDataClass:id:intname:straddress:strjob:strcountry:strcurrency_name:strcurrency_code:stremail:strsafe_email:strcompany_email:strhostname:stripv4:stripv6:strtext:strdata=Autodata.create(DataClass,use_fake_data=True)print(f'id:{data.id}')print(f'name:{data.name}')print(f'job:{data.job}\n')print(f'address:\n{data.address}\n')print(f'country:{data.country}')print(f'currency name:{data.currency_name}')print(f'currency code:{data.currency_code}\n')print(f'email:{data.email}')print(f'safe email:{data.safe_email}')print(f'work email:{data.company_email}\n')print(f'hostname:{data.hostname}')print(f'IPv4:{data.ipv4}')print(f'IPv6:{data.ipv6}\n')print(f'text:\n{data.text}')The code above might output the followingid:               8952
name:             Justin Wise
job:              Chief Operating Officer

address:
65939 Hernandez Parks
Rochaport, NC 41760

country:          Equatorial Guinea
currency name:    Burmese kyat
currency code:    ERN

email:            smithjohn@example.com
safe email:       kent11@example.com
work email:       marissagreen@brown-cole.com

hostname:         db-90.hendricks-west.org
IPv4:             66.139.143.242
IPv6:             895d:82f7:7c13:e7cb:f35d:c93:aeb2:8eeb

text:
Movie author culture represent. Enjoy myself over physical green lead but home.
Share wind factor far minute produce significant. Sense might fact leader.Create an anonymous class with nested typesclassNestedClass:id=-1text='test'inner=SimpleClass()cls=Autodata.create(NestedClass)print(f'id ={cls.id}')print(f'text ={cls.text}')print(f'inner.id ={cls.inner.id}')print(f'inner.text ={cls.inner.text}')The code above might output the followingid = 1565737216
text = e66ecd5c-c17a-4426-b755-36dfd2082672
inner.id = 390282329
inner.text = eef94b5c-aa95-427a-a9e6-d99e2cc1ffb2Create a collection of an anonymous class with nested typesclassNestedClass:id=-1text='test'inner=SimpleClass()classes=Autodata.create_many(NestedClass)forclsinclasses:print(f'id ={cls.id}')print(f'text ={cls.text}')print(f'inner.id ={cls.inner.id}')print(f'inner.text ={cls.inner.text}')print()The code above might output the followingid = 1116454042
text = ceeecf0c-7375-4f3a-8d4b-6d7a4f2b20fd
inner.id = 1067027444
inner.text = 079573ce-1ef4-408d-8984-1dbc7b0d0b80

id = 730390288
text = ff3ca474-a69d-4ff6-95b4-fbdb1bea7cdb
inner.id = 1632771208
inner.text = 9423e824-dc8f-4145-ba47-7301351a91f8

id = 187364960
text = b31ca191-5031-43a2-870a-7bc7c99e4110
inner.id = 1705149100
inner.text = e703a117-ba4f-4201-a31b-10ab8e54a673Create a Pandas DataFrame using anonymous data generated from a specified typeclassDataClass:id=-1type=''value=0pdf=Autodata.create_pandas_dataframe(DataClass)print(pdf)The code above might output the followingid                                  type       value
0  778090854  13537c5a-62e7-488b-836e-a4b17f2f3ae9  1049015695
1  602015506  c043ca8d-e280-466a-8bba-ec1e0539fe28  1016359353
2  387753717  986b3b1c-abf4-4bc1-95cf-0e979390e4f3   766159839Create a Pandas DataFrame using fake data generated from a specified typeclassDataClass:id=-1type=''value=0pdf=Autodata.create_pandas_dataframe(DataClass,use_fake_data=True)print(pdf)The code above might output the followingfirst_name    id last_name          phone_number
0   Lawrence  7670   Jimenez  001-172-307-0561x471
1      Bryan  9084    Walker         (697)893-6767
2       Paul  9824    Thomas    960.555.3577x65487For tips and tricks on software development, check outmy blogIf you find this useful and feel a bit generous then feel free tobuy me a coffee ☕