рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рд╣реИ рдЬрд╣рд╛рдВ рдореБрдЭреЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рд╡рд┐рд╢рд╛рд▓ рдбреАрдмреА рд╕реНрдерд┐рд░рддрд╛ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕рднреА рдПрдкреАрдЖрдИ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рд╕реНрдерд┐рд░рддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ conftest.py
рдкрд░ рдПрдХ рд╕рддреНрд░ рд╕реНрдерд┐рд░рддрд╛ рдмрдирд╛рдИ рдЬреЛ рдЗрд╕реЗ рдХрд░реЗрдЧреАред рд▓реЗрдХрд┐рди рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ pytest
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдореИрдВрдиреЗ django_db
рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рд╣реЛ:
E Failed: Database access not allowed, use the "django_db" mark to enable it.
рдиреАрдЪреЗ рдореЗрд░рд╛ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рд╣реИред
from permission.helpers import update_permissions
pytestmark = [
pytest.mark.django_db(transaction = True),]
@pytest.fixture(scope="session", autouse = True)
def permission(request):
load_time_consuming_db_fixture()
@ludbek рд╣рдордиреЗ рдРрд╕реА рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рднреА рдпрд╛рдж рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдкреНрд▓рдЧрдЗрди рдмрдирд╛рдпрд╛ рд╣реИ:
https://github.com/tipsi/pytest-tipsi-django (рдЙрдкрдпреЛрдЧ: https://github.com/tipsi/pytest-tipsi-django/blob/master/test_django_plugin/app/tests/test_transactions.py)
рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдХреЗ рд░реВрдк рдореЗрдВ:
https://github.com/tipsi/pytest-tipsi-testing
рдпрд╣ рдЖрдкрдХреЛ рд▓реЗрдирджреЗрди рдХреЛ рдиреЗрд╕реНрдЯ рдХрд░рдиреЗ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди/рд╢рдЯрдбрд╛рдЙрди рдСрд░реНрдбрд░ рдХреЛ рд╕рд╣реА рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рджреЗрддрд╛ рд╣реИред
@cybergrind рдЙрддреНрддрд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕рдХреА рдЬрд╛рдВрдЪ рдХрд░реВрдВрдЧрд╛ рдФрд░ рдЖрдкрдХреЛ рдмрддрд╛ рджреВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдХреИрд╕рд╛ рд░рд╣рд╛ред
Django рдХреЗ рдпреВрдирд┐рдЯрдЯреЗрд╕реНрдЯ рдХреНрд▓рд╛рд╕-рдЖрдзрд╛рд░рд┐рдд рдкрд░реАрдХреНрд╖рдгреЛрдВ рд╕реЗ рдкрд╛рдЗрдЯреЗрд╕реНрдЯ-рдбреАрдЬреЗрдВрдЧреЛ рддрдХ рдЖрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рджрд░реНрдж рдмрд┐рдВрджреБ рд░рд╣рд╛ рд╣реИ - Django рдореЗрдВ рд╣рдо рдПрдХ рдмрд╛рд░ рдорд╣рдВрдЧрд╛ рдбреАрдмреА рд╕рдВрдЪрд╛рд▓рди рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП setUpTestData
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ (рд╕рддреНрд░-рд╕реНрдХреЛрдкреНрдб рдкрд╛рдЗрдЯреЗрд╕реНрдЯ рдлрд┐рдХреНрд╕реНрдЪрд░ рдХреЗ рдмрд░рд╛рдмрд░), рдФрд░ рдлрд┐рд░ рд╡рд░реНрдЧ рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рддрд╛рдЬрд╝рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП setUp
рдореЗрдВ obj.refresh_from_db()
рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЪрд╛рд▓рд╛рдХ рдЪрд╛рд▓ рд╣реИред
рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЕрдЧрд░ рдореИрдВ рд╕рд┐рд░реНрдл рдПрдХ рдбреАрдмреА рдореЙрдбрд▓ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рдЗрд╕реЗ рд╣рд░ рдЯреАрд╕реА рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓реЛрдб рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рддреЛ рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рдЯреЗрд╕реНрдЯ рдХреЗрд╕ рдореЗрдВ рдмрдирд╛рдиреЗ рд╕реЗ рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рддреЗрдЬ рд╣реЛрддрд╛ рд╣реИред
рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо pytest-tipsi-django рдорд░реНрдЬ рдХрд┐рдП рдЧрдП рдЕрдкрд╕реНрдЯреНрд░реАрдо рд╕реЗ рд╕рддреНрд░-рд╕реНрдХреЛрдкреНрдб рдлрд┐рдХреНрд╕реНрдЪрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХреЗрдВ, рдпрджрд┐ рдпрд╣ рдПрдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ; рдЗрд╕ рдореБрджреНрджреЗ рдФрд░ рд╕рдорд╛рдзрд╛рди рдХреЛ рдЦреЛрдЬрдиреЗ рдореЗрдВ рдереЛрдбрд╝реА рдЦреБрджрд╛рдИ рд╣реБрдИред
рдЕрд░реЗ @paultilady
рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ pytest-tipsi-djanjo
рд╕реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг $#$1 pytest
#$ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдкрд░реАрдХреНрд╖рдг рдореЙрдбрд▓ рдореЗрдВ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдЕрдВрддрд░ рдЬреБрдбрд╝рдирд╛рд░ рдкрд░ рдкрд░рд┐рд╖реНрдХрд░рдг рд╣реИ: рд╡рд░реНрддрдорд╛рди рдореЗрдВ pytest
рд╡реНрдпрд╛рдкрдХ рджрд╛рдпрд░реЗ рдХреЗ рд╕рд╛рде рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЬреБрдбрд╝рдирд╛рд░ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рд╡рд┐рд╢реЗрд╖ рдХреНрд░рдо рдореЗрдВ рд▓реЗрдирджреЗрди рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рдмрд╣реБрдд рдЕрд▓рдЧ рдкреНрд░рднрд╛рд╡ рдкреИрджрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рд╡рд░реНрддрдорд╛рди рдореЗрдВ pytest
рд╕рдХреНрд░рд┐рдп рдкрд░реАрдХреНрд╖рдг рдФрд░ рдЗрд╕рдХреЗ рдЬреБрдбрд╝рдирд╛рд░ рдХреА рдмрд┐рд▓реНрдХреБрд▓ рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рднреА рдЬреБрдбрд╝рдирд╛рд░ рд╕рдХреНрд░рд┐рдп рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ)ред
рд╣рдореЗрдВ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ рдмрджрд▓рдирд╛ рдкрдбрд╝рд╛ рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рдХрднреА-рдХрднреА рдХреБрдЫ рдмрдбрд╝реЗ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рд╣рдордиреЗ рдореМрдЬреВрджрд╛ рдореИрдиреНрдпреБрдЕрд▓ рд▓реЗрдирджреЗрди рдкреНрд░рдмрдВрдзрди рдХреЛ рдмрдбрд╝реЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдереЛрдбрд╝рд╛ рдмреЗрд╣рддрд░ рдлрд┐рдХреНрд╕реНрдЪрд░ рдХреЗ рд╕рд╛рде рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдЕрднреА рднреА рдСрд░реНрдбрд░ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЕрднреА рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╕рдорд╛рдзрд╛рди рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ: рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдореЗрдВ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдХреНрд╕рд░ рдкреВрдЫреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рд╢реНрди рдбрд╛рд▓рдирд╛ред
рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рд╡рд░рдг @cybergrind рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВрдиреЗ рдЗрд╕рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░ рдЦреЛрджрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдЬ рдХреЗ рд▓рд┐рдП рд╕рдордп рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИ - рдпрд╣рд╛рдБ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдБ рдореБрдЭреЗ рдорд┐рд▓рд╛ рд╣реИ, рдореИрдВ рдЗрд╕ рдмрд╛рдд рдХреА рдЬрд╛рдБрдЪ рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдБ рдХрд┐ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЙрдкрдпреЛрдЧреА рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рд╣реВрдБ рдкрд╛рдЗрдЯреЗрд╕реНрдЯ рдЗрдВрдЯрд░реНрдирд▓ рд╕реЗ рд╡рд╣ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рдХрд┐ "рдкрд╛рдЗрдЯреЗрд╕реНрдЯ рд╡реНрдпрд╛рдкрдХ рджрд╛рдпрд░реЗ рдХреЗ рд╕рд╛рде рдЕрдирд╛рд╡рд╢реНрдпрдХ рдлрд┐рдХреНрд╕реНрдЪрд░ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ", рдХреНрдпрд╛ рдЖрдк рдЙрд╕ рдкрд░ рдереЛрдбрд╝рд╛ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдХреНрдпрд╛ рдпрд╣ рдЕрдВрддрд┐рдо рд░реВрдк рджреЗрдиреЗ рд╡рд╛рд▓реЛрдВ рдХреА рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реИ? рдЬреЛ рдореИрдВрдиреЗ рдиреАрдЪреЗ рд▓рд┐рдЦрд╛ рд╣реИ, рд╡рд╣ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
pytest-django рдкреНрд▓рдЧрдЗрди django_db
рдЪрд┐рд╣реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдкреНрд▓рдЧрдЗрди.py (https://github.com/pytest-dev/pytest-django/blob/master/pytest_django/plugin.py) рдореЗрдВ _django_db_marker рдореЗрдВ рд╣реИрдВрдбрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред #L375), рдлрдВрдХреНрд╢рди-рд╕реНрдХреЛрдкреНрдб db
рдлрд┐рдХреНрд╕реНрдЪрд░ (https://github.com/pytest-dev/pytest-django/blob/master/pytest_django/fixtures.py#L142) рдореЗрдВ рдХреЙрд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ рдлрд┐рдХреНрд╕реНрдЪрд░ рдПрдХ Django TestCase рдХреЛ рдЗрдВрд╕реНрдЯреЗрдВрдЯ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ _pre_setup
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ (рдФрд░ _post_teardown
рдХреЛ рдПрдирдХреНрдпреВ рдХрд░рддрд╛ рд╣реИ)ред
рдореИрдВ рдХреБрдЫ рд╡рд┐рдХрд▓реНрдк рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ:
рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рдХрдХреНрд╖рд╛- рдпрд╛ рд╕рддреНрд░- рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП _django_db_marker
рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВ-
рд╕реНрдХреЛрдкреНрдб рд╕реЗрдЯрдЕрдк рднреА рд╣реИ, рдЬреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ db
рдЬреИрд╕рд╛ рд╣реА рдХрд╛рдо рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди cls.setUpTestData
рдХреЗ рдмрд░рд╛рдмрд░ рдХреЙрд▓ рдХрд░рдирд╛ рдпрд╛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдорд╛рд░реНрдХ kwargs рдореЗрдВ рдкрд╛рд╕ рдХрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ред
рдХреНрд▓рд╛рд╕-рд╕реНрдХреЛрдк рдХреЗ рд▓рд┐рдП, рдФрд░ рдореИрдВ рд╕рддреНрд░-рд╕реНрдХреЛрдк рдХреЗ рд▓рд┐рдП рднреА рдорд╛рди рд░рд╣рд╛ рд╣реВрдВ, рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдмрд╛рдж рдореЗрдВ рдбреАрдмреА рдХреЛ рд╡рд╛рдкрд╕ рд░реЛрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдореВрд▓ рд░реВрдк рд╕реЗ рд╕реНрдХреЛрдкреНрдб рдлрд┐рдХреНрд╕реНрдЪрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рд╕рд╣реА рдХреНрд░рдо рдореЗрдВ рдЯреНрд░рд┐рдЧрд░ рд╣реЛрддреА рд╣реИ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдЕрдкрдирд╛ рдкрд░рдорд╛рдгреБ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ рд▓реЗрди - рджреЗрдиред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рдмрдЧрд▓ рдореЗрдВ рдЪрд▓рдиреЗ рд╡рд╛рд▓реА рдПрдХ рдЕрд▓рдЧ рд╕реНрдерд┐рд░рддрд╛ рдХреЗ рдмрдЬрд╛рдп рдЗрд╕реЗ db
рд╕реНрдерд┐рд░рддрд╛ рдореЗрдВ рд╕рдВрд╢реЛрдзрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЗрд╕ рддрд░рд╣ рд╣рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рд╕реА рднреА рд╡рд░реНрдЧ-/рд╕рддреНрд░-рд╕реНрддрд░реАрдп рд╕реЗрдЯрдЕрдк рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЯреНрд░рд┐рдЧрд░ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдЙрд╕ рд╕реЗрдЯрдЕрдк рдХреЛ рдкреНрд░рддрд┐ рд╡рд░реНрдЧ/рд╕рддреНрд░ рдореЗрдВ рдПрдХ рдмрд╛рд░ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдЪрд┐рд╣реНрди рдореЗрдВ рд╕рдВрд╢реЛрдзрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рдЖрдк рдХреЗрд╡рд▓ рдПрдХ рд╕рддреНрд░-рд╕реНрдХреЛрдкреНрдб рдлрд╝рдВрдХреНрд╢рди рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ django_db_blocker.unblock()
рдЯреНрд░рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ django_db рдЪрд┐рд╣реНрди рдиреЗ рдкрд╣рд▓рд╛ рд▓реЗрдирджреЗрди рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рд╣реИред
рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ ( plugin.py _django_db_marker()
рдореЗрдВ):
if marker:
if marker.session_db:
getfixturevalue(request, 'db_session')
if marker.class_db:
getfixturevalue(request, 'db_class')
validate_django_db(marker)
if marker.transaction:
getfixturevalue(request, 'transactional_db')
else:
getfixturevalue(request, 'db')
рдХреНрдпрд╛ рдпрд╣ рдкрд╛рдЧрд▓ рдмрд╛рдд рд╣реИ, рдпрд╛ рдпрд╣ рдзрд╛рдЧрд╛ рдЖрдЧреЗ рдХреА рдЦреЛрдЬ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ?
рдЕрдВрддрд┐рдо рд░реВрдк рджреЗрдиреЗ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ: https://github.com/tipsi/pytest-tipsi-testing/blob/master/tests/test_finalization.py
рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдЧреИрд░-рдлрд╝рдВрдХреНрд╢рди рд╕реНрддрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдлрд┐рдХреНрд╕реНрдЪрд░ рдХреЗ рд╕рдорд╛рди рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрдВрддрд┐рдо рд░реВрдк рджрд┐рдП рдмрд┐рдирд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдФрд░ рдпрд╣ pytest рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП pytest-django рдореЗрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИред
#388 рдФрд░ #33 . рдХрд╛ рдбреБрдкреНрд▓реАрдХреЗрдЯ
рдзрдиреНрдпрд╡рд╛рдж, рд╕рдорд╛рдкрдиред
рдзрдиреНрдпрд╡рд╛рдж!
рдореИрдВ рднреА рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рдмрд╣реБрдд рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВред
@рдордХреЛрдХреЛрдЯреЛрд╡рд┐рдЪ
рдХрд┐рддрдирд╛? рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ? ;)
рд╡реИрд╕реЗ рднреА, рдпрд╣рд╛рдВ рдореБрдЦреНрдп/рдореМрд▓рд┐рдХ рд╕рдорд╕реНрдпрд╛ (рдореВрд▓ рдЯрд┐рдкреНрдкрдгреА рд╕реЗ) рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реИ рдХрд┐ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рджреМрд░рд╛рди рдбреАрдмреА рд░реАрд╕реЗрдЯ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рддреНрд░ рд╕реНрдХреЛрдкреНрдб рд╕реНрдерд┐рд░рддрд╛ рд░рдЦрдиреЗ рдХрд╛ рдХреЛрдИ рдЫреЛрдЯрд╛ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХреНрдпрд╛ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ рд╕рд╛рде рдореЗрдВ рдХреБрдЫ рд╣реИ:
@pytest.fixture(scope="session")
def django_db_setup(django_db_setup, django_db_blocker):
with django_db_blocker.unblock():
with transaction.atomic(): # XXX: could/should use `TestCase_enter_atomics` for multiple dbs
load_time_consuming_db_fixture()
yield
рд╕рдм рдХреБрдЫ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдкрд░рдорд╛рдгреБ рдмреНрд▓реЙрдХ рдореЗрдВ рд▓рдкреЗрдЯрдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ TransactionTestCase
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред
@рдкреЙрд▓реНрдЯреАрдкреНрд▓рд╛рдбреА
рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгреА рдЕрдЪреНрдЫреА рд▓рдЧрддреА рд╣реИ - рдпрд╛рдиреА рдпрд╣ рдЖрдЧреЗ рдХреА рдЦреЛрдЬ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ AFAICS (рдореЗрд░реА рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рднреА рджреЗрдЦреЗрдВ)ред
@blueyed рд╣рдо рдПрдХ рд╡рд░реНрд╖ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рд╕реЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ (рд╕рдм рдХреБрдЫ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдкрд░рдорд╛рдгреБ рдмреНрд▓реЙрдХ рдореЗрдВ рд▓рдкреЗрдЯреЗрдВ) рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдЖрдк рдРрд╕рд╛ рдХреБрдЫ рдбреНрд░реЙрдк-рдЗрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдХреНрдпреЛрдВрдХрд┐ рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рдореЗрдВ рдирд┐рдпрддрд╛рддреНрдордХ рдирд╣реАрдВ рд╣реИ рдЬрд╣рд╛рдВ рд╕рддреНрд░-рд╕реНрддрд░ (рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрдиреНрдп) рдмрдВрдж рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдбреАрдмреА рд▓реЗрдирджреЗрди рдХреА рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рдкрд░ рдирдЬрд╝рд░ рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рднрд▓реЗ рд╣реА рдЙрдиреНрд╣реЗрдВ рдПрдХ рджреВрд╕рд░реЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рдпрд╛ рд╕реАрдзреЗ рдирд╣реАрдВ .
рддреЛ рдЖрдкрдХреЛ рдЕрдЧрд▓реЗ рдкрд░реАрдХреНрд╖рдг рд╕реЗ рдкрд╣рд▓реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓реЗрдирджреЗрди рд╕реНрдЯреИрдХ рдФрд░ рдХреНрд▓реЛрдЬ рдиреЗрд╕реНрдЯреЗрдб рд▓реЗрдирджреЗрди рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: https://github.com/tipsi/pytest-tipsi-django/blob/master/pytest_tipsi_django/django_fixtures.py#L46
рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореИрдВ рд╕реНрдкрд╖реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдореИрдВ рдЙрд╕реА рдореБрджреНрджреЗ рдкрд░ рдЪрд▓ рд░рд╣рд╛ рд╣реВрдВ:
рдЕрдЧрд░ рдореИрдВ рдПрдХ рдлрд┐рдХреНрд╕реНрдЪрд░ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ рдПрдХ рдирдИ рдбреАрдмреА рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдореИрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ
@pytest.mark.django_db(transaction=True)
@pytest.fixture(scope="session")
def object():
object = Object.create_object(params)
yield object
// or alternatively
object = mixer.blend('myObject')
yield object
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореБрдЭреЗ рдЯреЗрд╕реНрдЯ рдХреЗрд╕ рд░рди рдкрд░ рдирд┐рдореНрди рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреА рд╣реИ: Database access not allowed, use the "django_db" mark, or the "db" or "transactional_db" fixtures to enable it.
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
Django рдХреЗ рдпреВрдирд┐рдЯрдЯреЗрд╕реНрдЯ рдХреНрд▓рд╛рд╕-рдЖрдзрд╛рд░рд┐рдд рдкрд░реАрдХреНрд╖рдгреЛрдВ рд╕реЗ рдкрд╛рдЗрдЯреЗрд╕реНрдЯ-рдбреАрдЬреЗрдВрдЧреЛ рддрдХ рдЖрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рджрд░реНрдж рдмрд┐рдВрджреБ рд░рд╣рд╛ рд╣реИ - Django рдореЗрдВ рд╣рдо рдПрдХ рдмрд╛рд░ рдорд╣рдВрдЧрд╛ рдбреАрдмреА рд╕рдВрдЪрд╛рд▓рди рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП
setUpTestData
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ (рд╕рддреНрд░-рд╕реНрдХреЛрдкреНрдб рдкрд╛рдЗрдЯреЗрд╕реНрдЯ рдлрд┐рдХреНрд╕реНрдЪрд░ рдХреЗ рдмрд░рд╛рдмрд░), рдФрд░ рдлрд┐рд░ рд╡рд░реНрдЧ рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рддрд╛рдЬрд╝рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПsetUp
рдореЗрдВobj.refresh_from_db()
рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЪрд╛рд▓рд╛рдХ рдЪрд╛рд▓ рд╣реИредрдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЕрдЧрд░ рдореИрдВ рд╕рд┐рд░реНрдл рдПрдХ рдбреАрдмреА рдореЙрдбрд▓ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рдЗрд╕реЗ рд╣рд░ рдЯреАрд╕реА рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓реЛрдб рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рддреЛ рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рдЯреЗрд╕реНрдЯ рдХреЗрд╕ рдореЗрдВ рдмрдирд╛рдиреЗ рд╕реЗ рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рддреЗрдЬ рд╣реЛрддрд╛ рд╣реИред
рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо pytest-tipsi-django рдорд░реНрдЬ рдХрд┐рдП рдЧрдП рдЕрдкрд╕реНрдЯреНрд░реАрдо рд╕реЗ рд╕рддреНрд░-рд╕реНрдХреЛрдкреНрдб рдлрд┐рдХреНрд╕реНрдЪрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХреЗрдВ, рдпрджрд┐ рдпрд╣ рдПрдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ; рдЗрд╕ рдореБрджреНрджреЗ рдФрд░ рд╕рдорд╛рдзрд╛рди рдХреЛ рдЦреЛрдЬрдиреЗ рдореЗрдВ рдереЛрдбрд╝реА рдЦреБрджрд╛рдИ рд╣реБрдИред