рдкрд╛рдпрдерди рдХреЗ рд╕рд╛рде рдкрд╛рдпрдерди рдкрд░реАрдХреНрд╖рдгред рдкреНрд▓рдЧрдЗрдиреНрд╕ рдЕрдзреНрдпрд╛рдп 5

рдкреАрдЫреЗ рдЕрдЧрд▓рд╛


рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рдмреЙрдХреНрд╕ рдХреЗ рдареАрдХ рдмрд╛рд╣рд░, рдпрд╣ рддрдм рдФрд░ рднреА рдмреЗрд╣рддрд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдЖрдк рдЗрд╕рдореЗрдВ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХрд╛ рдорд┐рд╢реНрд░рдг рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рдХреЛрдб рдмреЗрд╕ рдХреЛ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдФрд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рджреНрд╡рд╛рд░рд╛ рд╕рдВрд░рдЪрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрд╢реЛрдзрди рдФрд░ рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рд╣реБрдХ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред



рдЗрд╕ рдкреБрд╕реНрддрдХ рдореЗрдВ рдЙрджрд╛рд╣рд░рдг Python 3.6 рдФрд░ pytest 3.2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВред рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ 3.2 рдкрд╛рдпрдерди 2.6, 2.7, рдФрд░ рдкрд╛рдпрдерди 3.3+ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред


рдЯрд╛рд╕реНрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЗрд╕ рдкреБрд╕реНрддрдХ рдореЗрдВ рджрд┐рдЦрд╛рдП рдЧрдП рд╕рднреА рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП, рдкреБрд╕реНрддрдХ рдХреЗ рд╡реЗрдм рдкреЗрдЬ pragprog.com рдкрд░ рд▓рд┐рдВрдХ рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рд╕реНрд░реЛрдд рдХреЛрдб рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ; рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╛ рдЕрдкрдиреА рдЦреБрдж рдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░реЗрдВ (рдЖрдкрдХреЗ рд╣рд╛рде рдЕрдирдЯреВрдЯ рд╣реЛ рдЧрдП рд╣реИрдВ!), рдЖрдкрдХреЛ рдкреБрд╕реНрддрдХ рдХреЗ рд╡реЗрдм рдкреЗрдЬ рдкрд░ рдЬрд╛рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдХрд╛рдо рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╡рд╣рд╛рдБ, рдкреБрд╕реНрддрдХ рдХреЗ рд╡реЗрдм рдкреЗрдЬ рдкрд░, рдЗрд░реЗрдЯрд╛ рд╕рдВрджреЗрд╢реЛрдВ рдФрд░ рдПрдХ рдЪрд░реНрдЪрд╛ рдордВрдЪ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рд╣реИред

рд╕реНрдкреЙрдЗрд▓рд░ рдХреЗ рддрд╣рдд рдЗрд╕ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд▓реЗрдЦреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИред



рдФрд░ рдЖрдЧреЗ рдЪрд▓рддреЗ рд╣реИрдВ!


рдЖрдкрдХреЛ рдпрд╣ рдЬрд╛рдирдХрд░ рдЖрд╢реНрдЪрд░реНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдкрдиреЗ рдЗрд╕ рдкреБрд╕реНрддрдХ рдореЗрдВ рдкрд┐рдЫрд▓реЗ рдЕрдзреНрдпрд╛рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреБрдЫ рдкреНрд▓рдЧрдЗрдиреНрд╕ рд▓рд┐рдЦреЗ рд╣реИрдВред рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд╢реАрд░реНрд╖-рд╕реНрддрд░реАрдп conftest.py рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреБрдбрд╝рдирд╛рд░ рдФрд░ / рдпрд╛ рд╣реБрдХ рдлрд╝рдВрдХреНрд╢рди conftest.py , рддреЛ рдЖрдк рдПрдХ рд╕реНрдерд╛рдиреАрдп conftest рдкреНрд▓рдЧрдЗрди рдмрдирд╛рддреЗ рд╣реИрдВред рдЗрди conftest.py рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдЗрдВрд╕реНрдЯрд╛рд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдкреНрд▓рдЧрдЗрдиреНрд╕ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛ рдХреЗрд╡рд▓ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рдо рд╣реИ, рдЬрд┐рд╕реЗ рдЖрдк рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд╕рд╛рде, рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдпрд╛ рджреБрдирд┐рдпрд╛ рдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рд╣рдо рдЗрд╕ рдЕрдзреНрдпрд╛рдп рдХреА рд╢реБрд░реБрдЖрдд рдЗрд╕ рд╕рд╡рд╛рд▓ рдХреЗ рдЬрд╡рд╛рдм рд╕реЗ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдерд░реНрдб-рдкрд╛рд░реНрдЯреА рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЛ рдХрд╣рд╛рдБ рджреЗрдЦрдирд╛ рд╣реИред рдХрд╛рдлреА рдХреБрдЫ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рдореМрдХрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрдк рдЬреЛ рдмрджрд▓рд╛рд╡ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЙрд╕реЗ рд▓рд┐рдЦрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рд╣рдо рдЦреБрд▓реЗ рд╕реНрд░реЛрдд рдкреНрд▓рдЧрдЗрдиреНрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рдпрджрд┐ рдкреНрд▓рдЧрдЗрди рд▓рдЧрднрдЧ рд╡рд╣реА рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЖрдк рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрд╛рдлреА рдирд╣реАрдВ, рдЖрдк рдЗрд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдЗрд╕реЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреНрд▓рдЧрдЗрди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрджрд░реНрдн рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджреНрдпрдкрд┐ рдпрд╣ рдЕрдзреНрдпрд╛рдп рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ, рдкреГрд╖реНрда 163 рдкрд░, рдПрдкреЗрдВрдбрд┐рдХреНрд╕ рдкреИрдХ рдкреНрд▓рдЧрдЗрди, рдЖрдкрдХреЛ рдХреНрдпрд╛ рд╕рдВрднрд╡ рд╣реИ, рдЗрд╕рдХрд╛ рд╕реНрд╡рд╛рдж рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред


рдЗрд╕ рдЕрдзреНрдпрд╛рдп рдореЗрдВ рдЖрдк рд╕реАрдЦреЗрдВрдЧреЗ рдХрд┐ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреИрд╕реЗ рдмрдирд╛рдПрдВ, рдФрд░ рдореИрдВ рдЖрдкрдХреЛ рдкрд░реАрдХреНрд╖рдг, рдкреИрдХреЗрдЬрд┐рдВрдЧ рдФрд░ рд╡рд┐рддрд░рдг рдХреЗ рд▓рд┐рдП рд╕рд╣реА рджрд┐рд╢рд╛ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ред рдкреВрд░реНрдг рдкрд╛рдпрдерди рдкреИрдХреЗрдЬрд┐рдВрдЧ рдФрд░ рд╡рд┐рддрд░рдг рд╡рд┐рд╖рдп рдмрд╣реБрдд рд╡реНрдпрд╛рдкрдХ рд╣реИ рдФрд░ рдЕрдкрдиреА рдкреБрд╕реНрддрдХ рд╣реЛрдиреЗ рдХрд╛ рджрд╛рд╡рд╛ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рд╕рдм рдХреБрдЫ рдХрд╡рд░ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЕрдкрдиреА рдЯреАрдо рдХреЗ рд╕рд╛рде рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХрд╛ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЬрд╛рдирдХрд╛рд░реА рдорд┐рд▓реЗрдЧреАред рдореИрдВ PyPI рд╕рдорд░реНрдерди рдФрд░ рдХрдо рд╕реЗ рдХрдо рдХрд╛рдо рдХреЗ рд╕рд╛рде рдкреНрд▓рдЧрдЗрдиреНрд╕ рдмрдирд╛рдиреЗ рдХреЗ рдХреБрдЫ рд╕рд░рд▓ рддрд░реАрдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ред


