Pytest-django: рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░реЗрдВ рдХрд┐ рдХреНрдпрд╛ Django рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛ рд░рд╣рд╛ рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 6 рдордИ 2016  ┬╖  9рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: pytest-dev/pytest-django

рдРрд╕рд╛ рдХреБрдЫ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛:

if settings.TESTING:
    print("py.test is being ran")

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

"pytest" in sys.modules ?

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

"pytest" in sys.modules ?

рдЖрдк рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд╕реЗрдЯрд┐рдВрдЧ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рд╕реНрд╡рдпрдВ рдПрдХ рд╕реЗрдЯрд┐рдВрдЧ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ @blueyed рдФрд░ @adamchainz рджреНрд╡рд╛рд░рд╛ рд╕реБрдЭрд╛рдП рдЧрдП рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рдЖрдо рддреМрд░ рдкрд░, рдкрд░реАрдХреНрд╖рдг рд╕реЗ рдХреЛрдб рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдпрд╣ рдЖрддреНрдордирд┐рд░реАрдХреНрд╖рдг рдХрд░рдХреЗ рдЖрдкрдХреЗ рдХреЛрдб рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИред рдпрджрд┐ рдпрд╣ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдерд╛, рддреЛ рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рддрд░реАрдХреЗ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ-рдбреАрдЬреЗрдВрдЧреЛ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИ)ред рд╕реБрдЭрд╛рд╡ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрд╕ рдореБрджреНрджреЗ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рд╣реИ рддреЛ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВ!

рдкрд╛рдЗрдЯреЗрд╕реНрдЯ рдбреЙрдХреНрд╕ рд╕реЗ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЙрджрд╛рд╣рд░рдг рдкрддрд╛ рд▓рдЧрд╛рдПрдВ рдХрд┐ рдХреНрдпрд╛ рдкрд╛рдЗрдЯреЗрд╕реНрдЯ рд░рди рдХреЗ рднреАрддрд░ рд╕реЗ рдЪрд▓ рд░рд╣рд╛ рд╣реИ :

# content of conftest.py

def pytest_configure(config):
    import sys
    sys._called_from_test = True

def pytest_unconfigure(config):
    import sys
    del sys._called_from_test

рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ pytest_configure рдмрд╛рдж рдореЗрдВ рдЪрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ settings.py ред рдХреНрдпрд╛ рдЗрд╕ рдХреЛрдб рдХреЛ settings.py рд╕реЗ рдкрд╣рд▓реЗ рдЪрд▓рд╛рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ?

@axil
'pytest' in sys.modules рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реИ?

рд╣рдореНрдо, рд╣рд╛рдБ, рдпрд╣ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рд╣реИрдХреА рд▓рдЧ рд░рд╣рд╛ рд╣реИред

рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдЗрд╕реЗ рдЬрд╛рдВрдЪрдиреЗ рдХрд╛ рдПрдХ рдФрд░ рддреНрд╡рд░рд┐рдд рдФрд░ рдЧрдВрджрд╛ рддрд░реАрдХрд╛ рд╣реИ

TESTING = os.path.basename(sys.argv[0]) in ('pytest', 'py.test')

@axil
'pytest' in sys.modules рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реИ?

рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдкрд╛рдЗрдЯреЗрд╕реНрдЯ рдЖрдпрд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ pytest рдЪрд▓ рд░рд╣рд╛ рд╣реИ рдФрд░ рдХреЛрдб рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдореВрд▓ рд░реВрдк рд╕реЗ, рдореЗрд░рд╛ рдПрдХ рдЖрдпрд╛рдд pytest рдХрд┐рд╕реА рдФрд░ рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдПред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ pytest pytest рдЖрдпрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реИ, рднрд▓реЗ рд╣реА рд╡рд╣ рдХреЗрд╡рд▓ CLI рд╕рд╣рд╛рдпрддрд╛ рджрд┐рдЦрд╛рддрд╛ рд╣реЛ: pytest --help

