рдкреБрд╕реНрддрдХ "рдж рд╡реЗ рдСрдл рдкрд╛рдпрдердиред рд╡рд┐рдХрд╛рд╕, рд╕реНрдХреЗрд▓рд┐рдВрдЧ, рдкрд░реАрдХреНрд╖рдг рдФрд░ рддреИрдирд╛рддреА рдХреЗ рд▓рд┐рдП рдмреНрд▓реИрдХ рдмреЗрд▓реНрдЯ тАЭ

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

рдЕрдВрд╢ред рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдЪрд▓ рд░рд╣рд╛ рд╣реИ


рд░рдирд┐рдВрдЧ рдЯреЗрд╕реНрдЯ рд╕реНрд╡реАрдЯреНрд╕ рд╕рдордп рд▓реЗрдиреЗ рд╡рд╛рд▓реА рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдпрд╣ рдмрдбрд╝реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдШрдЯрдирд╛ рд╣реИ рдЬрдм рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╕реВрдЯ рдХреЛ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдореЗрдВ рдорд┐рдирдЯ рд▓рдЧрддреЗ рд╣реИрдВред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреНрд░рдо рдореЗрдВ, pytest рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рддрд╛ рд╣реИред

рдЪреВрдВрдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХрдВрдкреНрдпреВрдЯрд░реЛрдВ рдореЗрдВ рдорд▓реНрдЯреА-рдХреЛрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рдХрдИ рдХреЛрд░ рдкрд░ рдЪрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдЧрддрд┐ рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕рдХреЗ рд▓рд┐рдП, pytest рдореЗрдВ рдПрдХ pytest-xdist рдкреНрд▓рдЧрдЗрди рд╣реИ рдЬрд┐рд╕реЗ рдкрд╛рдЗрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдкреНрд▓рдЧрдЗрди pytest рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдХреЛ -numprocesses (рд╕рдВрдХреНрд╖рд┐рдкреНрдд-рдПрди) рддрд░реНрдХ рдХреЗ рд╕рд╛рде рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд рдХреЛрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рд▓реЗрддрд╛ рд╣реИред рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ-рдПрди 4 рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рд╕реВрдЯ рдЪрд╛рд░ рд╕рдорд╛рдирд╛рдВрддрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдореЗрдВ рдЪрд▓реЗрдЧрд╛, рдЬреЛ рдЙрдкрд▓рдмреНрдз рдХреЛрд░ рдХреЗ рднрд╛рд░ рдХреЗ рдмреАрдЪ рд╕рдВрддреБрд▓рди рдмрдирд╛рдП рд░рдЦреЗрдЧрд╛ред

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

рдЬреБрдбрд╝рдирд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╡рд╕реНрддреБрдПрдВ рдмрдирд╛рдирд╛


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

Pytest рдЬреБрдбрд╝рдирд╛рд░ рдореЗрдВ рд╕рд░рд▓ рдХрд╛рд░реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдлрд╝рд┐рдХреНрдЪрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╡рд╛рдВрдЫрд┐рдд рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдЬрд╣рд╛рдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред

рдпрд╣рд╛рдБ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕реНрдерд┐рд░рддрд╛ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

import pytest @pytest.fixture def database(): return <some database connection> def test_insert(database): database.insert(123) 

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

рдХреЛрдб рдкрд░реАрдХреНрд╖рдг рдХреА рдПрдХ рдФрд░ рдЖрдо рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕реНрдерд┐рд░рддрд╛ рдСрдкрд░реЗрд╢рди рдХреЗ рдмрд╛рдж рд╕реБрдкрд░рдлреНрд▓рд╕ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбреЗрдЯрд╛рдмреЗрд╕ рдХрдиреЗрдХреНрд╢рди рдмрдВрдж рдХрд░реЗрдВред рдПрдХ рдЬрдирд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдерд┐рд░рддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕рддреНрдпрд╛рдкрд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕рдлрд╛рдИ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝ рджреЗрдЧрд╛ (рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ 6.5)ред

рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ 6.5ред рдПрдХ рд╕рддреНрдпрд╛рдкрд┐рдд рд╡рд╕реНрддреБ рдХреЛ рд╕рд╛рдлрд╝ рдХрд░рдирд╛


 import pytest @pytest.fixture def database(): db = <some database connection> yield db db.close() def test_insert(database): database.insert(123) 