рдкреНрд▓рдЧрдЗрдиреНрд╕ рдЦреЛрдЬреЗрдВ


рдЖрдк рдХрдИ рдЬрдЧрд╣реЛрдВ рдкрд░ рдерд░реНрдб-рдкрд╛рд░реНрдЯреА рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рдкреНрд▓рдЧ рдЗрди рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдкреГрд╖реНрда 163 рдкрд░ рдкрд░рд┐рд╢рд┐рд╖реНрдЯ 3, рдкреНрд▓рдЧ рдЗрди рд╕реИрдореНрдкрд▓рд░ рдкреИрдХ рдореЗрдВ рд╕реВрдЪреАрдмрджреНрдз рдкреНрд▓рдЧрдЗрдиреНрд╕, PyPI рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдорд╣рд╛рди рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХрдорд╛рддреНрд░ рд╕реНрдерд╛рди рдирд╣реАрдВ рд╣реИред


https://docs.pytest.org/en/latest/plugins.html


рдореБрдЦреНрдп рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рдкреНрд░рд▓реЗрдЦрди рд╕рд╛рдЗрдЯ рдореЗрдВ рдПрдХ рдкреГрд╖реНрда рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рддрд╛ рд╣реИред


https://pypi.python.org


рдкрд╛рдпрдерди рдкреИрдХреЗрдЬ рдЗрдВрдбреЗрдХреНрд╕ (PyPI) рдмрд╣реБрдд рд╕рд╛рд░реЗ рдкрд╛рдпрдерди рдкреИрдХреЗрдЬ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рд╛рдирджрд╛рд░ рдЬрдЧрд╣ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рдкреНрд▓рдЧ рдЗрди рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдПрдХ рд╢рд╛рдирджрд╛рд░ рдЬрдЧрд╣ рд╣реИред рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рдкреНрд▓рдЧ рдЗрди рдХреА рдЦреЛрдЬ рдХрд░рддреЗ рд╕рдордп, рдмрд╕ "рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ," "рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ -" рдпрд╛ "-рдкрд╛рдЗрд╕реНрдЯ" рдХреЛ рд╕рд░реНрдЪ рдлреАрд▓реНрдб рдореЗрдВ рджрд░реНрдЬ рдХрд░реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рдкреНрд▓рдЧ рдЗрди рдпрд╛ рддреЛ "рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ -" рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВ рдпрд╛ "-рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ" рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВред


https://github.com/pytest-dev


GitHub рдкрд░ pytest-dev рд╕рдореВрд╣ рд╡рд╣ рд╣реИ рдЬрд╣рд╛рдБ pytest рд╕реНрд░реЛрдд рдХреЛрдб рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣рд╛рдВ рдЖрдк рд▓реЛрдХрдкреНрд░рд┐рдп рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рдХрд░реНрдиреЗрд▓ рдЯреАрдо рджреНрд╡рд╛рд░рд╛ рд▓рдВрдмреЗ рд╕рдордп рдореЗрдВ рд╕рдорд░реНрдерд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред


рдкреНрд▓рдЧрдЗрди рд╕реНрдерд╛рдкрдирд╛


рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рдкреНрд▓рдЧ рдХреЛ рдЕрдиреНрдп рдкрд╛рдпрдерди рдкреИрдХреЗрдЬреЛрдВ рдХреА рддрд░рд╣, рдкрд╛рдЗрдк рдХреЗ рд╕рд╛рде рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐,
рдЖрдк рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рддрд░реАрдХреЛрдВ рд╕реЗ рдкрд╛рдЗрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


PyPI рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ


рдЪреВрдВрдХрд┐ PyPI рдкрд╛рдЗрдк рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реНрдерд╛рди рд╣реИ, PyPI рд╕реЗ рдкреНрд▓рдЧ рдЗрди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реИред рдЖрдЗрдП pytest-cov plugin рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ:


 $ pip install pytest-cov 

PyPI рд╕реЗ рдирд╡реАрдирддрдо рд╕реНрдерд┐рд░ рд╕рдВрд╕реНрдХрд░рдг рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред


PyPI рд╕реЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрд╕реНрдХрд░рдг рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛


рдпрджрд┐ рдЖрдк рдкреНрд▓рдЧрдЗрди рдХрд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрд╕реНрдХрд░рдг рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк == рдмрд╛рдж рд╕рдВрд╕реНрдХрд░рдг рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 $ pip install pytest-cov==2.4.0 

.Tar.gz рдпрд╛ .whl рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ


PyPI рдкреИрдХреЗрдЬ рдХреЛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди .tar.gz рдФрд░ / рдпрд╛ .whl рд╕рд╛рде рдЬрд╝рд┐рдк рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрдиреНрд╣реЗрдВ рдЕрдХреНрд╕рд░ рдЯрд╛рд░ рдмреЙрд▓ рдФрд░ рдкрд╣рд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рд╕реАрдзреЗ PyPI рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рд╣реИ (рдЬреЛ рдлрд╝рд╛рдпрд░рд╡реЙрд▓ рдФрд░ рдЕрдиреНрдп рдиреЗрдЯрд╡рд░реНрдХ рдЬрдЯрд┐рд▓рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╣реЛ рд╕рдХрддреА рд╣реИ), рдЖрдк рдпрд╛ рддреЛ .tar.gz рдпрд╛ .whl рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕ рдпрд╛ рдЙрд╕ рд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдЖрдкрдХреЛ рдЯреИрдореНрдкреБрд░реАрди рдХреЗ рд╕рд╛рде рдЕрдирдкреИрдХ рдпрд╛ рдиреГрддреНрдп рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ; рдмрд╕ рдЙрд╕ рдкрд░ рдкрд╛рдЗрдк:


 $ pip install pytest-cov-2.4.0.tar.gz # or $ pip install pytest_cov-2.4.0-py2.py3-none-any.whl 

рд╕реНрдерд╛рдиреАрдп рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕реЗ рд╕реНрдерд╛рдкрдирд╛


рдЖрдкрдХреЗ рдкрд╛рд╕ .tar.gz рдпрд╛ .whl рдореЗрдВ рдПрдХ рд╕реНрдерд╛рдиреАрдп рдпрд╛ рд╕рд╛рдЭрд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдкреНрд▓рдЧрдЗрдиреНрд╕ (рдФрд░ рдЕрдиреНрдп рдкрд╛рдпрдерди рдкреИрдХреЗрдЬ) рдХреЗ рд▓рд┐рдП рдкреНрд▓рдЧрдЗрдиреНрд╕ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП PyPI рдХреЗ рдмрдЬрд╛рдп рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 $ mkdir some_plugins $ cp pytest_cov-2.4.0-py2.py3-none-any.whl some_plugins/ $ pip install --no-index --find-links=./some_plugins/ pytest-cov 