рдпрд╣рд╛рдБ рдмрд╣реБрдд рд╡реИрдз рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ:
рдореЗрд░реЗ рдкрд╛рд╕ рд╕реНрдерд╛рдиреАрдп рдлрд╛рдЗрд▓реЛрдВ рдФрд░ рдЪрд░реЛрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рдиреНрдпрд╛рд╕ рдпреЛрдЧреНрдп django рд╕реЗрдЯрд┐рдВрдЧ рд╣реИ рдЬрд╣рд╛рдВ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдорд╛рдг-рдкрддреНрд░ рдФрд░ рдЕрдиреНрдп рд╕реНрдерд╛рдиреАрдп рджреЗрд╡ рдПрдирд╡реА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдбрд╛рд▓рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореЗрд░реЗ рдпреВрдиреАрдЯреЗрд╕реНрдЯ рдХрднреА рднреА рдЗрд╕ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓реНрд╕ рдпрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ рддрд╛рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХрд┐рд╕реА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рд┐рд╕реНрдЯрдо (рдпрджрд┐ рдЕрдиреБрдЪрд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдордЬрд╛рдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ) рдпрд╛ рд╕реНрдерд╛рдиреАрдп рджреЗрд╡ рдПрдирд╡реА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкрд░ рдкрд╛рд╕/рдЕрд╕рдлрд▓ рди рд╣реЛред рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рдХреЗ рд╕рд╛рде рдЪрд▓рдиреЗ рдкрд░ рдЗрди рд╕реНрдерд╛рдиреАрдп рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдмрд╛рд╣рд░ рд░рдЦрд╛ рдЬрд╛рдПред

рдореЗрд░реЗ рдкрд╛рд╕ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ:

import os
import os.path
import sys

from split_settings.tools import include, optional


def is_pytest_running():
    return (os.getenv('PYTEST_RUNNING') == 'true' or
            os.path.basename(sys.argv[0]) in ('pytest', 'py.test'))


ENVVAR_SETTINGS_PREFIX = 'MV_SERVER_'

local_settings_path = os.getenv(f'{ENVVAR_SETTINGS_PREFIX}SETTINGS', '../../../local/settings.py')

includes = [
    'base.py',
    'logging.py',
    'custom.py',
]

if not is_pytest_running():
    includes.append(optional(local_settings_path))
    includes.append('envvars.py')

include(*includes)

os.getenv('PYTEST_RUNNING') == 'true' рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрдореЛрдмреЗрд╢ рдЗрд╕реЗ рдХрд░рдиреЗ рдХрд╛ рд╕рд╛рдл рддрд░реАрдХрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдорд╕реНрдпрд╛ рдЗрд╕ рдЪрд░ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рд╣реИред рдЗрд╕реЗ conftest.py рдореЗрдВ рд╕реЗрдЯ рдХрд░рдирд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рдХреНрдпреЛрдВрдХрд┐ pytest-django conftest.py рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдЖрдпрд╛рдд рдХрд░рддрд╛ рд╣реИред рдкрд╛рдЗрдЯреЗрд╕реНрдЯ рдЪрд▓рд╛рддреЗ рд╕рдордп рдЗрд╕реЗ рдХрдорд╛рдВрдбрд▓рд╛рдЗрди рдореЗрдВ рд╕реЗрдЯ рдХрд░рдирд╛ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдФрд░ рдЙрджреНрджреЗрд╢реНрдп рдХреЛ рднреА рд╣рд░рд╛ рджреЗрддрд╛ рд╣реИ: рдпрджрд┐ рдХреЛрдИ рдЗрд╕реЗ рд╕реЗрдЯ рдХрд░рдирд╛ рднреВрд▓ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рд╕реНрдерд╛рдиреАрдп рджреЗрд╡ рдПрдирд╡реА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

os.path.basename(sys.argv[0]) рдореЗрдВ ('pytest', 'py.test')

рдореБрдЭреЗ рдЗрд╕реЗ os.path.basename(os.path.dirname(sys.argv[0])) in ('pytest', 'py.test') рдмрджрд▓рдирд╛ рдкрдбрд╝рд╛ рдХреНрдпреЛрдВрдХрд┐ sys.argv[0] /home/project/venv/lib/python3.8/site-packages/pytest/__main__.py рд░реВрдк рдореЗрдВ рд╕рд╛рдордиреЗ рдЖ рд░рд╣рд╛ рдерд╛ред

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

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

MRigal picture MRigal  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

koxu1996 picture koxu1996  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

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

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

ryankask picture ryankask  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