---
# System prepended metadata

title: pytest django
tags: [django, python, learn, project, backend]

---

# pytest django
###### tags: `python` `django` `backend` `learn` `project`
docs:https://pytest-django.readthedocs.io/en/latest/

```
pip install pytest-django 
```

pytest -rP

### fixture 固定裝置
usage:
fixtures are used to feed data to the tests such as database connection, urls to test and input data
fixture run before/after each test function to which the fixture is applied

### pattern for writing test
- arrange 準備
- act 行動
- asset 結果(true/false)

conftest.py
->test file that runs at first
->fixture function

```
import pytest
from django.contrib.auth.models import User

@pytest.fixture()
def user_1(db):
    return User.objects.create_user('test_user')

@pytest.fixture()
def new_user_factory(db):
    def create_user_factory(
        username: str,
        password: str=None,
        first_name: str = "first_name",
        last_name: str = "last_name",
        email: str = "test@test.com",
        is_staff: str = False,
        is_superuser: str = False,
        is_active: str = True,
    ):
        user = User.objects.create_user(
            username = username,
            password = password,
            first_name = first_name,
            last_name = last_name,
            email = email,
            is_staff = is_staff,
            is_superuser = is_superuser,
            is_active = is_active,
        )
        return user
    return create_user_factory

@pytest.fixture
def new_user(db, new_user_factory):
    return new_user_factory("test_user", "password", "firstname")
```

### Factory Boy
https://pytest-factoryboy.readthedocs.io/en/latest/
q faced:
when application growth the fixtures become to much to manage

usage:
* Fixture replacement tool
* Factories are define in a nice, clean and readable manner
* Easy-to-use factories for complex objects
* Class base approach
    * subfactory
    * ForeignKey, reverse ForeignKey, Many to Many

install:
```
pip install pytest-factoryboy
pip install Faker
```