--no-index pip рдХреЛ PyPI рд╕реЗ рдХрдиреЗрдХреНрдЯ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реИред --find-links=./some_plugins/ рдкрд╛рдЗрдк рдХреЛ some_plugins рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реИред рдпрд╣ рд╡рд┐рдзрд┐ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧреА рд╣реИ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдерд░реНрдб-рдкрд╛рд░реНрдЯреА рдФрд░ рдЖрдкрдХреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреНрд▓рдЧрдЗрдиреНрд╕ рджреЛрдиреЛрдВ рд╣реИрдВ, рд╕рд╛рде рд╣реА рдпрджрд┐ рдЖрдк рдирд┐рд░рдВрддрд░ рдПрдХреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдпрд╛ рд╡рд┐рд╖рд╛рдХреНрдд рдХреЗ рд╕рд╛рде рдирдП рдЖрднрд╛рд╕реА рд╡рд╛рддрд╛рд╡рд░рдг рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВред (рд╣рдо рдЕрдзреНрдпрд╛рдп 7 рдореЗрдВ рдкреЗрдЬ 7 рдкрд░ рдЕрдиреНрдп рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЕрдзреНрдпрд╛рдп 7 рдореЗрдВ рдЬрд╣рд░реАрд▓реЗ рдФрд░ рдирд┐рд░рдВрддрд░ рдПрдХреАрдХрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред)


рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕реНрдерд╛рдиреАрдп рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдк рдХрдИ рд╕рдВрд╕реНрдХрд░рдг рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдХреМрди рд╕рд╛ рд╕рдВрд╕реНрдХрд░рдг == рдФрд░ рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрдЦреНрдпрд╛ рдЬреЛрдбрд╝рдХрд░ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:


 $ pip install --no-index --find-links=./some_plugins/ pytest-cov==2.4.0 

Git рднрдВрдбрд╛рд░ рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ


рдЖрдк рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ Git рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ рд╕реАрдзреЗ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ GitHub:


 $ pip install git+https://github.com/pytest-dev/pytest-cov 

рдЖрдк рд╕рдВрд╕реНрдХрд░рдг рдЯреИрдЧ рднреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 $ pip install git+https://github.com/pytest-dev/pytest-cov@v2.4.0 

рдпрд╛ рдЖрдк рдПрдХ рд╢рд╛рдЦрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 $ pip install git+https://github.com/pytest-dev/pytest-cov@master 

Git рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдирд╛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧреА рд╣реИ рдпрджрд┐ рдЖрдк Git рдореЗрдВ рдЕрдкрдирд╛ рдХрд╛рдо рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдпрд╛ рдпрджрд┐ рдкреНрд▓рдЧ рдпрд╛ рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЖрд╡рд╢реНрдпрдХ рд╕рдВрд╕реНрдХрд░рдг PyPI рд╕реЗ рдЧрд╛рдпрдм рд╣реИред


рдЕрдиреБрд╡рд╛рджрдХ рдиреЛрдЯ:

рдкрд╛рдЗрдк Git, Mercurial, Subversion, рдФрд░ Bazaar рд╕реЗ рд╕реНрдерд╛рдкрдирд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ рдФрд░ url рдЙрдкрд╕рд░реНрдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ VCS рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ: "git +", "hg +", "svn +", "bzr +"ред
рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП PyPI рдкреНрд░рд▓реЗрдЦрди рджреЗрдЦреЗрдВред

рдЕрдкрдиреЗ рдЦреБрдж рдХреЗ рдкреНрд▓рдЧрдЗрдиреНрд╕ рд▓рд┐рдЦрдирд╛


рдХрдИ рддреГрддреАрдп-рдкрдХреНрд╖ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЛрдб рд╣реЛрддреЗ рд╣реИрдВред рдпрд╣ рдЙрди рдХрд╛рд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдо рдЕрдкрдиреЗ рд╕рдордп рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЖрдкрдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреЛрдб рдХреЗ рд▓рд┐рдП, рдЖрдк рдирд┐рд╕реНрд╕рдВрджреЗрд╣ рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдЬреБрдбрд╝рдирд╛рд░ рдФрд░ рд╕рдВрд╢реЛрдзрдиреЛрдВ рдХреЗ рд╕рд╛рде рдЖрдПрдВрдЧреЗред рдПрдХ рдкреНрд▓рдЧрдЗрди рдмрдирд╛рдХрд░, рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдХрдИ рдЬреБрдбрд╝рдирд╛рд░ рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рдХрдИ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рдмреАрдЪ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЖрдк рдЗрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдХрдИ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдФрд░ рд╕рдВрднрд╡рддрдГ рджреБрдирд┐рдпрд╛ рдХреЗ рдмрд╛рдХреА рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЗ рд╕рд╛рде - рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдФрд░ рд╡рд┐рддрд░рд┐рдд рдХрд░рдХреЗред рдпрд╣ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рдЗрд╕ рдЦрдВрдб рдореЗрдВ, рд╣рдо pytest рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рд╕рдВрд╢реЛрдзрди рд╡рд┐рдХрд╕рд┐рдд рдХрд░реЗрдВрдЧреЗ, рдЗрд╕реЗ рдПрдХ рдкреНрд▓рдЧрдЗрди рдХреЗ рд░реВрдк рдореЗрдВ рдкреИрдХ рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВрдЧреЗ рдФрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред


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


рдкреНрд▓рдЧрдЗрди рдореИрдХреЗрдирд┐рдХреНрд╕ рдХреА рдЪрд░реНрдЪрд╛ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдЕрд▓рдЧ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕реЗ рдкреБрдирд░реНрд╡рд┐рддрд░рдг рдкреНрд▓рдЧрдЗрди рдореЗрдВ рдмрджрд▓рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ conftest.py рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░реЗрдВрдЧреЗред рдЖрдкрдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдХреНрд╕рд░, рдХреЗрд╡рд▓ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкрд░рд┐рд╡рд░реНрддрди рдПрдХ рдкреНрд▓рдЧрдЗрди рдореЗрдВ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдФрд░ рдЪрд╛рд▓реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЙрдкрдпреЛрдЧреА рд╣реЛрдВрдЧреЗред рдЗрд╕рд▓рд┐рдП, рд╣рдо conftest.py рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝рдХрд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░, conftest.py рдореЗрдВ рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдХреЛрдб рдХреЛ рдкреИрдХреЗрдЬ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред


рд╡рд╛рдкрд╕ рдХрд╛рд░реНрдп рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдПред рдкреГрд╖реНрда 30 рдкрд░ "рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛" рдЕрдиреБрднрд╛рдЧ рдореЗрдВ, рд╣рдордиреЗ рдХрдИ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦреЗ рдЬреЛ рдпрд╣ рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдЕрдкрд╡рд╛рдж рдХреЛ рдХрд┐рд╕реА рдиреЗ рдПрдкреАрдЖрдИ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдХрд╣рд╛ рдерд╛ред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рддреНрд░реБрдЯрд┐ рд░рд╛рдЬреНрдпреЛрдВ рдХреЛ рдпрд╛рдж рдХрд░ рд░рд╣реЗ рд╣реИрдВред