рдЪреВрдВрдХрд┐ рд╣рдордиреЗ рдЙрдкрдЬ рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдерд╛ рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдПрдХ рдЬрдирд░реЗрдЯрд░ рдмрдирд╛рдпрд╛ рдерд╛, рдЙрдкрдЬ рд╡рд┐рд╡рд░рдг рдХреЗ рдмрд╛рдж рдХрд╛ рдХреЛрдб рдХреЗрд╡рд▓ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдЕрдВрдд рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдХреЛрдб рдкрд░реАрдХреНрд╖рдг рдХреЗ рдЕрдВрдд рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдХрдиреЗрдХреНрд╢рди рдХреЛ рдмрдВрдж рдХрд░ рджреЗрдЧрд╛ред

рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛рдмреЗрд╕ рдХрдиреЗрдХреНрд╢рди рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рд╕реЗ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рд╢рдХреНрддрд┐ рдХрд╛ рдЕрдиреБрдЪрд┐рдд рдХрдЪрд░рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреНрдп рдкрд░реАрдХреНрд╖рдг рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЦреБрд▓реЗ рдХрдиреЗрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдк рдлрд╝реЛрдХрд╕ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рд╕реНрдХреЛрдк рддрд░реНрдХ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рдХрд╛ рд╕реНрдХреЛрдк рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 import pytest @pytest.fixture(scope="module") def database(): db = <some database connection> yield db db.close() def test_insert(database): database.insert(123) 

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

рдЖрдк рдкрд░реАрдХреНрд╖рдг рд╕реЗ рдкрд╣рд▓реЗ рдпрд╛ рдмрд╛рдж рдореЗрдВ рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рдХреЛрдб рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдлрд┐рдХреНрд╕реНрдЪрд░ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдСрдЯреЛрдЬрд╝ рдХреАрд╡рд░реНрдб рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдмрдЬрд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рд╡реЗ рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдлрд╝рдВрдХреНрд╢рди рдХреЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВред рд╕рдЪ рддрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ pytest.fixture () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЖрд░реЗрдЦрд┐рдд рдХрд░рдирд╛, рдСрдЯреЛрдЬрд╝ рдХреАрд╡рд░реНрдб, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдореЙрдбреНрдпреВрд▓ рдпрд╛ рдХреНрд▓рд╛рд╕ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣рд░ рдмрд╛рд░ рдЬреБрдбрд╝рдирд╛рд░ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЗрд╕реЗ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

 import os import pytest @pytest.fixture(autouse=True) def change_user_env(): curuser = os.environ.get("USER") os.environ["USER"] = "foobar" yield os.environ["USER"] = curuser def test_user(): assert os.getenv("USER") == "foobar"</source     .  ,    :     ,      ,       . <h3>  </h3>           ,    ,   ,         .          Gnocchi,    . Gnocchi      <i>storage API</i>.    Python          .       ,      API   .        ,      (    storage API),  ,       .   ,   <i> </i>,     ,        .  6.6          ,    :    mysql,   тАФ  postgresql. <blockquote><h4> 6.6.      </h4> <source lang="python">import pytest import myapp @pytest.fixture(params=["mysql", "postgresql"]) def database(request): d = myapp.driver(request.param) d.start() yield d d.stop() def test_insert(database): database.insert("somedata") 
рдЪрд╛рд▓рдХ рд╕реНрдерд┐рд░рддрд╛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ - рдбреЗрдЯрд╛рдмреЗрд╕ рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХреЗ рдирд╛рдо рдЬреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реИрдВред test_insert рджреЛ рдмрд╛рд░ рдЪрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдПрдХ рдмрд╛рд░ MySQL рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП, рдФрд░ рджреВрд╕рд░рд╛ PostgreSQL рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдПред рдЗрд╕рд╕реЗ рдПрдХ рд╣реА рдкрд░реАрдХреНрд╖рд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓реЗрдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд┐рднрд┐рдиреНрди рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреЗ рд╕рд╛рде, рдХреЛрдб рдХреА рдирдИ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝реЗ рдмрд┐рдирд╛ред

