Pytest-django: рд╕рддреНрд░ рд╕реНрдерд┐рд░рддрд╛ рдкрд░ django_db рдЪрд┐рд╣реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ?

рдХреЛ рдирд┐рд░реНрдорд┐рдд 14 рд╕рд┐рддре░ 2017  ┬╖  15рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: pytest-dev/pytest-django

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рд╣реИ рдЬрд╣рд╛рдВ рдореБрдЭреЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рд╡рд┐рд╢рд╛рд▓ рдбреАрдмреА рд╕реНрдерд┐рд░рддрд╛ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕рднреА рдПрдкреАрдЖрдИ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рд╕реНрдерд┐рд░рддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ 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()
db-configuration enhancement

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

Django рдХреЗ рдпреВрдирд┐рдЯрдЯреЗрд╕реНрдЯ рдХреНрд▓рд╛рд╕-рдЖрдзрд╛рд░рд┐рдд рдкрд░реАрдХреНрд╖рдгреЛрдВ рд╕реЗ рдкрд╛рдЗрдЯреЗрд╕реНрдЯ-рдбреАрдЬреЗрдВрдЧреЛ рддрдХ рдЖрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рджрд░реНрдж рдмрд┐рдВрджреБ рд░рд╣рд╛ рд╣реИ - Django рдореЗрдВ рд╣рдо рдПрдХ рдмрд╛рд░ рдорд╣рдВрдЧрд╛ рдбреАрдмреА рд╕рдВрдЪрд╛рд▓рди рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП setUpTestData рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ (рд╕рддреНрд░-рд╕реНрдХреЛрдкреНрдб рдкрд╛рдЗрдЯреЗрд╕реНрдЯ рдлрд┐рдХреНрд╕реНрдЪрд░ рдХреЗ рдмрд░рд╛рдмрд░), рдФрд░ рдлрд┐рд░ рд╡рд░реНрдЧ рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рддрд╛рдЬрд╝рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП setUp рдореЗрдВ obj.refresh_from_db() рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЪрд╛рд▓рд╛рдХ рдЪрд╛рд▓ рд╣реИред

рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЕрдЧрд░ рдореИрдВ рд╕рд┐рд░реНрдл рдПрдХ рдбреАрдмреА рдореЙрдбрд▓ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рдЗрд╕реЗ рд╣рд░ рдЯреАрд╕реА рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓реЛрдб рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рддреЛ рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рдЯреЗрд╕реНрдЯ рдХреЗрд╕ рдореЗрдВ рдмрдирд╛рдиреЗ рд╕реЗ рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рддреЗрдЬ рд╣реЛрддрд╛ рд╣реИред

рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо pytest-tipsi-django рдорд░реНрдЬ рдХрд┐рдП рдЧрдП рдЕрдкрд╕реНрдЯреНрд░реАрдо рд╕реЗ рд╕рддреНрд░-рд╕реНрдХреЛрдкреНрдб рдлрд┐рдХреНрд╕реНрдЪрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХреЗрдВ, рдпрджрд┐ рдпрд╣ рдПрдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ; рдЗрд╕ рдореБрджреНрджреЗ рдФрд░ рд╕рдорд╛рдзрд╛рди рдХреЛ рдЦреЛрдЬрдиреЗ рдореЗрдВ рдереЛрдбрд╝реА рдЦреБрджрд╛рдИ рд╣реБрдИред

рд╕рднреА 15 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

@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 . рдХрд╛ рдбреБрдкреНрд▓реАрдХреЗрдЯ

рдзрдиреНрдпрд╡рд╛рдж, рд╕рдорд╛рдкрдиред

33 рдмрдВрдж рд╣реИ, рдФрд░ #388 рдореЗрдВ рдХреЛрдИ рд╕рд╛рд░реНрдердХ рдЪрд░реНрдЪрд╛ рдирд╣реАрдВ рд╣реИ (рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд)ред рдЗрд╕реЗ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИ @blueyed , рдЕрдЧрд░ рдХреБрдЫ рднреА рдореИрдВ # 388 рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреВрдВрдЧрд╛ рдФрд░ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╡рд┐рд╣рд┐рдд рдЯрд┐рдХрдЯ рдмрдирд╛рдКрдВрдЧрд╛ред

рдзрдиреНрдпрд╡рд╛рдж!

рдореИрдВ рднреА рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рдмрд╣реБрдд рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВред

@рдордХреЛрдХреЛрдЯреЛрд╡рд┐рдЪ
рдХрд┐рддрдирд╛? рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ? ;)

рд╡реИрд╕реЗ рднреА, рдпрд╣рд╛рдВ рдореБрдЦреНрдп/рдореМрд▓рд┐рдХ рд╕рдорд╕реНрдпрд╛ (рдореВрд▓ рдЯрд┐рдкреНрдкрдгреА рд╕реЗ) рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реИ рдХрд┐ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рджреМрд░рд╛рди рдбреАрдмреА рд░реАрд╕реЗрдЯ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рддреНрд░ рд╕реНрдХреЛрдкреНрдб рд╕реНрдерд┐рд░рддрд╛ рд░рдЦрдиреЗ рдХрд╛ рдХреЛрдИ рдЫреЛрдЯрд╛ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХреНрдпрд╛ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ рд╕рд╛рде рдореЗрдВ рдХреБрдЫ рд╣реИ:

@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.

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

scherrey picture scherrey  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

clintonb picture clintonb  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

aljosa picture aljosa  ┬╖  8рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

dan-passaro picture dan-passaro  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

WoLpH picture WoLpH  ┬╖  7рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