рдпрд╣рд╛рдБ рдХреБрдЫ рдФрд░ рдкрд░реАрдХреНрд╖рдг рд╣реИрдВ:


ch5 / a / functions_proj / рдкрд░реАрдХреНрд╖рдг / func / test_api_exception.py

 """     API wrong.""" import pytest import tasks from tasks import Task @pytest.mark.usefixtures('tasks_db') class TestAdd(): """,   tasks.add().""" def test_missing_summary(self): """  ,  summary missing.""" with pytest.raises(ValueError): tasks.add(Task(owner='bob')) def test_done_not_bool(self): """  ,  done   bool.""" with pytest.raises(ValueError): tasks.add(Task(summary='summary', done='True')) 

рдпрджрд┐ рд╡реЗ рдкрд╛рд╕ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдЪрд▓рд╛рдПрдВ


 $ cd /path/to/code/ch5/a/tasks_proj $ pytest ===================== test session starts ====================== collected 57 items tests/func/test_add.py ... tests/func/test_add_variety.py ............................ tests/func/test_add_variety2.py ............ tests/func/test_api_exceptions.py .F....... tests/func/test_unique_id.py . tests/unit/test_task.py .... =========================== FAILURES =========================== __________________ TestAdd.test_done_not_bool __________________ self = <func.test_api_exceptions.TestAdd object at 0x103a71a20> def test_done_not_bool(self): """Should raise an exception if done is not a bool.""" with pytest.raises(ValueError): > tasks.add(Task(summary='summary', done='True')) E Failed: DID NOT RAISE <class 'ValueError'> tests/func/test_api_exceptions.py:20: Failed ============= 1 failed, 56 passed in 0.28 seconds ============== 

рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП -v рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдЪрд▓рд╛рддреЗ рд╣реИрдВред рдЪреВрдБрдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╣реА рдЯреНрд░реЗрд╕ рджреЗрдЦ рдЪреБрдХреЗ рд╣реИрдВ, рдЖрдк рдЗрд╕реЗ рдмрдВрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - --tb=no ред


рдЕрдм рдЖрдЗрдП -k TestAdd рд╕рд╛рде рдирдП рдкрд░реАрдХреНрд╖рдгреЛрдВ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдВ, рдЬреЛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ "TestAdd" рдирд╛рдо рд╡рд╛рд▓реЗ рдХреЛрдИ рдЕрдиреНрдп рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рд╣реИрдВред


рд╣рдо "рд╕рдм рдХреБрдЫ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ" рдФрд░ рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдФрд░ рд╣рдо рдЗрд╕реЗ рдмрд╛рдж рдореЗрдВ рдХрд░реЗрдВрдЧреЗ), рд▓реЗрдХрд┐рди рдЕрдм рд╣рдо рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рд╡рд┐рдлрд▓рддрд╛рдУрдВ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрдЦрдж рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдВрдЧреЗред


рдЪрд▓рд┐рдП рд╣реЗрдбрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдзрдиреНрдпрд╡рд╛рдж рд╕рдВрджреЗрд╢ рдЬреЛрдбрд╝рдХрд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдЖрдк pytest_report_header() рдирд╛рдордХ рдПрдХ рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рд╣реБрдХ рдХреЗ рд╕рд╛рде рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


ch5 / b / task_proj / рдкрд░реАрдХреНрд╖рдг / conftest.py

 def pytest_report_header(): """    .""" return "Thanks for running the tests." 

рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдзрдиреНрдпрд╡рд╛рдж рдиреЛрдЯ рдЯрд╛рдЗрдк рдХрд░рдирд╛ рдмрд╣реБрдд рд╣реА рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣реЗрдбрд░ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЖрдк рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдЙрдкрдХрд░рдгреЛрдВ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╕рдм рдХреБрдЫ рдЬрд┐рд╕реЗ рдЖрдк рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╢реАрд░реНрд╖рдХ рдореЗрдВ рдбрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдлрд┐рд░ рд╣рдо OPPORTUNITY for improvement F рд╕реЗ O рдФрд░ FAILED рдХреЛ OPPORTUNITY for improvement рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреЗрд╕реНрдЯ рд╕реНрдЯреЗрдЯрд╕ рд░рд┐рдкреЛрд░реНрдЯ рдХреЛ рдмрджрд▓ рджреЗрдВрдЧреЗред рдПрдХ рд╣реБрдХ рд╣реИ рдЬреЛ рдЗрд╕ рд╕рдВрдмрдВрдз рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ: pytest_report_teststatus() :


ch5 / b / task_proj / рдкрд░реАрдХреНрд╖рдг / conftest.py

 def pytest_report_teststatus(report): """   .""" if report.when == 'call' and report.failed: return (report.outcome, 'O', 'OPPORTUNITY for improvement') 

рдФрд░ рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмрд╕ рд╡рд╣ рдЙрдкрд╛рдп рд╣реИ рдЬрд┐рд╕рдХреА рд╣рдо рддрд▓рд╛рд╢ рдХрд░ рд░рд╣реЗ рдереЗред --verbose рдлрд╝реНрд▓реИрдЧ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╕рддреНрд░ рд╡рд┐рдлрд▓рддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП O рджрд┐рдЦрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рд╕реБрдзрд╛рд░ рд╕рдВрднрд╡ рд╣реИрдВ:


 $ cd /path/to/code/ch5/b/tasks_proj/tests/func $ pytest --tb=no test_api_exceptions.py -k TestAdd ===================== test session starts ====================== Thanks for running the tests. collected 9 items test_api_exceptions.py .O ====================== 7 tests deselected ====================== ======= 1 failed, 1 passed, 7 deselected in 0.06 seconds ======= 

-v рдпрд╛ --verbose рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛:


 $ pytest -v --tb=no test_api_exceptions.py -k TestAdd ===================== test session starts ====================== Thanks for running the tests. collected 9 items test_api_exceptions.py::TestAdd::test_missing_summary PASSED test_api_exceptions.py::TestAdd::test_done_not_bool OPPORTUNITY for improvement ====================== 7 tests deselected ====================== ======= 1 failed, 1 passed, 7 deselected in 0.07 seconds ======= 

рдЕрдВрддрд┐рдо рдмрджрд▓рд╛рд╡ рд╣рдо рдПрдХ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдкреИрд░рд╛рдореАрдЯрд░, --nice, рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВ --nice, рддрд╛рдХрд┐ рд╣рдорд╛рд░реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рддрднреА рд╣реЛ рдЬрдм рдЖрдк рд╕реНрдерд╛рдирд╛рдкрдиреНрди --nice : -


 def pytest_addoption(parser): """ nice    --nice.""" group = parser.getgroup('nice') group.addoption("--nice", action="store_true", help="nice: turn failures into opportunities") def pytest_report_header(): """    .""" if pytest.config.getoption('nice'): return "Thanks for running the tests." def pytest_report_teststatus(report): """   .""" if report.when == 'call': if report.failed and pytest.config.getoption('nice'): return (report.outcome, 'O', 'OPPORTUNITY for improvement') 

рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдЗрд╕ рдкреНрд▓рдЧрдЗрди рдХреЗ рд▓рд┐рдП рд╣рдо рдХреЗрд╡рд▓ рдПрдХ-рджреЛ рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдХрдИ рдЕрдиреНрдп рд╣реИрдВ рдЬреЛ рдореБрдЦреНрдп рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рдкреНрд░рд▓реЗрдЦрди рд╕рд╛рдЗрдЯ рдкрд░ рдкрд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред


рдЕрдм рд╣рдо рдЕрдкрдиреЗ рдкреНрд▓рдЧрдЗрди рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЕрдкрдиреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЪрд▓рд╛рдХрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкрд╣рд▓рд╛, рдмрд┐рдирд╛ --nice рд╡рд┐рдХрд▓реНрдк рдХреЗ, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреЗрд╡рд▓ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:


 $ cd /path/to/code/ch5/c/tasks_proj/tests/func $ pytest --tb=no test_api_exceptions.py -k TestAdd ===================== test session starts ====================== collected 9 items test_api_exceptions.py .F ====================== 7 tests deselected ====================== ======= 1 failed, 1 passed, 7 deselected in 0.07 seconds ======= 

рдЕрдм рд╕рд╛рде - --nice :


 $ pytest --nice --tb=no test_api_exceptions.py -k TestAdd ===================== test session starts ====================== Thanks for running the tests. collected 9 items test_api_exceptions.py .O ====================== 7 tests deselected ====================== ======= 1 failed, 1 passed, 7 deselected in 0.07 seconds ======= 

рдЕрдм рд╕рд╛рде --nice рдФрд░ --verbose :


 $ pytest -v --nice --tb=no test_api_exceptions.py -k TestAdd ===================== test session starts ====================== Thanks for running the tests. collected 9 items test_api_exceptions.py::TestAdd::test_missing_summary PASSED test_api_exceptions.py::TestAdd::test_done_not_bool OPPORTUNITY for improvement ====================== 7 tests deselected ====================== ======= 1 failed, 1 passed, 7 deselected in 0.06 seconds ======= 

рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛! рд╕рднреА рдмрджрд▓рд╛рд╡ рдЬреЛ рд╣рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ, рд╡реЗ рд▓рдЧрднрдЧ рджрд╕ рд▓рд╛рдЗрдиреЛрдВ рдХреЗ conftest.py рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдХрд┐рдП рдЧрдП рдереЗред рдЖрдЧреЗ рд╣рдо рдЗрд╕ рдХреЛрдб рдХреЛ рдкреНрд▓рдЧрдЗрди рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдореЗрдВ рд▓реЗ рдЬрд╛рдПрдВрдЧреЗред


рдПрдХ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдкреНрд▓рдЧрдЗрди рдмрдирд╛рдирд╛


рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдкреНрд▓рдЧрдЗрдиреНрд╕ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдЖрдк рдХрднреА рднреА рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреНрд▓рдЧрдЗрди рдХреЛ PyPI рдореЗрдВ рдЪрд╛рд▓реВ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдЧреБрдЬрд░рдиреЗ рд╕реЗ рдЖрдкрдХреЛ рдУрдкрди рд╕реЛрд░реНрд╕ рдкреНрд▓рдЧрдЗрдиреНрд╕ рд╕реЗ рдХреЛрдб рдкрдврд╝рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдпрд╣ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдХреЗ рдЕрдзрд┐рдХ рдЕрд╡рд╕рд░ рд╣реЛрдВрдЧреЗ рдХрд┐ рд╡реЗ рдЖрдкрдХреА рдорджрдж рдХрд░реЗрдВрдЧреЗ рдпрд╛ рдирд╣реАрдВред


рдЗрд╕ рдкреБрд╕реНрддрдХ рдореЗрдВ рдкрд╛рдЗрдерди рдкреИрдХреЗрдЬреЛрдВ рдХреА рдкреИрдХреЗрдЬрд┐рдВрдЧ рдФрд░ рд╡рд┐рддрд░рдг рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╡рд░ рдХрд░рдирд╛ рдмрд╣реБрдд рд╣реА рдЙрдЪрд┐рдд рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд┐рд╖рдп рдХрд╣реАрдВ рдФрд░ рдкреНрд░рд▓реЗрдЦрд┐рдд рд╣реИред рдпрд╣рд╛рдБ рдФрд░ рдпрд╣рд╛рдБ рдФрд░ рдпрд╣рд╛рдБ рд░реВрд╕реА рдореЗрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╕реНрдерд╛рдиреАрдп рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреНрд▓рдЧ-рдЗрди рд╕реЗ рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реБрдП рд╣рдордиреЗ рдкрд┐рдЫрд▓реЗ рднрд╛рдЧ рдореЗрдВ рдкрд╛рдЗрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреБрдЫ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдпрд╣ рдХреЛрдИ рдмрдбрд╝реА рдмрд╛рдд рдирд╣реАрдВ рд╣реИред ред


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдЕрдкрдиреЗ рдкреНрд▓рдЧрдЗрди рдХреЛрдб рдХреЛ рд╣реЛрд╕реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдИ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдХреНрдпрд╛ рдХрд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЬрдм рд╕реЗ рд╣рдо рдЕрдЪреНрдЫреЗ рдЭрдВрдбреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд▓рдЧрдЗрди рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕реЗ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдХрд╣рддреЗ рд╣реИрдВред рдЗрд╕ рдирдИ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рдлрд╛рдЗрд▓реЗрдВ рд╣реЛрдВрдЧреА: pytest_nice.py рдФрд░ setup.pyред (рдкрд░реАрдХреНрд╖рдг рд╕реВрдЪреА рдкреГрд╖реНрда 105 рдкрд░ "рдЯреЗрд╕реНрдЯ рдкреНрд▓рдЧрдЗрдиреНрд╕" рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАред)


 тФВ LICENSE тФВ pytest_nice.py тФВ setup.py тФВ тФФтФАтФАтФАtests тФВ conftest.py тФВ test_nice.py 

pytest_nice.py , рд╣рдо рдЕрдкрдиреЗ conftest.py рдХреА рд╕рдЯреАрдХ рд╕рд╛рдордЧреНрд░реА рдбрд╛рд▓рддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдЬреБрдбрд╝реА рд╣реБрдИ рдереА (рдФрд░ рдЗрд╕реЗ tasks_proj/tests/conftest.py ):


ch5 / pytest-nice / pytest_nice.py


 """  pytest-nice .""" import pytest def pytest_addoption(parser): """ nice    --nice.""" group = parser.getgroup('nice') group.addoption("--nice", action="store_true", help="nice: turn FAILED into OPPORTUNITY for improvement") def pytest_report_header(): """    .""" if pytest.config.getoption('nice'): return "Thanks for running the tests." def pytest_report_teststatus(report): """   .""" if report.when == 'call': if report.failed and pytest.config.getoption('nice'): return (report.outcome, 'O', 'OPPORTUNITY for improvement') 