рдбрдореА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рдмрдВрдзрд┐рдд рдкрд░реАрдХреНрд╖рдг


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

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

рдорд╛рдирдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдбрдореА рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдХрд▓реА рдХрдорд╛рдВрдб рд╣реИред рдкрд╛рдпрдерди 3.3 рдХреЗ рд╕рд╛рде рд╢реБрд░реВ, рдореЙрдХ рдХреЛ unittest.mock рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╕рд╛рде рдПрдХреАрдХреГрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЖрдк рдкрд╛рдпрдерди 3.3 рдФрд░ рдЙрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХреЗ рдмреАрдЪ рдкрд┐рдЫрдбрд╝реЗ рдЕрдиреБрдХреВрд▓рддрд╛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 try: from unittest import mock except ImportError: import mock 

рдореЙрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рдореЙрдХ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдХреЛрдИ рднреА рд╡рд┐рд╢реЗрд╖рддрд╛ред рдореЙрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХрд┐рд╕реА рднреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдХрд┐рд╕реА рднреА рдореВрд▓реНрдп рдХреЛ рд╕реМрдВрдкрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ 6.7 рдореЗрдВ, рдбреЙрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд▓рд┐рдП рдбрдореА рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ 6.7ред рдореЙрдХ рдПрдХреНрд╕реЗрд╕ рдХрд░рдирд╛ред рдореЙрдХ рд╡рд┐рд╢реЗрд╖рддрд╛


 >>> from unittest import mock >>> m = mock.Mock() >>> m.some_attribute = "hello world" >>> m.some_attribute "hello world" 
рдЖрдк рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдПрдХ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рднреА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ 6.8 рдореЗрдВ, рдЬрд╣рд╛рдБ рдЖрдк рдПрдХ рдРрд╕реА рдбрдореА рд╡рд┐рдзрд┐ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рд╣рдореЗрд╢рд╛ 42 рд▓реМрдЯрддреА рд╣реИ рдФрд░ рдЬреЛ рдХреБрдЫ рднреА рдЖрдк рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗ рд▓реЗрддреЗ рд╣реИрдВред

рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ 6.8ред рдореЙрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдмрдирд╛рдирд╛ред рдбреЙрдХ рдбрдореА рдСрдмреНрдЬреЗрдХреНрдЯ


 >>> from unittest import mock >>> m = mock.Mock() >>> m.some_method.return_value = 42 >>> m.some_method() 42 >>> m.some_method("with", "arguments") 42 
рдмрд╕ рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпрд╛рдБ, рдФрд░ mock.Mock рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдЕрдм рдХреБрдЫ_рдорд┐рдереЛрдб () рд╡рд┐рдзрд┐ рд╣реИ, рдЬреЛ 42 рд░рд┐рдЯрд░реНрди рдХрд░рддреА рд╣реИред рдпрд╣ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХ рдХреЛ рд▓реЗрддреА рд╣реИ, рдЬрдмрдХрд┐ рддрд░реНрдХ рдХреНрдпрд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдХреЛрдИ рд╕рддреНрдпрд╛рдкрди рдирд╣реАрдВ рд╣реИред

рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рд╡рд┐рдзрд┐рдпрд╛рдВ рднреА (рдЬрд╛рдирдмреВрдЭрдХрд░) рджреБрд╖реНрдкреНрд░рднрд╛рд╡ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдХреЗрд╡рд▓ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЗ рддрд░реАрдХреЗ рдирд╣реАрдВ рд╣реИрдВ рдЬреЛ рдПрдХ рдореВрд▓реНрдп рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдЙрдкрдпреЛрдЧреА рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

6.9 рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдиреЗ рд╕реЗ рдПрдХ рдбрдореА рд╡рд┐рдзрд┐ рдмрдирддреА рд╣реИ рдЬрд┐рд╕рдХрд╛ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рд╣реЛрддрд╛ рд╣реИ - рдпрд╣ рд╕реНрдЯреНрд░рд┐рдВрдЧ "рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб" рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред

рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ 6.9ред рдПрдХ рдореЙрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдмрдирд╛рдирд╛ред рдПрдХ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдореЙрдХ рдСрдмреНрдЬреЗрдХреНрдЯ


  >>> from unittest import mock >>> m = mock.Mock() >>> def print_hello(): ... print("hello world!") ... return 43 ... тЭ╢ >>> m.some_method.side_effect = print_hello >>> m.some_method() hello world! 43 тЭ╖ >>> m.some_method.call_count 1 
рд╣рдордиреЗ some_method to рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд╕рдВрдкреВрд░реНрдг рдлрд╝рдВрдХреНрд╢рди рд╕реМрдВрдкрд╛ред рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ, рдпрд╣ рдЖрдкрдХреЛ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдкрд░рд┐рджреГрд╢реНрдп рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рдЖрдк рдбрдореА рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдХрд┐рд╕реА рднреА рдХреЛрдб рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдЧрд▓рд╛, рдЖрдкрдХреЛ рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдЗрд╕рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИред

To call_count рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд╡рд┐рдзрд┐ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реИред

рдореЙрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА "рдПрдХреНрд╢рди-рдЪреЗрдХ" рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ: рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдмрд╛рдж рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдбрдореА рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрди рдЬрд╛рдБрдЪреЛрдВ рдХреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрдореА рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдВ 6.10 рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рд╕реВрдЪреА () рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред

рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ 6.10ред рд╕рддреНрдпрд╛рдкрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ


  >>> from unittest import mock >>> m = mock.Mock() тЭ╢ >>> m.some_method('foo', 'bar') <Mock name='mock.some_method()' id='26144272'> тЭ╖ >>> m.some_method.assert_called_once_with('foo', 'bar') >>> m.some_method.assert_called_once_with('foo', тЭ╕mock.ANY) >>> m.some_method.assert_called_once_with('foo', 'baz') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python2.7/dist-packages/mock.py", line 846, in assert_cal led_once_with return self.assert_called_with(*args, **kwargs) File "/usr/lib/python2.7/dist-packages/mock.py", line 835, in assert_cal led_with raise AssertionError(msg) AssertionError: Expected call: some_method('foo', 'baz') Actual call: some_method('foo', 'bar') 
рд╣рдордиреЗ created рдкрджреНрдзрддрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдлреВ рдФрд░ рдмрд╛рд░ рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рддрд░реАрдХреЗ рдмрдирд╛рдПред рдбрдореА рд╡рд╕реНрддреБрдУрдВ рдкрд░ рдХреЙрд▓ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ assert_called () рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ assert_called_once_with () callsред рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЙрди рдорд╛рдиреЛрдВ рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рдирдХреА рдЖрдк рдбрдореА рдкрджреНрдзрддрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдкрд╛рд╕ рдХрд┐рдП рдЧрдП рдорд╛рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рд▓реЛрдЧреЛрдВ рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдореЙрдХ рдПрд╕реЗрд░реЗрд░рд┐рдпрдирд░ рдЕрдкрд╡рд╛рдж рдХреЛ рдЙрдард╛рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдХреНрдпрд╛ рддрд░реНрдХ рдкрд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ mock.ANY рдХрд╛ рдЙрдкрдпреЛрдЧ what рдХреЗ рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░реЗрдВ; рдпрд╣ рдбрдореА рдкрджреНрдзрддрд┐ рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рд╕реА рднреА рддрд░реНрдХ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рджреЗрдЧрд╛ред

рдореЙрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рдмрд╛рд╣рд░реА рдореЙрдбреНрдпреВрд▓ рд╕реЗ рдлрд╝рдВрдХреНрд╢рди, рд╡рд┐рдзрд┐ рдпрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ 6.11 рдореЗрдВ, рд╣рдордиреЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдбрдореА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде os.unlink () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ред

рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ 6.11ред Mock.patch рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


 >>> from unittest import mock >>> import os >>> def fake_os_unlink(path): ... raise IOError("Testing!") ... >>> with mock.patch('os.unlink', fake_os_unlink): ... os.unlink('foobar') ... Traceback (most recent call last): File "<stdin>", line 2, in <module> File "<stdin>", line 2, in fake_os_unlink IOError: Testing! 
