рдкреАрдЫреЗ рдЕрдЧрд▓рд╛ 
рдЗрд╕ рдЕрдзреНрдпрд╛рдп рдореЗрдВ, рд╣рдо рд╡рд┐рдиреНрдпрд╛рд╕ рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗ рдЬреЛ рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЪрд░реНрдЪрд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рдЙрдирдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрдкрдиреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдХреИрд╕реЗ рдмрджрд▓рддрд╛ рд╣реИ, рдФрд░ рдХрд╛рд░реНрдп рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдХреБрдЫ рдмрджрд▓рд╛рд╡ рдХрд░рддрд╛ рд╣реИред

рдЗрд╕ рдкреБрд╕реНрддрдХ рдореЗрдВ рдЙрджрд╛рд╣рд░рдг Python 3.6 рдФрд░ pytest 3.2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВред рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ 3.2 рдкрд╛рдпрдерди 2.6, 2.7, рдФрд░ рдкрд╛рдпрдерди 3.3+ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред
рдЯрд╛рд╕реНрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЗрд╕ рдкреБрд╕реНрддрдХ рдореЗрдВ рджрд┐рдЦрд╛рдП рдЧрдП рд╕рднреА рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП, рдкреБрд╕реНрддрдХ рдХреЗ рд╡реЗрдм рдкреЗрдЬ pragprog.com рдкрд░ рд▓рд┐рдВрдХ рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рд╕реНрд░реЛрдд рдХреЛрдб рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ; рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╛ рдЕрдкрдиреА рдЦреБрдж рдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░реЗрдВ (рдЖрдкрдХреЗ рд╣рд╛рде рдЕрдирдЯреВрдЯ рд╣реЛ рдЧрдП рд╣реИрдВ!), рдЖрдкрдХреЛ рдкреБрд╕реНрддрдХ рдХреЗ рд╡реЗрдм рдкреЗрдЬ рдкрд░ рдЬрд╛рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдХрд╛рдо рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╡рд╣рд╛рдБ, рдкреБрд╕реНрддрдХ рдХреЗ рд╡реЗрдм рдкреЗрдЬ рдкрд░, рдЗрд░реЗрдЯрд╛ рд╕рдВрджреЗрд╢реЛрдВ рдФрд░ рдПрдХ рдЪрд░реНрдЪрд╛ рдордВрдЪ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рд╣реИред
рд╕реНрдкреЙрдЗрд▓рд░ рдХреЗ рддрд╣рдд рдЗрд╕ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд▓реЗрдЦреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИред
рд╕рд╛рдордЧреНрд░реА рдХреА рддрд╛рд▓рд┐рдХрд╛ рд╡рд┐рдиреНрдпрд╛рд╕
рдЗрд╕ рдкреБрд╕реНрддрдХ рдореЗрдВ рдЕрдм рддрдХ рдореИрдВрдиреЗ рд╡рд┐рднрд┐рдиреНрди рдЧреИрд░-рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА рд╣реИ, рдЬреЛ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдкрд╛рд╕рд┐рдВрдЧ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреА рд╣реИрдВ, рдЬреЛ рдХрд┐ conftest.py рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде рд╣реИ, рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЕрдзреНрдпрд╛рдп 5, рдкреНрд▓рдЧрдЗрдиреНрд╕, рдкреГрд╖реНрда 95 рдкрд░ рдХреБрдЫ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдХрд╡рд░ рдХрд┐рдпрд╛ рд╣реИред рдЗрд╕ рдЕрдзреНрдпрд╛рдп рдореЗрдВ, рд╣рдо рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗред рдХрд┐ pytest рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЪрд░реНрдЪрд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреИрд╕реЗ pytest рдЕрдкрдиреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдЙрдирдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрджрд▓рддрд╛ рд╣реИ, рдФрд░ рдХрд╛рд░реНрдп рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдХреБрдЫ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рддрд╛ рд╣реИред
рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдордЭрдирд╛
рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдКрдВ рдХрд┐ рдХреИрд╕реЗ рдЖрдк рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдЗрдП рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рднреА рдЧреИрд░-рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓реЛрдВ рдкрд░ рдЬрд╛рдПрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдЙрдирдХреА рджреЗрдЦрднрд╛рд▓ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред
рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рд┐рдП:
- pytest.ini : рдпрд╣ рдореБрдЦреНрдп Pytest рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рдЪреВрдБрдХрд┐ рдЖрдк рдХрд╛рдлреА рдХреБрдЫ рд╡рд┐рдиреНрдпрд╛рд╕ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕ рдЕрдзреНрдпрд╛рдп рдХрд╛ рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рдЧ рдЙрди рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк
pytest.ini
рдореЗрдВ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред - conftest.py : рдпрд╣ рдПрдХ рд╕реНрдерд╛рдиреАрдп рдкреНрд▓рдЧрдЗрди рд╣реИ рдЬреЛ рд╣реБрдХ рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдЬреБрдбрд╝рдирд╛рд░ рдХреЛ рдЙрд╕ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ
conftest.py
рдлрд╝рд╛рдЗрд▓ conftest.py
рдФрд░ рдЗрд╕рдХреЗ рд╕рднреА рдЙрдкрдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдПрдВред рдкреГрд╖реНрда 95 рдкрд░ рдЕрдзреНрдпрд╛рдп 5 "рдкреНрд▓рдЧрдЗрдиреНрд╕" рдореЗрдВ conftest.py
рдлрд╝рд╛рдЗрд▓ рд╡рд░реНрдгрд┐рдд рд╣реИред __init__.py
: рдЬрдм рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдЙрдкрдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдЖрдкрдХреЛ рдХрдИ рдкрд░реАрдХреНрд╖рдг рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рд╕рдорд╛рди рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рд░рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рд╣рдо рдкреГрд╖реНрда резреиреж рдкрд░ "рдЯрд╛рд▓рдирд╛ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдЯрдХрд░рд╛рд╡ рд╕реЗ рдмрдЪрдиреЗ" рд▓реЗрдЦ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ __init__.py
рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдмрд┐рдирд╛ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реЛрдЧрд╛ рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЗрдЦреЗрдВрдЧреЗред
рдпрджрд┐ рдЖрдк рд╡рд┐рд╖рд╛рдХреНрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕рдореЗрдВ рд░реБрдЪрд┐ рд▓реЗрдВрдЧреЗ:
- tox.ini : рдпрд╣ рдлрд╝рд╛рдЗрд▓
pytest.ini
рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди pytest.ini
рд▓рд┐рдПред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЖрдк рдЕрдкрдиреЗ pytest
рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ tox.ini
рдлрд╝рд╛рдЗрд▓ рдФрд░ pytest.ini
рдлрд╝рд╛рдЗрд▓, рджреЛрдиреЛрдВ рдореЗрдВ рд░рдЦрдиреЗ рдХреЗ рдмрдЬрд╛рдп pytest
рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдЖрдк рдПрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рд╕рд╣реЗрдЬ рд╕рдХрддреЗ рд╣реИрдВред рдкреГрд╖реНрда резреирел рдкрд░ рдЕрдзреНрдпрд╛рдп,, рдЕрдиреНрдп рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЯреЙрдХреНрд╕ рдХреА рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реИред
рдпрджрд┐ рдЖрдк рдПрдХ рдЕрдЬрдЧрд░ рдкреИрдХреЗрдЬ (рдЬреИрд╕реЗ рдХрд╛рд░реНрдп) рд╡рд┐рддрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдмреНрдпрд╛рдЬ рдХреА рд╣реЛрдЧреА:
- setup.cfg : рдпрд╣ рднреА рдПрдХ INI рдлрд╝рд╛рдЗрд▓ рд╣реИ рдЬреЛ
setup.py
рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреА рд╣реИред рдЖрдк python setup.py test
рдЪрд▓рд╛рдиреЗ рдХреЗ python setup.py test
рдФрд░ рдЕрдкрдиреЗ рд╕рднреА рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП setup.py
рд▓рд┐рдП рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдкреИрдХреЗрдЬ рд╡рд┐рддрд░рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА setup.cfg
рдлрд╝рд╛рдЗрд▓ рд╣реЛ рд╕рдХрддреА рд╣реИ рдФрд░ рдЖрдк рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ Pytest рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рдпрд╣ рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдкреГрд╖реНрда 175 рдкрд░ рдкрд░рд┐рд╢рд┐рд╖реНрдЯ 4, "рдкреИрдХреЗрдЬрд┐рдВрдЧ рдФрд░ рд╡рд┐рддрд░рдг рдкрд╛рдпрдерди рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕" рдореЗрдВ рдпрд╣ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдЖрдкрдиреЗ рдХрд┐рд╕ рдлрд╛рдЗрд▓ рдореЗрдВ рд╕рдмрд╕реЗ рдЬреНрдпрд╛рджрд╛ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдбрд╛рд▓рд╛ рд╣реИ, рдлреЙрд░реНрдореЗрдЯ рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХ рд╣реА рд╣реЛрдЧрд╛ред
pytest.ini
:
ch6 / format / pytest.ini
[pytest] addopts = -rsxX -l --tb=short --strict xfail_strict = true ... more options ...
tox.ini
:
ch6 / format / tox.ini
... tox specific stuff ... [pytest] addopts = -rsxX -l --tb=short --strict xfail_strict = true ... more options ...
setup.cfg
:
ch6 / format / setup.cfg
... packaging specific stuff ... [tool:pytest] addopts = -rsxX -l --tb=short --strict xfail_strict = true ... more options ...
рдПрдХрдорд╛рддреНрд░ рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ setup.cfg рдХреЗ рд▓рд┐рдП рдЕрдиреБрднрд╛рдЧ рд╢реАрд░реНрд╖рд▓реЗрдЦ [tool:pytest]
рдмрдЬрд╛рдп [pytest]
ред
Pytest тАУhelp рдХреЗ рд╕рд╛рде рдорд╛рдиреНрдп рдЗрди-рдлрд╛рдЗрд▓ рд╡рд┐рдХрд▓реНрдк рд╕реВрдЪреАрдмрджреНрдз рдХрд░реЗрдВ
рдЖрдк pytest.ini
рд╕реЗ pytest --help
рд▓рд┐рдП рд╕рднреА рдорд╛рдиреНрдп рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
$ pytest --help ... [pytest] ini-options in the first pytest.ini|tox.ini|setup.cfg file found: markers (linelist) markers for test functions empty_parameter_set_mark (string) default marker for empty parametersets norecursedirs (args) directory patterns to avoid for recursion testpaths (args) directories to search for tests when no files or directories are given in the command line. console_output_style (string) console output: classic or with additional progress information (classic|progress). usefixtures (args) list of default fixtures to be used with this project python_files (args) glob-style file patterns for Python test module discovery python_classes (args) prefixes or glob names for Python test class discovery python_functions (args) prefixes or glob names for Python test function and method discovery xfail_strict (bool) default for the strict parameter of xfail markers when not given explicitly (default: False) junit_suite_name (string) Test suite name for JUnit report junit_logging (string) Write captured log messages to JUnit report: one of no|system-out|system-err doctest_optionflags (args) option flags for doctests doctest_encoding (string) encoding used for doctest files cache_dir (string) cache directory path. filterwarnings (linelist) Each line specifies a pattern for warnings.filterwarnings. Processed after -W and --pythonwarnings. log_print (bool) default value for --no-print-logs log_level (string) default value for --log-level log_format (string) default value for --log-format log_date_format (string) default value for --log-date-format log_cli (bool) enable log display during test run (also known as "live logging"). log_cli_level (string) default value for --log-cli-level log_cli_format (string) default value for --log-cli-format log_cli_date_format (string) default value for --log-cli-date-format log_file (string) default value for --log-file log_file_level (string) default value for --log-file-level log_file_format (string) default value for --log-file-format log_file_date_format (string) default value for --log-file-date-format addopts (args) extra command line options minversion (string) minimally required pytest version xvfb_width (string) Width of the Xvfb display xvfb_height (string) Height of the Xvfb display xvfb_colordepth (string) Color depth of the Xvfb display xvfb_args (args) Additional arguments for Xvfb xvfb_xauth (bool) Generate an Xauthority token for Xvfb. Needs xauth. ...
рдЖрдк рдЗрд╕ рдЕрдзреНрдпрд╛рдп рдореЗрдВ рдЗрди рд╕рднреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ doctest_optionflags
рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде doctest_optionflags
, рдЬрд┐рд╕рдХреА рдЪрд░реНрдЪрд╛ рдЕрдзреНрдпрд╛рдп 7, рдкреГрд╖реНрда 125 рдкрд░ "рдЕрдиреНрдп рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде pytest рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП" рдореЗрдВ рдХреА рдЧрдИ рд╣реИред
рдкреНрд▓рдЧрдЗрдиреНрд╕ ini рдлрд╝рд╛рдЗрд▓ рд╡рд┐рдХрд▓реНрдк рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ
рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреА рдкрд┐рдЫрд▓реА рд╕реВрдЪреА рдПрдХ рд╕реНрдерд┐рд░ рдирд╣реАрдВ рд╣реИред рдкреНрд▓рдЧрдЗрдиреНрд╕ (рдФрд░ conftest.py рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП) рдореЗрдВ ini рдлрд╝рд╛рдЗрд▓ рд╡рд┐рдХрд▓реНрдк рдЬреЛрдбрд╝рдирд╛ рд╕рдВрднрд╡ рд╣реИред рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рдХрд▓реНрдк pytest --help рдХрдорд╛рдВрдб рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рднреА рдЬреЛрдбрд╝реЗ рдЬрд╛рдПрдВрдЧреЗред
рдЕрдм рдХреБрдЫ рд╡рд┐рдиреНрдпрд╛рд╕ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рдХреЛрд░ pytest рдореЗрдВ рдЙрдкрд▓рдмреНрдз .ini рдлрд╝рд╛рдЗрд▓ рдХреА рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рд╡рд┐рдХрд▓реНрдк рдмрджрд▓реЗрдВ
рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА pytest рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ -v/--verbose
-l/--showlocals
рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП -l/--showlocals
рд╡рд┐рдлрд▓ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдХреЗ рд╕рд╛рде рд╕реНрдерд╛рдиреАрдп рдЪрд░ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдПред рдЖрдк рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рд╣рдореЗрд╢рд╛ рдЗрди optionsтАФor
рдХреБрдЫ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ optionsтАФor
themтАФfor a project
рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рд▓рд┐рдП addopts
рдореЗрдВ pytest.ini
рд╕реНрдерд╛рдкрд┐рдд addopts
, рддреЛ рдЖрдкрдХреЛ рдЕрдм рдЙрдиреНрд╣реЗрдВ рджрд░реНрдЬ рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣рд╛рдБ рдПрдХ рд╕реЗрдЯ рд╣реИ рдЬреЛ рдореБрдЭреЗ рдкрд╕рдВрдж рд╣реИ:
[pytest] addopts = -rsxX -l --tb=short --strict
-rsxX
рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рдХреЛ рд╕рднреА skipped
, xfailed
рдпрд╛ xpassed
рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдХрд╛рд░рдгреЛрдВ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред -l
рд╕реНрд╡рд┐рдЪ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ pytest рдХреЛ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред --tb=short
рдвреЗрд░ рдХреЗ рдЯреНрд░реЗрд╕ рдХреЛ рд╣рдЯрд╛ рджреЗрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдФрд░ рд▓рд╛рдЗрди рдирдВрдмрд░ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдЧрд╛ред - --strict
рдЯреЛрдХрди рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ рдпрджрд┐ рд╡реЗ рд╡рд┐рдиреНрдпрд╛рд╕ рдлрд╛рдЗрд▓ рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдирд╣реАрдВ рд╣реИрдВред рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЗрд╕реЗ рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ рдХреИрд╕реЗ рдХрд░реЗрдВред
рдорд╛рд░реНрдХрд░ рдЯрд╛рдЗрдкреЛ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рд░реНрдХрд░ рдкрдВрдЬреАрдХрд░рдг
рдХрд╕реНрдЯрдо рдорд╛рд░реНрдХрд░, рдЬреИрд╕рд╛ рдХрд┐ рдкреГрд╖реНрда 31 рдкрд░ "рд▓реЗрдмрд▓рд┐рдВрдЧ рдЯреЗрд╕реНрдЯ рдлрд╝рдВрдХреНрд╢рдВрд╕" рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИ, рдЖрдкрдХреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рд░реНрдХрд░ рдХреЗ рд╕рд╛рде рдЪрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рдмрд╕реЗрдЯ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рд╛рди рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдорд╛рд░реНрдХрд░ рдореЗрдВ рдЧрд▓рддреА рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ рдФрд░ рдЕрдВрддрддрдГ рдХреБрдЫ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ @pytest.mark.smoke
рдФрд░ рдХреБрдЫ рдХреЛ @pytest.mark.somke
рдЯреИрдЧ рдХрд┐рдпрд╛ @pytest.mark.somke
ред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдпрд╣ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИред рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рджреЛ рдорд╛рд░реНрдХрд░ рдмрдирд╛рдП рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ pytest.ini рдореЗрдВ рдЯреЛрдХрди рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рдХреЗ рддрдп рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
[pytest] ... markers = smoke: Run the smoke test test functions get: Run the test functions that test tasks.get() ...
рдЗрди рдорд╛рд░реНрдХрд░реЛрдВ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдХреЗ, рдЕрдм рдЖрдк рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде pytest --markers
рд╕рд╛рде рднреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:
$ cd /path/to/code/ch6/b/tasks_proj/tests $ pytest --markers @pytest.mark.smoke: Run the smoke test test functions @pytest.mark.get: Run the test functions that test tasks.get() @pytest.mark.skip(reason=None): skip the ... ...
рдпрджрд┐ рдорд╛рд░реНрдХрд░ рдкрдВрдЬреАрдХреГрдд рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рд╡реЗ - --markers
рд╕реВрдЪреА рдореЗрдВ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрдВрдЧреЗред рдЬрдм рд╡реЗ рдкрдВрдЬреАрдХреГрдд рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рд╡реЗ рд╕реВрдЪреАрдмрджреНрдз рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдпрджрд┐ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ - --strict
, рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рднреА рдЯреЛрдХрди рдпрд╛ рдЕрдкрдВрдЬреАрдХреГрдд рдХреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред ch6/a/tasks_proj
рдФрд░ ch6/b/tasks_proj
рдмреАрдЪ рдПрдХрдорд╛рддреНрд░ рдЕрдВрддрд░ pytest.ini рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рд╣реИред ch6/a
рдЦрд╛рд▓реА рд╣реИред рдЖрдЗрдП рдмрд┐рдирд╛ рдХрд┐рд╕реА рдорд╛рд░реНрдХрд░ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд┐рдП рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ:
$ cd /path/to/code/ch6/a/tasks_proj/tests $ pytest --strict --tb=line ============================= test session starts ============================= collected 45 items / 2 errors =================================== ERRORS ==================================== ______________________ ERROR collecting func/test_add.py ______________________ 'smoke' not a registered marker ________________ ERROR collecting func/test_api_exceptions.py _________________ 'smoke' not a registered marker !!!!!!!!!!!!!!!!!!! Interrupted: 2 errors during collection !!!!!!!!!!!!!!!!!!! =========================== 2 error in 1.10 seconds ===========================
рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рдорд╛рд░реНрдХрд░реЛрдВ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП pytest.ini
рдореЗрдВ рдорд╛рд░реНрдХрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЕрдкрдиреЗ addopts
рд╕рд╛рде-рд╕рд╛рде рдЙрд╕ рдкрд░ addopts
рджреМрд░рд╛рди рднреА рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рдореБрдЭреЗ рдмрд╛рдж рдореЗрдВ рдзрдиреНрдпрд╡рд╛рдж рджреЗрдВрдЧреЗред рдЪрд▓реЛ рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВ рдФрд░ рдХрд╛рд░реНрдп рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдПрдХ pytest.ini рдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:
рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рдорд╛рд░реНрдХрд░реЛрдВ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП pytest.ini
рдореЗрдВ рдорд╛рд░реНрдХрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЕрдкрдиреЗ addopts
рднреА рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рдореБрдЭреЗ рдмрд╛рдж рдореЗрдВ рдзрдиреНрдпрд╡рд╛рдж рджреЗрдВрдЧреЗред рдЪрд▓реЛ рдЬрд╛рд░реА рд░рдЦреЗрдВ рдФрд░ pytest.ini рдлрд╝рд╛рдЗрд▓ рдХреЛ рдХрд╛рд░реНрдп рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:
рдпрджрд┐ рдЖрдк рдЯреЛрдХрди рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП pytest.ini
рдореЗрдВ рдЯреЛрдХрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк --strict
рд╕рд╛рде рдореМрдЬреВрджрд╛ рд╡рд╛рд▓реЗ рдХреЛ рднреА рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рд╢рд╛рдВрдд! pytest.ini
рдзрдиреНрдпрд╡рд╛рдж pytest.ini
рдФрд░ tasks
рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ pytest.ini
рдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝реЗрдВ:
ch6 / b / task_proj / рдкрд░реАрдХреНрд╖рдг / pytest.ini
[pytest] addopts = -rsxX -l --tb=short --strict markers = smoke: Run the smoke test test functions get: Run the test functions that test tasks.get()
рдпрд╣рд╛рдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдкрд╕рдВрджреАрджрд╛ рдЭрдВрдбреЗ рдХрд╛ рд╕рдВрдпреЛрдЬрди рд╣реИ:
-rsxX
рдпрд╣ -rsxX
рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП -rsxX
рдХреМрди рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдЫреЛрдбрд╝ рджрд┐рдП рдЧрдП рд╣реИрдВ, xfailed рдпрд╛ xpassed,--tb = short
рд╡рд┐рдлрд▓рддрд╛рдУрдВ рдкрд░ рдПрдХ рдЫреЛрдЯреЗ рдирд┐рд╢рд╛рди рдХреЗ рд▓рд┐рдП рдЫреЛрдЯрд╛,--strict
рдХреЗрд╡рд▓ рдШреЛрд╖рд┐рдд рдЯреЛрдХрди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХрд╛ --strict
ред
рдФрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдорд╛рд░реНрдХрд░реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреАред
рдЗрд╕рд╕реЗ рд╣рдореЗрдВ рдзреБрдЖрдВ рдкрд░реАрдХреНрд╖рдг рд╕рд╣рд┐рдд рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рдиреА рдЪрд╛рд╣рд┐рдП:
$ cd /path/to/code/ch6/b/tasks_proj/tests $ pytest --strict -m smoke ===================== test session starts ====================== collected 57 items func/test_add.py . func/test_api_exceptions.py .. ===================== 54 tests deselected ====================== =========== 3 passed, 54 deselected in 0.06 seconds ============
рдиреНрдпреВрдирддрдо рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рдЖрд╡рд╢реНрдпрдХрддрд╛
рдиреНрдпреВрдирддрдо minversion
рдкреИрд░рд╛рдореАрдЯрд░ minversion
рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдкреЗрдХреНрд╖рд┐рдд рдиреНрдпреВрдирддрдо рдкрд╛рдЗрд╕реНрдЯ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ "рдХрд╛рдлреА рдХрд░реАрдм" рд╕рдорд╛рдирддрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлреНрд▓реЛрдЯрд┐рдВрдЧ-рдкреЙрдЗрдВрдЯ рдирдВрдмрд░реЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╕рдордп approx()
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рдХрд┐рдпрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рд╕рдВрд╕реНрдХрд░рдг 3.0 рддрдХ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рдореЗрдВ рдкреЗрд╢ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рднреНрд░рдо рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВ рдЬреЛ approx()
рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:
[pytest] minversion = 3.0
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЕрдЧрд░ рдХреЛрдИ рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рдХреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред
рдЧрд▓рдд рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдЬрд╛рдиреЗ рд╕реЗ рд░реЛрдХреЗрдВ
рдХреНрдпрд╛ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ "рд░рд┐рдХрд░реНрд╕" рдХреА рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рджреЛ рдмрд╛рд░ рд╢рдкрде рд▓реЗрдирд╛ рд╣реИ? рдЦреИрд░, рдирд╣реАрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕рдХрд╛ рдЕрд░реНрде рдЙрдкрдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд▓реЗрдЦрд╛рдВрдХрди рд╣реИред рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдХреА рдкреБрди: рдЬрд╛рдВрдЪ рдХрд░рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдХрд░реЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдХреБрдЫ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдПрдВ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рджреЗрдЦрдиреЗ рд╕реЗ рдмрд╛рд╣рд░ рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
norecurse
рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди '. * Build dist CVS _darcs {arch} and *.egg. Having '.*'
'. * Build dist CVS _darcs {arch} and *.egg. Having '.*'
'. * Build dist CVS _darcs {arch} and *.egg. Having '.*'
рдЕрдкрдиреЗ рдЖрднрд╛рд╕реА рд╡рд╛рддрд╛рд╡рд░рдг рдХрд╛ рдирд╛рдо рд░рдЦрдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдХрд╛рд░рдг рд╣реИ '.venv', рдХреНрдпреЛрдВрдХрд┐ рдбреЙрдЯ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╕рднреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдПрдВ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрдВрдЧреАред
рдХрд╛рд░реНрдп рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, src
рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪреЛрдЯ рдирд╣реАрдВ рдкрд╣реБрдВрдЪреЗрдЧреА, рдХреНрдпреЛрдВрдХрд┐ pytest рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдЦреЛрдЬ рдХрд░рдирд╛ рд╕рдордп рдХреА рдмрд░реНрдмрд╛рджреА рд╣реЛрдЧреАред
[pytest] norecursedirs = .* venv src *.egg dist build
рдЙрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддреЗ рд╕рдордп рдЬрд┐рд╕рдХрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрдкрдпреЛрдЧреА рдорд╛рди рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдпрд╣ рдкреИрд░рд╛рдореАрдЯрд░, рдпрд╣ рдЬрд╛рдирдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реИ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХреНрдпрд╛ рд╣реИрдВ рдФрд░ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рд╡рд╛рдкрд╕ рдХрд░реЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд┐рдЫрд▓реЗ рдХреЛрдб рдореЗрдВ *.egg dist build
рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдерд╛ред
norecursedirs
рдкрд░реАрдХреНрд╖рдг рдкрдереЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдЗрдП рдЗрд╕ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓рддреЗ рд╣реИрдВред
рдкрд░реАрдХреНрд╖рдг рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдЯреНрд░реА рд╡рд┐рдирд┐рд░реНрджреЗрд╢
рдЬрдмрдХрд┐ norecursedirs
рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдХрд╣рд╛рдБ рджреЗрдЦрдирд╛ рд╣реИ, testpaths
рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдХрд╣рд╛рдБ рджреЗрдЦрдирд╛ рд╣реИред testspaths
рдкрд░реАрдХреНрд╖рдг рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд░реВрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рддрднреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛, рдлрд╝рд╛рдЗрд▓ рдпрд╛ nodeid
рдХреЛ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдПрдХ Tasks
рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рд╣рдордиреЗ pytest.ini
рдХреЛ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдмрдЬрд╛рдп tasks_proj
рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд░рдЦрд╛:
\code\tasks_proj>tree/f . тФВ pytest.ini тФВ тФЬтФАтФАтФАsrc тФВ тФФтФАтФАтФАtasks тФВ api.py тФВ ... тФВ тФФтФАтФАтФАtests тФВ conftest.py тФВ pytest.ini тФВ тФЬтФАтФАтФАfunc тФВ test_add.py тФВ ... тФВ тФЬтФАтФАтФАunit тФВ test_task.py тФВ __init__.py тФВ ...
рддрдм рдкрд░реАрдХреНрд╖рдг рдХреЛ testpaths
рдореЗрдВ рд░рдЦрдирд╛ рд╕рдордЭрджрд╛рд░реА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:
[pytest] testpaths = tests
рдЕрдм, рдпрджрд┐ рдЖрдк tasks_proj
рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕реЗ pytest рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ pytest рдХреЗрд╡рд▓ tasks_proj/tests
рдореЗрдВ рдЦреЛрдЬ рдХрд░реЗрдЧрд╛ред рдпрд╣рд╛рдВ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдФрд░ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди, рдореИрдВ рдЕрдХреНрд╕рд░ рдкрд░реАрдХреНрд╖рдг рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдкрд░ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд░рддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рдкреВрд░реЗ рдкрде рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рдмрд┐рдирд╛ рдЙрдкрдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдпрд╛ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдЗрд╕рд▓рд┐рдП, рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдореЗрд░реА рдереЛрдбрд╝реА рдорджрдж рдХрд░рддрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдирд┐рд░рдВрддрд░ рдПрдХреАрдХрд░рдг рд╕рд░реНрд╡рд░ рдпрд╛ рд╡рд┐рд╖рд╛рдХреНрдд рд╕реЗ рдЪрд▓ рд░рд╣реЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИред рдЗрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд░реВрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рддрдп рд╣реЛ рдЬрд╛рдПрдЧреА, рдФрд░ рдЖрдк рдЙрд╕ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпреЗ рдРрд╕реЗ рдорд╛рдорд▓реЗ рднреА рд╣реИрдВ рдЬрдм рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рдордп рдХреЛ рдХрдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рдЦреЛрдЬ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИред
рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рдпрд╣ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдкрде рдФрд░ norecursedirs
рджреЛрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рд▓рдЧ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╣реА рджреЗрдЦ рдЪреБрдХреЗ рд╣реИрдВ, рдкрд░реАрдХреНрд╖рдг рдкрде рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╣рд┐рд╕реНрд╕реЛрдВ рд╕реЗ рд╕рдВрд╡рд╛рджрд╛рддреНрдордХ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдмрд╣реБрдд рдХрдо рдорджрдж рдХрд░рддреЗ рд╣реИрдВред рдЗрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ, norecursedirs
рдорджрдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд░реАрдХреНрд╖рдг рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдПрдВ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рдкрд░реАрдХреНрд╖рдг рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдЖрдк рдЙрдирд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП norecursedirs
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рд░рдЦрдиреЗ рдХреА рдмрд╛рдд рдирд╣реАрдВ рд╣реИ рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рд╣реИрдВ?
рдЯреЗрд╕реНрдЯ рдбрд┐рдЯреЗрдХреНрд╢рди рдирд┐рдпрдо рдмрджрд▓рдирд╛
pytest рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд░реАрдХреНрд╖рдг рдЦреЛрдЬ рдирд┐рдпрдореЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдкрд╛рддрд╛ рд╣реИред рдорд╛рдирдХ рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рдирд┐рдпрдо:
тАв рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реЗрдВред рдЖрдк рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдкрд░ рдлрд╛рдЗрд▓реЛрдВ рдпрд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдирд╛рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдкрдиреЗ рдХреБрдЫ рднреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рд╡рд░реНрддрдорд╛рди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
тАв рдкрд░реАрдХреНрд╖рдг рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдХреИрдЯрд▓реЙрдЧ рдФрд░ рдЙрд╕рдХреЗ рд╕рднреА рдЙрдкрдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдЦреЛрдЬреЗрдВред
тАв рдПрдХ рдкрд░реАрдХреНрд╖рдг рдореЙрдбреНрдпреВрд▓ рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдирд╛рдо test_*.py
рдпрд╛ *_test.py
ред
тАв рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдореЙрдбреНрдпреВрд▓ рджреЗрдЦреЗрдВ ред
тАв рдЯреЗрд╕реНрдЯ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдХрдХреНрд╖рд╛рдУрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░реЗрдВред рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рддрд░реАрдХреЛрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░реЗрдВ рдЬреЛ `рдкрд░реАрдХреНрд╖рдг рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВ ,
рдЗрдирд┐рдЯ` ,
ред
рдпреЗ рдорд╛рдирдХ рдкрд╣рдЪрд╛рди рдирд┐рдпрдо рд╣реИрдВ; рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЖрдк рдЙрдиреНрд╣реЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред
python_classes
рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рдФрд░ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдирд┐рдпрдо рдпрд╣ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдХрдХреНрд╖рд╛ рдХреЛ рд╕рдВрднрд╛рд╡рд┐рдд рдкрд░реАрдХреНрд╖рдг рд╡рд░реНрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рдП рдпрджрд┐ рд╡рд╣ Test*
рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рд╡рд░реНрдЧ рдореЗрдВ __init__()
рд╡рд┐рдзрд┐ рднреА рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╣рдо рдЕрдкрдиреА рдкрд░реАрдХреНрд╖рд╛ рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдирд╛рдо <something>Test
рдпрд╛ <something>Suite
рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдБ python_classes
рдЖрддрд╛ python_classes
:
[pytest] python_classes = *Test Test* *Suite
рдпрд╣ рд╣рдореЗрдВ рдЗрд╕ рддрд░рд╣ рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдирд╛рдо рджреЗрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:
class DeleteSuite(): def test_delete_1(): ... def test_delete_2(): ... ....
python_files
pytest_classes
рддрд░рд╣, python_files
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЯреЗрд╕реНрдЯ рдбрд┐рдЯреЗрдХреНрд╢рди рдирд┐рдпрдо рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдРрд╕реА рдлрд╛рдЗрд▓реЗрдВ рдвреВрдВрдврдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ рдЬреЛ test_*
рд╢реБрд░реВ рд╣реЛрддреА рд╣реИрдВ рдпрд╛ рдЕрдВрдд рдореЗрдВ *_test
рд╣реЛрддреА рд╣реИрдВред
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдХрд╕реНрдЯрдо рдкрд░реАрдХреНрд╖рдг рдврд╛рдВрдЪрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЖрдкрдиреЗ рдЕрдкрдиреА рд╕рднреА рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдирд╛рдо check_<something>.py
ред рдЙрдЪрд┐рдд рд▓рдЧрддрд╛ рд╣реИред рдЕрдкрдиреА рд╕рднреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдирд╛рдо рдмрджрд▓рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдХреЗрд╡рд▓ pytest.ini
рд▓рд┐рдП рдПрдХ рдкрдВрдХреНрддрд┐ рдЬреЛрдбрд╝реЗрдВ:
[pytest] python_files = test_* *_test check_*
рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рдЕрдм рдЖрдк рдзреАрд░реЗ-рдзреАрд░реЗ рдирд╛рдордХрд░рдг рд╕рдореНрдореЗрд▓рди рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ, рдпрд╛ рдЗрд╕реЗ check_*
рд░реВрдк рдореЗрдВ рдЫреЛрдбрд╝ рджреЗрдВред
python_functions
python_functions
рджреЛ рдкрд┐рдЫрд▓реА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рд╡рд┐рдзрд┐ рдирд╛рдореЛрдВ рдХреЗ рд▓рд┐рдПред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди test_*
ред рдФрд░ check_*
рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП - check_*
рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ - рдРрд╕рд╛ рдХрд░реЗрдВ:
[pytest] python_functions = test_* check_*
pytest
рдирд╛рдордХрд░рдг pytest
рдЗрддрдиреА рдкреНрд░рддрд┐рдмрдВрдзрд╛рддреНрдордХ рдирд╣реАрдВ рд▓рдЧрддреАрдВ, рдХреНрдпрд╛ рд╡реЗ? рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдкрдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд╛рдордХрд░рдг рд╕рдореНрдореЗрд▓рди рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ, рддреЛ рдЗрд╕реЗ рдмрджрд▓ рджреЗрдВред рдлрд┐рд░ рднреА, рдореИрдВ рдЖрдкрд╕реЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдирд┐рд░реНрдгрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдзрд┐рдХ рд╕рдореНрдореЛрд╣рдХ рдХрд╛рд░рдг рдХрд╛ рдЖрдЧреНрд░рд╣ рдХрд░рддрд╛ рд╣реВрдВред рд╕реИрдХрдбрд╝реЛрдВ рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд░рдирд╛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдЕрдЪреНрдЫрд╛ рдХрд╛рд░рдг рд╣реИред
XPASS рдмреИрди
xfail_strict = true
рд╕реЗрдЯ рдХрд░рдирд╛ xfail_strict = true
рдЕрд░реНрде рд╣реИ рдХрд┐ @pytest.mark.xfail
рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рдкрд░реАрдХреНрд╖рдг рддреНрд░реБрдЯрд┐ рдХреЗ рдХрд╛рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдиреНрдпрддрд╛ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реЗрдЯрд┐рдВрдЧ рд╣рдореЗрд╢рд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред xfail
рдЯреЛрдХрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП xfail
рдкреГрд╖реНрда 37 рдкрд░ "рдЕрд╕рдлрд▓рддрд╛ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдореЗрдВ рдЕрдВрдХрди рдкрд░реАрдХреНрд╖рдг" рджреЗрдЦреЗрдВред
рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рд╕рдВрдШрд░реНрд╖ рд░реЛрдХреЗрдВ
рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдЙрдкрдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ __init__.py
рдлрд╝рд╛рдЗрд▓ рд╣реЛрдиреЗ рдХреА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдиреЗ рдореБрдЭреЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рднреНрд░рдорд┐рдд рдХрд┐рдпрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЙрдирдХреЗ рд╣реЛрдиреЗ рдпрд╛ рди рд╣реЛрдиреЗ рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рд╕рд░рд▓ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕рднреА рдкрд░реАрдХреНрд╖рдг рдЙрдкрдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ __init__.py
рдлрд╛рдЗрд▓реЗрдВ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╣реА рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдХрдИ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рдЕрдЧрд░ рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдФрд░ b
рджреЛрдиреЛрдВ рдореЗрдВ рдлрд╝рд╛рдЗрд▓ test_foo.py
ред рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдЗрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╡реЗ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреЗ рд╣реИрдВ:
ch6 / dups / a / test_foo.py
def test_a(): pass
ch6 / dups / b / test_foo.py
def test_b(): pass
рдЗрд╕ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде:
dups тФЬтФАтФА a тФВ тФФтФАтФА test_foo.py тФФтФАтФА b тФФтФАтФА test_foo.py
рдЗрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╕рдорд╛рди рд╕рд╛рдордЧреНрд░реА рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд░реАрдХреНрд╖рдг рджреВрд╖рд┐рдд рд╣реИрдВред рдЖрдк рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ рд╕реЗ рдЪрд▓рд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди pytest
рд╕реЗ pytest
рдХреЛ рдЪрд▓рд╛рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ:
$ cd /path/to/code/ch6/dups $ pytest a ============================= test session starts ============================= collected 1 item a\test_foo.py . ========================== 1 passed in 0.05 seconds =========================== $ pytest b ============================= test session starts ============================= collected 1 item b\test_foo.py . ========================== 1 passed in 0.05 seconds =========================== $ pytest ============================= test session starts ============================= collected 1 item / 1 errors =================================== ERRORS ==================================== _______________________ ERROR collecting b/test_foo.py ________________________ import file mismatch: imported module 'test_foo' has this __file__ attribute: /path/to/code/ch6/dups/a/test_foo.py which is not the same as the test file we want to collect: /path/to/code/ch6/dups/b/test_foo.py HINT: remove __pycache__ / .pyc files and/or use a unique basename for your test file modules !!!!!!!!!!!!!!!!!!! Interrupted: 1 errors during collection !!!!!!!!!!!!!!!!!!! =========================== 1 error in 0.34 seconds ===========================
рдХреБрдЫ рднреА рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ!
рдпрд╣ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдЗрдВрдЧрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реБрдЖред
рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ __init__.py
рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЙрдкрдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред рдпрд╣рд╛рдВ рд╕рдорд╛рди рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдлрд╝рд╛рдЗрд▓ рдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рде dups_fixed
рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рд▓реЗрдХрд┐рди __init__.py
рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде:
dups_fixed/ тФЬтФАтФА a тФВ тФЬтФАтФА __init__.py тФВ тФФтФАтФА test_foo.py тФФтФАтФА b тФЬтФАтФА __init__.py тФФтФАтФА test_foo.py
рдЕрдм рд╣рдо рд╢реАрд░реНрд╖ рд╕реНрддрд░ рд╕реЗ рдлрд┐рд░ рд╕реЗ рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ dups_fixed
:
$ cd /path/to/code/ch6/ch6/dups_fixed/ $ pytest ============================= test session starts ============================= collected 2 items a\test_foo.py . b\test_foo.py . ========================== 2 passed in 0.15 seconds ===========================
рддреЛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ред
рдмреЗрд╢рдХ, рдЖрдк рдЦреБрдж рдХреЛ рд╕рдордЭрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХрднреА рднреА рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ, рддрд╛рдХрд┐ рдХреЛрдИ рдлрд░реНрдХ рди рдкрдбрд╝реЗред рд╕рдм рдХреБрдЫ, рдЬреИрд╕реЗ, рд╕рд╛рдорд╛рдиреНрдп рд╣реИред рд▓реЗрдХрд┐рди рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рдмрдврд╝ рд░рд╣реА рд╣реИрдВ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреИрдЯрд▓реЙрдЧ рдмрдврд╝ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕рдХреА рджреЗрдЦрднрд╛рд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЗ рд╕рд╛рде рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рдореИрдВ рдХрд╣рддрд╛ рд╣реВрдВ, рдмрд╕ рдЗрди рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рд╡рд╣рд╛рдВ рд░рдЦреЛред рдЗрд╕реЗ рдПрдХ рдЖрджрдд рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдЪрд┐рдВрддрд╛ рди рдХрд░реЗрдВред
рдЕрднреНрдпрд╛рд╕
рдЕрдзреНрдпрд╛рдп 5 рдореЗрдВ, рдкреНрд▓рдЧрдЗрдиреНрд╕, рдкреГрд╖реНрда 95 рдкрд░, рдЖрдкрдиреЗ рдПрдХ рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ-рдирд╛рдЗрд╕ рдирд╛рдордХ рдПрдХ рдкреНрд▓рдЧрдЗрди рдмрдирд╛рдпрд╛ рдЬрд┐рд╕рдореЗрдВ рдПрдХ --nice рдХрдорд╛рдВрдб-рд▓рд╛рдЗрди рд╡рд┐рдХрд▓реНрдк рд╢рд╛рдорд┐рд▓ рдерд╛ред рдЪрд▓реЛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ pytest.ini рд╡рд┐рдХрд▓реНрдк рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВред
рдЕрдзреНрдпрд╛рдп 5 рдореЗрдВ, рдкреГрд╖реНрда 95 рдкрд░ "рдкреНрд▓рдЧрдЗрдиреНрд╕", рдЖрдкрдиреЗ рдПрдХ pytest-nice
рдирд╛рдордХ рдПрдХ рдкреНрд▓рдЧрдЗрди рдмрдирд╛рдпрд╛ рдЬрд┐рд╕рдореЗрдВ --nice
рдХрдорд╛рдВрдб-рд▓рд╛рдЗрди --nice
ред рдЪрд▓реЛ nice
рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ pytest.ini
рд╡рд┐рдХрд▓реНрдк рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВред
- рдирд┐рдореНрди рдкрдВрдХреНрддрд┐ рдХреЛ
pytest_addoption
pytest_nice.py
рд╣реБрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ: parser.addini('nice', type='bool', help='Turn failures into opportunities.')
- рдкреНрд▓рдЧрдЗрди рдореЗрдВ рд╕реНрдерд╛рди рдЬреЛ
getoption()
рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, getoption()
getini('nice')
рднреА рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпреЗ рдмрджрд▓рд╛рд╡ рдХрд░реЗрдВред pytest.ini
рдлрд╝рд╛рдЗрд▓ рдореЗрдВ nice
рдЬреЛрдбрд╝рдХрд░ рдЗрд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдВред- рдкреНрд▓рдЧрдЗрди рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдордд рднреВрд▓рдирд╛ред рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реАрдХреНрд╖рдг рдЬреЛрдбрд╝реЗрдВ рдХрд┐
pytest.ini
рд╕реЗ nice
рдкреИрд░рд╛рдореАрдЯрд░ рд╕рд╣реА рддрд░реАрдХреЗ pytest.ini
рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред - рдкреНрд▓рдЧрдЗрди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдЬреЛрдбрд╝реЗрдВред рдЖрдкрдХреЛ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдкрд╛рдЗрд╕реНрдЯрд░ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ред
рдЖрдЧреЗ рдХреНрдпрд╛ рд╣реИ
рдЬрдмрдХрд┐ рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдмреЗрд╣рдж рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╣реИ - рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЗ рд╕рд╛рде - рдпрд╣ рдЕрдиреНрдп рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рдФрд░ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдЯреЗрд╕реНрдЯрд┐рдВрдЧ рдЯреВрд▓реНрд╕ рдХреЗ рд╕рд╛рде рднреА рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдПрдХреАрдХреГрдд рд╣реЛрддрд╛ рд╣реИред рдЕрдЧрд▓реЗ рдЕрдзреНрдпрд╛рдп рдореЗрдВ, рд╣рдо рдЕрдиреНрдп рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдкрд░реАрдХреНрд╖рдг рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВрдЧреЗред
рдкреАрдЫреЗ рдЕрдЧрд▓рд╛ 