setup.py рд╣рдореЗрдВ setup() рд▓рд┐рдП рд╕рдмрд╕реЗ рдиреНрдпреВрдирддрдо рдХреЙрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ setup() :


ch5 / pytest-nice / setup.py

 """Setup  pytest-nice plugin.""" from setuptools import setup setup( name='pytest-nice', version='0.1.0', description=' Pytest,   FAILURE into OPPORTUNITY', url='https:////////', author=' ', author_email='your_email@somewhere.com', license='proprietary', py_modules=['pytest_nice'], install_requires=['pytest'], entry_points={'pytest11': ['nice = pytest_nice', ], }, ) 

рдпрджрд┐ рдЖрдкрдХреЛ рдЗрд╕реЗ рд╡реНрдпрд╛рдкрдХ рджрд░реНрд╢рдХреЛрдВ рдпрд╛ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рд╡рд┐рддрд░рд┐рдд рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдХ рдЫреЛрдЯреА рдЯреАрдо рдХреЗ рд▓рд┐рдП рдпрд╛ рд╕рд┐рд░реНрдл рдЕрдкрдиреЗ рд▓рд┐рдП, рдпрд╣ рдХрд╛рдлреА рд╣реЛрдЧрд╛ред


рдЖрдк setup() рд▓рд┐рдП рдХреБрдЫ рдЕрдиреНрдп рдкреИрд░рд╛рдореАрдЯрд░ рд╢рд╛рдорд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ setup() ; рдФрд░ рдпрд╣рд╛рдБ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХ рдХреНрд╖реЗрддреНрд░ рд╣реИрдВред рд╕рдВрд╕реНрдХрд░рдг рдлрд╝реАрд▓реНрдб рдЗрд╕ рдкреНрд▓рдЧрдЗрди рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рд╣реИред рдФрд░ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЖрдк рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИ рдЬрдм рдЖрдк рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд▓рд╛рддреЗ рд╣реИрдВред URL рдлрд╝реАрд▓реНрдб рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЖрдк рдЗрд╕реЗ рдЦрд╛рд▓реА рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рдорд┐рд▓реЗрдЧреАред author рдФрд░ author_email рдХреЛ maintainer рдФрд░ author_email рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрдирдореЗрдВ рд╕реЗ рдПрдХ рдЬреЛрдбрд╝рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред license рдлрд╝реАрд▓реНрдб рдПрдХ рдЫреЛрдЯрд╛ рдЯреЗрдХреНрд╕реНрдЯ рдлрд╝реАрд▓реНрдб рд╣реИред рдпрд╣ рдХрдИ рдЦреБрд▓реЗ рд╕реНрд░реЛрдд рд▓рд╛рдЗрд╕реЗрдВрд╕реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЖрдкрдХрд╛ рдирд╛рдо рдпрд╛ рдХрдВрдкрдиреА, рдпрд╛ рдЖрдкрдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдХреБрдЫред py_modules pytest_nice рдХреЛ рдЗрд╕ рдкреНрд▓рдЧрдЗрди рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдПрдХрдорд╛рддреНрд░ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реВрдЪреАрдмрджреНрдз pytest_nice ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдПрдХ рд╕реВрдЪреА рд╣реИ, рдФрд░ рдЖрдк рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдореЙрдбреНрдпреВрд▓ рд╢рд╛рдорд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрдЧрд░ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдерд╛, рддреЛ рдореИрдВ рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ рдФрд░ рд╕рднреА рдореЙрдбреНрдпреВрд▓ рдХреЛ рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдбрд╛рд▓реВрдВрдЧрд╛ред


рдЕрдм рддрдХ, рд╕рднреА setup() рд╡рд┐рдХрд▓реНрдк рдорд╛рдирдХ рд╣реИрдВ рдФрд░ рд╕рднреА рдкрд╛рдпрдерди рдЗрдВрд╕реНрдЯреЙрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣рд┐рд╕реНрд╕рд╛ рдПрдВрдЯреНрд░реА_ entry_points рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИред рд╣рдордиреЗ entry_points={'pytest11': ['nice = pytest_nice', ], },. рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд┐рдпрд╛ рд╣реИ entry_points={'pytest11': ['nice = pytest_nice', ], },. entry_points рдлрд╝рдВрдХреНрд╢рди entry_points рд▓рд┐рдП рдорд╛рдирдХ рд╣реИ, рд▓реЗрдХрд┐рди pytest11 рд╡рд╣ рд╡рд┐рд╢реЗрд╖ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ pytest рдЦреЛрдЬ рд░рд╣рд╛ рд╣реИред рдЗрд╕ рдкрдВрдХреНрддрд┐ рдореЗрдВ, рд╣рдо pytest рдХреЛ рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ nice рд╣рдорд╛рд░реЗ рдкреНрд▓рдЧрдЗрди рдХрд╛ рдирд╛рдо рд╣реИ, рдФрд░ pytest_nice рдЙрд╕ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдирд╛рдо рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╣рдорд╛рд░рд╛ рдкреНрд▓рдЧрдЗрди рд░рд╣рддрд╛ рд╣реИред рдпрджрд┐ рд╣рдо рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣рд╛рдВ рд╣рдорд╛рд░рд╛ рдкреНрд░рд╡реЗрд╢ рд╣реЛрдЧрд╛:


рдореИрдВрдиреЗ README.rst рдлрд╝рд╛рдЗрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдирд╣реАрдВ рдХреА README.rst ред рдЖрд░рдИрдПрдбреАрдПрдордИ рдХрд╛ рдХреБрдЫ рд░реВрдк рд╕реЗрдЯрдкреВрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдпрд╣ рдорд┐рд▓реЗрдЧрд╛:


 ... warning: sdist: standard file not found: should have one of README, README.rst, README.txt ... 

README рдХреЛ рдХреБрдЫ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЬрд╛рдирдХрд╛рд░реА рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рдорд╛рдирдХ рддрд░реАрдХреЗ рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЦрдирд╛ рд╡реИрд╕реЗ рднреА рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред рдпрд╣рд╛рдБ рдореИрдВ pytest-рдЕрдЪреНрдЫрд╛ рдХреЗ рд▓рд┐рдП рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХреНрдпрд╛ рд░рдЦрд╛ рд╣реИ:


ch5 / pytest-nice / README.rst

 pytest-nice : A pytest plugin =============================   pytest     .  -------- -   ,     pytest. -  ``--nice`` , : -  ``F``  ``O`` -  ``-v``,  ``FAILURE``  ``OPPORTUNITY for improvement``  ------------ ,    Pytest    .tar.gz    PATH,  : :: $ pip install PATH/pytest-nice-0.1.0.tar.gz $ pip install --no-index --find-links PATH pytest-nice  ----- :: $ pytest --nice 

README рдлрд╛рдЗрд▓ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕ рдкрд░ рдХрдИ рд░рд╛рдп рд╣реИрдВред рдпрд╣ рдПрдХ рднрд╛рд░реА рдлрд╕рд▓реА рд╕рдВрд╕реНрдХрд░рдг рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред


рдкрд░реАрдХреНрд╖рдг рдкреНрд▓рдЧрдЗрдиреНрд╕


рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЛрдб рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдХрд┐рд╕реА рдЕрдиреНрдп рдХреЛрдб рдХреА рддрд░рд╣ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкрд░реАрдХреНрд╖рдг рдЙрдкрдХрд░рдг рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИред рдЬрдм рд╣рдордиреЗ рдкреГрд╖реНрда 98 рдкрд░, "рд▓реЗрдЦрди рдпреЛрд░ рдУрди рдкреНрд▓рдЧрдЗрдиреНрд╕" рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдкреНрд▓рдЧрдЗрди рдХреЛрдб рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛, рддреЛ рд╣рдордиреЗ рдЗрд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдПрдХ рдирдореВрдирд╛ рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЗрд╕рдХреЗ рд╕рд╛рде pytest рдЪрд▓рд╛рдХрд░ рдФрд░ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдЙрдЯрдкреБрдЯ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдХреЗ рдХрд┐ рдпрд╣ рд╕рд╣реА рдерд╛ред рд╣рдо pytester рдирд╛рдордХ рдПрдХ рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдореЛрдб рдореЗрдВ рднреА рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ pytest рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЕрдХреНрд╖рдо рд╣реИред


Pytest-nice: conftest.py рдФрд░ test_nice.py рд▓рд┐рдП рд╣рдорд╛рд░реА рдкрд░реАрдХреНрд╖рдг рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рджреЛ рдлрд╛рдЗрд▓реЗрдВ рд╣реИрдВред pytester рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ pytester рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдкрдВрдХреНрддрд┐ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


ch5 / pytest-nice / рдкрд░реАрдХреНрд╖рдг / conftest.py

 """pytester is needed for testing plugins.""" pytest_plugins = 'pytester' 

рдЗрд╕ рд▓рд╛рдЗрди рдореЗрдВ pytester plugin рд╢рд╛рдорд┐рд▓ рд╣реИред рд╣рдо testdir рдирд╛рдордХ рдПрдХ рд╕реНрдерд┐рд░рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рддрдм рдЙрдкрд▓рдмреНрдз рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм pytester рдЪрд╛рд▓реВ рд╣реЛрддрд╛ рд╣реИред
рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЗ рд▓рд┐рдП рдЕрдХреНрд╕рд░ рдкрд░реАрдХреНрд╖рдг рдЙрд╕ рд░реВрдк рдХреЛ рд▓реЗрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдордиреЗ рд╕реНрд╡рдпрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдерд╛:


  1. рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБред
  2. рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХреБрдЫ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдпрд╛ рдЙрд╕рдХреЗ рдмрд┐рдирд╛ pytest рдЪрд▓рд╛рдПрдБред
  3. рдЖрдЙрдЯрдкреБрдЯ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВред
  4. рд╕рдВрднрд╡ рд╣реИ, рдкрд░рд┐рдгрд╛рдо рдХреЛрдб рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдкрд╛рд╕реЛрдВ рдХреЗ рд▓рд┐рдП 0 рд╣реИ, рдХреБрдЫ рд╡рд┐рдлрд▓рддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП 1 рд╣реИред

рдЖрдЗрдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ:


ch5 / pytest-nice / рдкрд░реАрдХреНрд╖рдг / test_nice.py

 def test_pass_fail(testdir): #     Pytest testdir.makepyfile(""" def test_pass(): assert 1 == 1 def test_fail(): assert 1 == 2 """) #  pytest result = testdir.runpytest() # fnmatch_lines    result.stdout.fnmatch_lines([ '*.F', # .  Pass, F  Fail ]) # ,      '1'  testsuite assert result.ret == 1 

рдлрд╝рд┐рдХреНрдЪрд░ testdir рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдореЗрдЬрдмрд╛рдиреА рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдмрдирд╛рддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рдПрдХ makepyfile() рд╡рд┐рдзрд┐ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдбрд╛рд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рджреЛ рдкрд░реАрдХреНрд╖рдг рдмрдирд╛рддреЗ рд╣реИрдВ: рдПрдХ рдЬреЛ рдЧреБрдЬрд░рддрд╛ рд╣реИ рдФрд░ рджреВрд╕рд░рд╛ рдЬреЛ рдкрд╛рд╕ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ ред


рд╣рдо testdir.runpytest() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдирдИ рдкрд░реАрдХреНрд╖рдг рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рдЪрд▓рд╛рддреЗ рд╣реИрдВред рдЖрдк рдЪрд╛рд╣реЗрдВ рддреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╡рд╛рдкрд╕реА рдорд╛рди рдмрд╛рдж рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ RunResult рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реИред


рдЖрдорддреМрд░ рдкрд░ рдореИрдВ stdout рдФрд░ ret рджреЗрдЦрддрд╛ рд╣реВрдВред , , , fnmatch_lines , , , , ret 0 1 . , fnmatch_lines , . . , , :


ch5/pytest-nice/tests/test_nice.py

 @pytest.fixture() def sample_test(testdir): testdir.makepyfile(""" def test_pass(): assert 1 == 1 def test_fail(): assert 1 == 2 """) return testdir 

, , sample_test , . :


ch5/pytest-nice/tests/test_nice.py

 def test_with_nice(sample_test): result = sample_test.runpytest('--nice') result.stdout.fnmatch_lines(['*.O', ]) # . for Pass, O for Fail assert result.ret == 1 def test_with_nice_verbose(sample_test): result = sample_test.runpytest('-v', '--nice') result.stdout.fnmatch_lines([ '*::test_fail OPPORTUNITY for improvement', ]) assert result.ret == 1 def test_not_nice_verbose(sample_test): result = sample_test.runpytest('-v') result.stdout.fnmatch_lines(['*::test_fail FAILED']) assert result.ret == 1 

. , :


ch5/pytest-nice/tests/test_nice.py

 def test_header(sample_test): result = sample_test.runpytest('--nice') result.stdout.fnmatch_lines(['Thanks for running the tests.']) def test_header_not_nice(sample_test): result = sample_test.runpytest() thanks_message = 'Thanks for running the tests.' assert thanks_message not in result.stdout.str() 

, , .


:


ch5/pytest-nice/tests/test_nice.py

 def test_help_message(testdir): result = testdir.runpytest('--help') # fnmatch_lines    result.stdout.fnmatch_lines([ 'nice:', '*--nice*nice: turn FAILED into OPPORTUNITY for improvement', ]) 

, , , .


pytest-nice , . .zip.gz , :


 $ cd /path/to/code/ch5/pytest-nice/ $ pip install . Processing /path/to/code/ch5/pytest-nice Requirement already satisfied: pytest in /path/to/venv/lib/python3.6/site-packages (from pytest-nice==0.1.0) Requirement already satisfied: py>=1.4.33 in /path/to/venv/lib/python3.6/site-packages (from pytest->pytest-nice==0.1.0) Requirement already satisfied: setuptools in /path/to/venv/lib/python3.6/site-packages (from pytest->pytest-nice==0.1.0) Building wheels for collected packages: pytest-nice Running setup.py bdist_wheel for pytest-nice ... done ... Successfully built pytest-nice Installing collected packages: pytest-nice Successfully installed pytest-nice-0.1.0 