рдЬрдм рдПрдХ рд╕рдВрджрд░реНрдн рдкреНрд░рдмрдВрдзрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ mock.patch () рд▓рдХреНрд╖рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЪреБрдиреЗ рдЧрдП рдХреЗ рд╕рд╛рде рдмрджрд▓ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рддрд╛рдХрд┐ рд╕рдВрджрд░реНрдн рдХреЗ рднреАрддрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХреЛрдб рд╕рд╣реА рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗред Mock.patch () рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдмрд╛рд╣рд░реА рдХреЛрдб рдХреЗ рдХрд┐рд╕реА рднреА рднрд╛рдЧ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдХрд┐ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рд╕рднреА рд╢рд░реНрддреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ (рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ 6.12)ред

рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ 6.12ред рдХрдИ рд╡реНрдпрд╡рд╣рд╛рд░реЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП mock.patch () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


  from unittest import mock import pytest import requests class WhereIsPythonError(Exception): pass тЭ╢ def is_python_still_a_programming_language(): try: r = requests.get("http://python.org") except IOError: pass else: if r.status_code == 200: return 'Python is a programming language' in r.content raise WhereIsPythonError("Something bad happened") def get_fake_get(status_code, content): m = mock.Mock() m.status_code = status_code m.content = content def fake_get(url): return m return fake_get def raise_get(url): raise IOError("Unable to fetch url %s" % url) тЭ╖ @mock.patch('requests.get', get_fake_get( 200, 'Python is a programming language for sure')) def test_python_is(): assert is_python_still_a_programming_language() is True @mock.patch('requests.get', get_fake_get( 200, 'Python is no more a programming language')) def test_python_is_not(): assert is_python_still_a_programming_language() is False @mock.patch('requests.get', get_fake_get(404, 'Whatever')) def test_bad_status_code(): with pytest.raises(WhereIsPythonError): is_python_still_a_programming_language() @mock.patch('requests.get', raise_get) def test_ioerror(): with pytest.raises(WhereIsPythonError): is_python_still_a_programming_language() 


6.12 рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдирд╛ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЗ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдкрд╛рдпрдерди рдХреЗ рд╕рднреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рджрд┐рдЦрддрд╛ рд╣реИ python.org рдкрд░ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИ yред рдРрд╕рд╛ рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИ рдЬрд╣рд╛рдВ рдкрд░реАрдХреНрд╖рдг рдЪрдпрдирд┐рдд рд╡реЗрдм рдкреЗрдЬ рдкрд░ рдХреЛрдИ рджреА рдЧрдИ рд░реЗрдЦрд╛ рдирд╣реАрдВ рдорд┐рд▓реЗрдЧреАред рдирдХрд╛рд░рд╛рддреНрдордХ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкреГрд╖реНрда рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдирдХрд▓реА рдХреА рдорджрдж рд╕реЗ, рдЖрдк рдЯреНрд░рд┐рдХ рдкрд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЕрдиреБрд░реЛрдз рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдпрд╣ рдПрдХ рдХрд╛рд▓реНрдкрдирд┐рдХ рдкреГрд╖реНрда рдХреЗ рд╕рд╛рде рдПрдХ рдбрдореА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд▓реМрдЯрд╛рдП рдЬрд┐рд╕рдореЗрдВ рдПрдХ рджрд┐рдпрд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рдПрдХ рдирдХрд╛рд░рд╛рддреНрдордХ рдкрд░рд┐рджреГрд╢реНрдп рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ python.org рдПрдХ рджрд┐рдП рдЧрдП рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдРрд╕реЗ рдорд╛рдорд▓реЗ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИред

рдпрд╣ рдЙрджрд╛рд╣рд░рдг mock.patch () рдбреЗрдХреЛрд░реЗрдЯрд░ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдбрдореА рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИ, рдФрд░ рдкрд░реАрдХреНрд╖рдг рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╕реЗрдЯ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдерд╛ред

рдбрдореА рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдХрд┐рд╕реА рднреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓реЗрдЧреА: рд╕рд░реНрд╡рд░ 404 рддреНрд░реБрдЯрд┐, I / O рддреНрд░реБрдЯрд┐ рдпрд╛ рдиреЗрдЯрд╡рд░реНрдХ рд╡рд┐рд▓рдВрдм рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИред рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдб рд╕рд╣реА рдорд╛рди рд▓реМрдЯрд╛рдП рдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рд╣реА рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХреЗ, рдЬреЛ рдХреЛрдб рдХреЗ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИред

