PyTest Faker

Faker jest pakietem generującym fałszywe dane. Faker może się przydać aby utworzyć obiekty bazy danych, ładny dokument XML, dane potrzebne do testów czy anonimizacja danych pobranych z usługi produkcyjnej.

pytest-faker jest dodatkiem zapewniającym ndodatkowy fixture będący instancją obiektu faker.

Instalacja

$ pip install pytest-faker

Wykorzystanie

Aby utworzyć dane należy utworzyć obiekt klasy Faker, a nas†epnie wywołać jedną z dostępnych metod na tym obiekcie. Metod jest tak dużo że warto zerknąć do dokumentacji pod adresem http://faker.readthedocs.io/en/master/providers.html. W niej mamy utworzone grupy w których mamy wykorzystane konkretne metody. Najczęsciej używane grupy to faker.providers.person, faker.providers.address czy faker.providers.lorem.

from faker import Faker

fake = Faker()

fake.name()
# 'Lucy Cechtelar'

fake.address()
# "426 Jordy Lodge
#  Cartwrightshire, SC 88120-6700"

Aby wykorzystać moduł pytest-faker należy wykorzystać dostarczony fixture.

#tests/test_faker.py:
from faker.generator import Generator

def test_faker(faker):
    """Faker factory is a fixture."""
    assert isinstance(faker, Generator)
    assert isinstance(faker.name(), str)

Lokalizacja

Aby ustawić jezyk w jakim mają zostac wygenerowane dane należy w inicjalizacji obiektu Faker podać dodatkowy argument będący kodem języku. Język polski jest oznaczony kodem pl_PL.

from faker import Faker
fake = Faker('it_IT')

for _ in range(10):
    print(fake.name())

> Elda Palumbo
> Pacifico Giordano
> Sig. Avide Guerra
> Yago Amato
> Eustachio Messina
> Dott. Violante Lombardo
> Sig. Alighieri Monti
> Costanzo Costa
> Nazzareno Barbieri
> Max Coppola

Aby ustawić lokalizację dla modułu pytest-faker należy w pliku conftest.py nadpisać domyślny fixture faker_locale, który powinien zwracać wartość języka.

# test/conftest.py
@pytest.fixture(scope='session')
def faker_locale():
    return 'pl_PL'

Dostęp do losowej instancji

Właściwość .random na generatorze zwraca instancję random.Random używaną do generowania wartości.

from faker import Faker
fake = Faker()

fake.random
fake.random.getstate()

Domyślnie wszystkie generatory współdzielą to samo wystąpienie random.Random, do którego można uzyskać dostęp za pomocą from faker.generator import random. Używanie tego może być przydatne w przypadku wtyczek, które chcą wpływać na wszystkie instancje fakerów.

Seeding generatora

Kiedy używasz Fakera do testowania, często będziesz chciał wygenerować ten sam zestaw danych. Dla wygody generator dostarcza również metodę seed(), która zapewnia generowanie takiego samego zestawu testowego. Wywołanie tych samych metod generatora w tej samej wersji fakera z taką samą wartością seed zwróci nam takie same wyniki.

from faker import Faker
fake = Faker()
fake.seed(4321)

print(fake.name())
> Margaret Boehm

Więcej szczegułów można znaleźć w dokumentacji http://faker.readthedocs.io/en/master/index.html#seeding-the-generator