Skip to main content

Easily generate random unicode test data among other things

Project description

Testdata

Generate Random Test Data.

These are just a bunch of handy functions designed to make it easier to test your code.

To use testdata in your tests, just import it into your testing module:

import testdata

To install, use Pip:

pip install testdata

Or, with Pip using Github:

pip install --upgrade "git+https://github.com/Jaymon/testdata#egg=testdata"

Functionality

This is an overview of some of the functions and classes found in the Testdata module, there are other functions (like get_birthday) that aren't listed here, for the complete list just look at the source. Any methods on any child class that extends testdata.base.TestData will be available at testdata.<METHOD-NAME>.

patch

Patching modules and classes

patch(mod, **patches)

Patches a module, instance, or class with the given patches.

Suppose you had a module like this:

# module foo.bar

def boom():
    return 1

class FooPatch(object):
    @classmethod
    def bam(cls): return boom()

Now you can easily patch it for testing:

def mock_boom():
    return 2

foo_bar = testdata.patch('foo.bar', boom=mock_boom)
print foo_bar.FooPatch.bam() # 2

# but you can also just pass in objects or modules

from foo.bar import FooPatch
FooPatch = testdata.patch(FooPatch, boom=mock_boom)
print FooPatch.bam() # 2

from foo import bar
bar = testdata.patch(bar, boom=mock_boom)
print bar.FooPatch.bam() # 2

Patching class instances

You can also patch a specific instance

Suppose you had a module like this:

# module foo.bar

class Foo(object):
    def boom(self): return 1

Now you can easily patch it for testing:

def mock_boom():
    return 2

foo = Foo()
foo_patched = testdata.patch(foo, boom=mock_boom)
print foo_patched.boom() # 2

# be aware though, the original instance was modified, foo_patched == foo
print foo.boom() # 2

run

Run a command on the command line

r = testdata.run("echo 1")
print(r) # 1

fetch

Request a url

r = testdata.fetch("http://example.com")
print(r.code) # 200
print(r.body) # the html body of example.com

capture

Output buffering, handy when you want to make sure logging or print statements are doing what you think they should be doing.

with testdata.capture() as c:
    print("foo")
if "foo" in c:
    print("foo was captured")

Threading

A wrapper around python's builtin threading.Thread class that bubbles errors up to the main thread because, by default, python's threading classes suppress errors, this makes it annoying when using threads for testing. NOTE - This is buggier than I would like.

def run():
    raise ValueError("join_2")

thread = testdata.Thread(target=run)
thread.start()
print(thread.exception)

File Server

Sometimes you need to test fetching remote files

import requests

server = testdata.create_fileserver({
    "foo.txt": ["foo"],
    "bar.txt": ["bar"],
})

with server: # the with handles starting and stopping the server
    res = testdata.fetch(server.url("foo.txt"))
    print(res.body) # foo

environment

Change your environment with this context manager, if you don't pass in an object as the first value it will default to os.environ

with testdata.enviroment(FOO=1):
    print(os.environ["FOO"]) # 1
print(os.environ["FOO"]) # raises KeyError

# you can also modify objects:

d = {}

with testdata.enviroment(d, FOO=1):
    print(d["FOO"]) # 1
print(d["FOO"]) # raises KeyError

create_dir

create_dir(path="", tmpdir="")

create a directory hierarchy

base_dir = "/tmp"
d = testdata.create_dir("/foo/bar", base_dir)
print d # /tmp/foo/bar

create_dirs

create_dirs(dirs, tmpdir="")

Create a bunch of files and folders

testdata.create_dirs({
  "foo": {
    "bar": {
      "che.txt": ["line 1", "line 2"],
    }
  }
})

create_file

create_file(data="", path="", tmpdir="", encoding="")

create a file with contents

base_dir = "/tmp"
f = testdata.create_file(path="/foo/bar.txt", data="The file contents", tmpdir=base_dir)
print f # /tmp/foo/bar.txt

create_files

create_files(file_dict, tmpdir="")

Create a whole bunch of files, the file_dict key is the filename, the value is the contents of the file. The file_dict is very similar to the create_modules param module_dict

file_dict = {
    "foo/bar.txt": "the foo file contents",
    "baz.txt": "the baz file contents",
}
f = testdata.create_files(file_dict)

get_file

get_file(path="", tmpdir="")

This will return a Filepath instance that you can manipulate but unlike create_file it won't actually create the file, just give you a path to a file that could be created.


create_module

create_module(data="", modpath="", tmpdir="", make_importable=True)

create a module with python contents that can be imported

base_dir = "/tmp"
f = testdata.create_module(modpath="foo.bar", data="class Che(object): pass", tmpdir=base_dir)
print f # /tmp/foo/bar.py

create_modules

create_modules(module_dict, tmpdir="", make_importable=True)