рдХрд╡рд░реЗрдЬ рдХреЗ рд╕рд╛рде рдЕрдирдЯрд╛рдЗрдЯреЗрдб рдХреЛрдб рдХреЛ рдкрд╣рдЪрд╛рдиреЗрдВ


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

рдЕрдкрдиреЗ рдЦреЛрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рдЗрдк рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╡рд░реЗрдЬ рдореЙрдбреНрдпреВрд▓ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред

рдиреЛрдЯ


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


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

рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдкрд╛рдЗрд╕реНрдЯ-рдХреЛрд╡ рдкреНрд▓рдЧрдЗрди рдХреЛ рдкрд┐рдк рдЗрдВрд╕реНрдЯреЙрд▓ рдкрд╛рдЗрд╕реНрдЯ-рдкрд╛рдЗрдХреЛрд╡ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ рдФрд░ рдЕрдирдЯрд╛рдЗрдЯреЗрдб рдХреЛрдб (рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ 6.13) рдХрд╛ рд╡рд┐рд╕реНрддреГрдд рдЖрдЙрдЯрдкреБрдЯ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕реНрд╡рд┐рдЪ рдЬреЛрдбрд╝реЗрдВред

рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ 6.13ред рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рдФрд░ рдХрд╡рд░реЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


 $ pytest --cov=gnocchiclient gnocchiclient/tests/unit ---------- coverage: platform darwin, python 3.6.4-final-0 ----------- Name Stmts Miss Branch BrPart Cover --------------------------- gnocchiclient/__init__.py 0 0 0 0 100% gnocchiclient/auth.py 51 23 6 0 49% gnocchiclient/benchmark.py 175 175 36 0 0% --snip-- --------------------------- TOTAL 2040 1868 424 6 8% === passed in 5.00 seconds === 
--Cov рд╡рд┐рдХрд▓реНрдк рдкрд░реАрдХреНрд╖рдг рдХреЗ рдЕрдВрдд рдореЗрдВ рдХрд╡рд░реЗрдЬ рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИред рдЖрдкрдХреЛ рдкреИрдХреЗрдЬ рдирд╛рдо рдХреЛ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рдкреНрд▓рдЧрдЗрди рд░рд┐рдкреЛрд░реНрдЯ рдХреЛ рдареАрдХ рд╕реЗ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░ рд╕рдХреЗред рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рдХреЛрдб рдХреА рд▓рд╛рдЗрдиреЗрдВ рд╣реЛрдВрдЧреА рдЬрд┐рдиреНрд╣реЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЙрдирдХрд╛ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЖрдкрдХреЗ рд▓рд┐рдП рдЬреЛ рдХреБрдЫ рднреА рд╣реИ рд╡рд╣ рд╕рдВрдкрд╛рджрдХ рдХреЛ рдЦреЛрд▓рдирд╛ рдФрд░ рдЗрд╕ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдирд╛ рд╣реИред

рдХрд╡рд░реЗрдЬ рдореЙрдбреНрдпреВрд▓ рдФрд░ рднреА рдмреЗрд╣рддрд░ рд╣реИ - рдпрд╣ рдЖрдкрдХреЛ HTML рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░рд┐рдкреЛрд░реНрдЯ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдмрд╕ рдЬреЛрдбрд╝реЗрдВ -cov-report-html рдФрд░ HTML рдкреГрд╖реНрда htmlcov рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗ рдЬрд╣рд╛рдБ рд╕реЗ рдЖрдк рдХрдорд╛рдВрдб рдЪрд▓рд╛рддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдкреГрд╖реНрда рджрд┐рдЦрд╛рдПрдЧрд╛ рдХрд┐ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рдХреМрди рд╕реЗ рднрд╛рдЧ рдереЗ рдпрд╛ рдирд╣реАрдВ рдЪрд▓ рд░рд╣реЗ рдереЗред

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

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЛрдб рдХреЛ 100% рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рд╛рде рдХрд╡рд░ рдХрд░рдирд╛ рдПрдХ рдпреЛрдЧреНрдп рд▓рдХреНрд╖реНрдп рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреЛрдб рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдорд╛рди рдХреЗрд╡рд▓ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдХреЛрдб рдХреА рд╕рднреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрдВрдЧрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рд╢рд░реНрддреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

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