, , :


 $ pytest -v ===================== test session starts ====================== plugins: nice-0.1.0 collected 7 items tests/test_nice.py::test_pass_fail PASSED tests/test_nice.py::test_with_nice PASSED tests/test_nice.py::test_with_nice_verbose PASSED tests/test_nice.py::test_not_nice_verbose PASSED tests/test_nice.py::test_header PASSED tests/test_nice.py::test_header_not_nice PASSED tests/test_nice.py::test_help_message PASSED =================== 7 passed in 0.34 seconds =================== 

. : , . .
 platform win32 -- Python 3.6.5, pytest-3.9.3, py-1.7.0, pluggy-0.8.0 -- c:\venv36\scripts\python.exe collected 7 items tests/test_nice.py::test_pass_fail FAILED [ 14%] tests/test_nice.py::test_with_nice OPPORTUNITY for improvement [ 28%] tests/test_nice.py::test_with_nice_verbose OPPORTUNITY for improvement [ 42%] tests/test_nice.py::test_not_nice_verbose FAILED [ 57%] tests/test_nice.py::test_header PASSED [ 71%] tests/test_nice.py::test_header_not_nice PASSED [ 85%] tests/test_nice.py::test_help_message PASSED [100%] ================================== FAILURES =================================== _______________________________ test_pass_fail ________________________________ 



  result.stdout.fnmatch_lines([ '*.F', # . for Pass, F for Fail ]) 


рдкрд░
  result.stdout.fnmatch_lines([ '*.F*', # . for Pass, F for Fail ]) 


* F

test_with_nice , test_with_nice_verbose , test_not_nice_verbose

pytest.
c
'test_with_nice.py .O [100%]'
.
,

RemovedInPytest4Warning: usage of Session.Class is deprecated, please use pytest.Class instead

!
 (venv36) c:\_BOOKS_\pytest_si\bopytest-code\code\ch5\pytest-nice>pytest -v ============================= test session starts ============================= platform win32 -- Python 3.6.5, pytest-3.9.3, py-1.7.0, pluggy-0.8.0 -- c:\venv36\scripts\python.exe cachedir: .pytest_cache rootdir: c:\_BOOKS_\pytest_si\bopytest-code\code\ch5\pytest-nice, inifile: plugins: nice-0.1.0 collected 7 items tests/test_nice.py::test_pass_fail PASSED [ 14%] tests/test_nice.py::test_with_nice PASSED [ 28%] tests/test_nice.py::test_with_nice_verbose PASSED [ 42%] tests/test_nice.py::test_not_nice_verbose PASSED [ 57%] tests/test_nice.py::test_header PASSED [ 71%] tests/test_nice.py::test_header_not_nice PASSED [ 85%] tests/test_nice.py::test_help_message PASSED [100%] ============================== warnings summary =============================== tests/test_nice.py::test_pass_fail c:\venv36\lib\site-packages\_pytest\compat.py:332: RemovedInPytest4Warning: usage of Session.Class is deprecated, please use pytest.Class instead return getattr(object, name, default) 

рд╣реБрд░реНрд░реЗ! . (pytest-nice), Python
pytest-:


 $ pip uninstall pytest-nice Uninstalling pytest-nice-0.1.0: Would remove: \path\to\venv\lib\site-packages\pytest_nice-0.1.0.dist-info\* ... Proceed (y/n)? y Successfully uninstalled pytest-nice-0.1.0 

тАФ , pytest, PyPI.



, . , setup.py :


 $ cd /path/to/code/ch5/pytest-nice $ python setup.py sdist running sdist running egg_info creating pytest_nice.egg-info ... running check creating pytest-nice-0.1.0 ... creating dist Creating tar archive ... $ ls dist pytest-nice-0.1.0.tar.gz 

( , sdist source distribution тАФ тАЬ .тАЭ)


pytest-nice dist pytest-nice-0.1.0.tar.gz .


, , :


 $ pip install dist/pytest-nice-0.1.0.tar.gz Processing ./dist/pytest-nice-0.1.0.tar.gz ... Installing collected packages: pytest-nice Successfully installed pytest-nice-0.1.0 

.tar.gz , .



pip , , , , , , .tar.gz . , pytest-nice-0.1.0.tar.gz myplugins .


pytest-nice myplugins :


 $ pip install --no-index --find-links myplugins pytest-nice 

--no-index pip PyPI, , .
The --find-links myplugins tells PyPI to look in myplugins for packages to install. And of course, pytest-nice is what we want to install.
--find-links myplugins PyPI myplugins . , pytest-nice тАФ , .


myplugins , , --upgrade :


 $ pip install --upgrade --no-index --find-links myplugins pytest-nice 

pip , --no-index --find-links myplugins .


PyPI


, , . , . , , , Python Packaging .


pytest, тАФ cookiecutter-pytest-plugin :


 $ pip install cookiecutter $ cookiecutter https://github.com/pytest-dev/cookiecutter-pytest-plugin 

. , . ; , , . pytest, , .


рдЕрднреНрдпрд╛рд╕


ch4/cache/test_slower.py autouse fixture, check_duration() . 4. .


  1. pytest-slower, , , ┬л ┬╗ . 102.
  2. , pytest-slower , .
  3. рдкреНрд▓рдЧрдЗрди рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рд▓рд┐рдЦреЗрдВред
  4. рдкрд╛рдпрдерди рдкреИрдХреЗрдЬ рдЗрдВрдбреЗрдХреНрд╕ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ рдФрд░ "рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ-" рджреЗрдЦреЗрдВред рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдкреНрд▓рдЧрдЗрди рдЦреЛрдЬреЗрдВ рдЬреЛ рдЖрдкрдХреЛ рджрд┐рд▓рдЪрд╕реНрдк рд▓рдЧрддрд╛ рд╣реИред
  5. рдЕрдкрдиреА рдкрд╕рдВрдж рдХрд╛ рдкреНрд▓рдЧрдЗрди рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдХрд╛рд░реНрдп рдкрд░реАрдХреНрд╖рдг рдкрд░ рдЖрдЬрд╝рдорд╛рдПрдВред

рдЖрдЧреЗ рдХреНрдпрд╛ рд╣реИ


рдЖрдкрдиреЗ рдЕрдм рддрдХ conftest.pyрдЗрд╕ рдкреБрд╕реНрддрдХ рдореЗрдВ рдХрдИ рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╛рдЗрд▓реЗрдВ рднреА рд╣реИрдВ pytest.iniред рдЕрдЧрд▓реЗ рдЕрдзреНрдпрд╛рдп рдореЗрдВ, рдЖрдк рдЕрдкрдиреЗ рдЖрдк рдХреЛ рд╡рд┐рднрд┐рдиреНрди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдХрд░рд╛рдПрдБрдЧреЗ рдФрд░ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдПрдВрдЧреЗ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╕рдордп рдЖрдк рдЕрдкрдиреЗ рдЬреАрд╡рди рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдкреАрдЫреЗ рдЕрдЧрд▓рд╛

Source: https://habr.com/ru/post/hi448794/


All Articles