create a whole bunch of modules at once

f = testdata.create_modules(
  {
    "foo.bar": "class Che(object): pass",
    "foo.bar.baz": "class Boom(object): pass",
    "foo.che": "class Bam(object): pass",
  }
)

get_ascii

get_ascii(str_size=0)

return a string of ascii characters

>>> testdata.get_ascii()
u'IFUKzVAauqgyRY6OV'

get_md5

get_md5(val="")

return an md5 hash of val (if passed in) or a random val if val is empty

>>> testdata.get_md5()
'e165765400b30772f1d9b3975ce77320'

get_hash

get_hash(str_size=32)

return a random hash

>>> testdata.get_hash()
"jYw3HseUl8GLoMc8QejLYFogC2lUYoUs"

get_bool

get_bool()

return a boolean (either True or False)

>>> testdata.get_bool()
False
>>> testdata.get_bool()
True

get_float

get_float(min_size=None, max_size=None)

return a floating point number between min_size and max_size.

>>> testdata.get_float()
2.932229899095845e+307

get_int

get_int(min_size=1, max_size=sys.maxsize)

return an integer between min_size and max_size.

>>> testdata.get_int()
3820706953806377295

get_name

get_name(name_count=2, as_str=True)

returns a random name that can be outside the ascii range (eg, name can be unicode)

>>> testdata.get_name()
u'jamel clarke-cabrera'

get_email

get_email(name=u'')

returns a random email address in the ascii range.

>>> testdata.get_email()
u'shelley@gmail.com'

get_str

get_str(str_size=0, chars=None)

return random characters, which can be unicode.

>>> testdata.get_str()
"q\x0bwZ\u79755\ud077\u027aYm\ud0d8JK\x07\U0010df418tx\x16"

get_url

get_url()

return a random url.

>>> testdata.get_url()
u'https://sK6rxrCa626TkQddTyf.com'

get_words

get_words(word_count=0, as_str=True)

return a random amount of words, which can be unicode.

>>> testdata.get_words()
"\u043f\u043e\u043d\u044f\u0442\u044c \u043c\u043e\u0436\u043d\u043e felis, habitasse ultrices Nam \u0436\u0435\u043d\u0430"

get_past_datetime

get_past_datetime([now])

return a datetime guaranteed to be in the past from now

>>> testdata.get_past_datetime()
datetime.datetime(2000, 4, 2, 13, 40, 11, 133351)

get_future_datetime

get_future_datetime([now])

return a datetime guaranteed to be in the future from now

>>> testdata.get_future_datetime()
datetime.datetime(2017, 8, 3, 15, 54, 58, 670249)

get_between_datetime

get_between_datetime(start[, stop])

return a datetime guaranteed to be in the future from start and in the past from stop

>>> start = datetime.datetime.utcnow() - datetime.timedelta(days=100)
>>> testdata.get_between_datetime(start)
datetime.datetime(2017, 8, 3, 15, 54, 58, 670249)

Development

Testing

Testing on MacOS:

$ python -m unittest testdata_test

Dependencies

Development needs datatypes on the path. This is kind of a strange thing because datatypes depends on testdata for testing. Making datatypes available to testdata for development should be as easy as:

export PYTHONPATH=$PYTHONPATH:/path/to/dir/containing/datatypes

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

testdata-6.3.1.tar.gz (175.9 kB view details)

Uploaded Source

Built Distribution

testdata-6.3.1-py3-none-any.whl (177.2 kB view details)

Uploaded Python 3

File details

Details for the file testdata-6.3.1.tar.gz.

File metadata

  • Download URL: testdata-6.3.1.tar.gz
  • Upload date:
  • Size: 175.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.10

File hashes

Hashes for testdata-6.3.1.tar.gz
Algorithm Hash digest
SHA256 0a34839b979b32e62b6f546040f2086d3ef53a4d4fe1c74d37c9aef314618b97
MD5 6d36e6240983ec05e9aa743db5d8dea4
BLAKE2b-256 8ace4c00e6cb073cb37b5db4dc81229ba3ded072f38615bbdf4a89b5c5c2a495

See more details on using hashes here.

File details

Details for the file testdata-6.3.1-py3-none-any.whl.

File metadata

  • Download URL: testdata-6.3.1-py3-none-any.whl
  • Upload date:
  • Size: 177.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.10

File hashes

Hashes for testdata-6.3.1-py3-none-any.whl
Algorithm Hash digest
SHA256 77edfb2bddc97519af1be21dfaa997c8bce19fabd1fcb1a5d73e8ac4f570cce2
MD5 86ea4fba57f6e7bdccc4062c0cc9516d
BLAKE2b-256 3d41aa6c5781e427f67e78318ea2f0f94b5215f3bc4628aac70b6740adfe45d5

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page