рдЫрд╡рд┐


рд▓реЗрдЦрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ


рдЬреВрд▓рд┐рдпрди рдбреЗрдВрдЬреВ рд▓рдЧрднрдЧ рдмреАрд╕ рд╡рд░реНрд╖реЛрдВ рд╕реЗ рдлреНрд░реАрд╡реЗрдпрд░ рдХреЛ рд╣реИрдХ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдФрд░ рд▓рдЧрднрдЧ рдмрд╛рд░рд╣ рд╡рд░реНрд╖реЛрдВ рд╕реЗ рдкрд╛рдпрдерди рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИред рд╡рд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдУрдкрдирд╕реНрдЯреИрдХ-рдЖрдзрд╛рд░рд┐рдд рд╡рд┐рддрд░рд┐рдд рдХреНрд▓рд╛рдЙрдб рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдЯреАрдо рдХрд╛ рдиреЗрддреГрддреНрд╡ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХреЛрдб рдХреЗ рд▓рдЧрднрдЧ рдврд╛рдИ рдорд┐рд▓рд┐рдпрди рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рдореМрдЬреВрджрд╛ рдкрд╛рдпрдерди рдУрдкрди рд╕реЛрд░реНрд╕ рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдорд╛рд▓рд┐рдХ рд╣реИред рдХреНрд▓рд╛рдЙрдб рд╕реЗрд╡рд╛рдУрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЬреВрд▓рд┐рдпрди рдиреЗ рд╡рд┐рдВрдбреЛ рдореИрдиреЗрдЬрд░ рдмрдирд╛рдпрд╛ рдФрд░ рдбреЗрдмрд┐рдпрди рдФрд░ рдЬреАрдПрдирдпреВ рдПрдореЗрдХ рдЬреИрд╕реЗ рдХрдИ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдпреЛрдЧрджрд╛рди рджрд┐рдпрд╛ред

рд╕рд╛рдЗрдВрд╕ рдПрдбрд┐рдЯрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ


рдорд╛рдЗрдХ рдбреНрд░рд┐рд╕рдХреЙрд▓ рдкрд╛рдпрдерди рдореЗрдВ рдПрдХ рджрд╢рдХ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд▓рдВрдмреЗ рд╕рдордп рддрдХ, рдЙрдиреНрд╣реЛрдВрдиреЗ рдж рдорд╛рдЙрд╕ рдмрдирд╛рдо рдкрд╛рдЗрдерди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦрд╛ ред рдЕрдЬрдЧрд░ ред рдХрдИ рдкрд╛рдпрдерди рдкреБрд╕реНрддрдХреЛрдВ рдХреЗ рд▓реЗрдЦрдХ: рдкрд╛рдпрдерди 101, рдкрд╛рдпрдерди рдЗрдВрдЯрд░рд╡реНрдпреВ рдФрд░ рд░рд┐рдкреЛрд░реНрдЯрд▓реИрдм: рдкреАрдбреАрдПрдл рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧрд╡реАрде рдкрд╛рдпрдердиред рдЖрдк рдЯреНрд╡рд┐рдЯрд░ рдкрд░ рдФрд░ GitHub: @driscollis рдкрд░ рдорд╛рдЗрдХ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред

┬╗рдкреБрд╕реНрддрдХ рдХреА рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рдХрд╛рд╢рдХ рдХреА рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ
┬╗ рд╕рд╛рдордЧреНрд░реА
┬╗ рдЕрдВрд╢

рдлреЗрд░реАрд╡рд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдХреВрдкрди рдкрд░ 25% рдХреА рдЫреВрдЯ - рдкрд╛рдпрдерди

рдкреБрд╕реНрддрдХ рдХреЗ рдкреЗрдкрд░ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рднреБрдЧрддрд╛рди рдкрд░, рдПрдХ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрдирд┐рдХ рдкреБрд╕реНрддрдХ рдИ-рдореЗрд▓ рджреНрд╡рд╛рд░рд╛ рднреЗрдЬреА рдЬрд╛рддреА рд╣реИред

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


All Articles