рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкрд╛рдпрдерди рдХреНрдпреВрдП рдЗрдВрдЬреАрдирд┐рдпрд░ рдкрд╛рдареНрдпрдХреНрд░рдо рдХреЗ рдЫрд╛рддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рд▓реЗрдЦ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рд╣рдо рдЙрд╕ рдпреБрдЧ рдореЗрдВ рдЬреА рд░рд╣реЗ рд╣реИрдВ рдЬрдм рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдмрд╣реБрдд рддреЗрдЬреА рд╕реЗ рдмрд╛рдЬрд╛рд░ рдореЗрдВ рдЖ рд░рд╣рд╛ рд╣реИред рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ, рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдмрд╣реБрдд рддрдирд╛рд╡рдкреВрд░реНрдг рд╣реЛ рдЬрд╛рддреА рд╣реИред рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рддреЗрдЬрд╝ рд╡рд┐рддрд░рдг рдХреА рдЙрдЪреНрдЪ рджрд░реЗрдВ рд╡реНрдпрд╡рд╕рд╛рдп рдореЙрдбрд▓ рдХреЗ рдПрдХ рдЕрдЪреНрдЫреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреА рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рд╕рд╡рд╛рд▓ рдпрд╣ рдЙрдарддрд╛ рд╣реИ рдХрд┐ рд╕рд╣реА рдЧреБрдгрд╡рддреНрддрд╛ рдХреЗ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдХреЛ рдХреИрд╕реЗ рд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред
рд╣рдореЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ
рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкрд░реАрдХреНрд╖рдг рдХреЗ рдХрдИ рдлрд╛рдпрджреЗ рд╣реИрдВ, рдпрд╣рд╛рдБ рддреАрди рдореБрдЦреНрдп рд╣реИрдВ:
рдкреБрди: рдЙрдкрдпреЛрдЧ: рд╣рд░ рдмрд╛рд░ рдирдИ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рддрдм рднреА рдЬрдм рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдПрдХ рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рддрддреНрдХрд╛рд▓ рдЖрд╡рд╢реНрдпрдХрддрд╛ рди рд╣реЛред
рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛: рд▓реЛрдЧ рдЧрд▓рддрд┐рдпрд╛рдБ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдХрд╛рд░реЗрдВ рдЙрдиреНрд╣реЗрдВ рдХрдо рд╕рдВрднрд╛рд╡рдирд╛ рджреЗрддреА рд╣реИрдВред рдФрд░ рд╡реЗ рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдЬрдм рджреЛрд╣рд░рд╛рдпрд╛ рдЪрд░рдгреЛрдВ / рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рд▓рдЧрд╛рддрд╛рд░ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдХрд╛рд░реНрдп 24/7: рдЖрдк рджрд┐рди рдХреЗ рдХрд┐рд╕реА рднреА рд╕рдордп, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рджреВрд░ рд╕реЗ рднреА рдкрд░реАрдХреНрд╖рдг рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рд░рд╛рдд рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕реЛрддреЗ рд╕рдордп рднреА рдЪрд▓реЗрдЧрд╛ред
рдкрд╛рдЗрдерди рдореЗрдВ рдкреВрд░реНрдг рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рд╡рд╛рд▓рд╛ рдкрд╛рдпрд╕реНрдЯреЗрд╕реНрдЯ рдЯреЗрд╕реНрдЯ рдЯреВрд▓ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛
рд╡рд░реНрддрдорд╛рди рдореЗрдВ, рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдХрдИ рд░реВрдкрд░реЗрдЦрд╛ рдФрд░ рдЙрдкрдХрд░рдг рд╣реИрдВред рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдлреНрд░реЗрдорд╡рд░реНрдХ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбреЗрдЯрд╛-рдЪрд╛рд▓рд┐рдд, рдХреАрд╡рд░реНрдб-рдЪрд╛рд▓рд┐рдд, рд╣рд╛рдЗрдмреНрд░рд┐рдб, рдмреАрдбреАрдбреА, рдЖрджрд┐ред рдЖрдк рд╡рд╣ рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛред
рдореБрдЭреЗ рдХрд╣рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдкрд╛рдпрдерди рдФрд░
pytest
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╕реНрдерд╛рди рд░рдЦрддреЗ рд╣реИрдВред рдкрд╛рдпрдерди рдФрд░ рдЙрд╕рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╢рд╛рдпрдж рдЗрд╕рд▓рд┐рдП рдХрд┐ рд╡реЗ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЕрдиреБрднрд╡ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕реБрд▓рдн рд╣реИрдВред
pytest
рдлреНрд░реЗрдорд╡рд░реНрдХ рдЫреЛрдЯреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рд▓рд┐рдЦрдирд╛ рдЖрд╕рд╛рди
pytest
рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдкрд░рд┐рд╖реНрдХреГрдд рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкрд░реАрдХреНрд╖рдг рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рддрд░рд╛рдЬреВ рдХрд░рддрд╛ рд╣реИред
pytest
рдХреА рдХреБрдЫ рдкреНрд░рдореБрдЦ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ:
- рдкрд░реАрдХреНрд╖рдг рдореЙрдбреНрдпреВрд▓ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкрддрд╛ рд▓рдЧрд╛рдирд╛;
- рдкреНрд░рднрд╛рд╡реА рд╕реАрдПрд▓рдЖрдИ рдЬреЛ рдЖрдк рдЪрд▓рд╛рдирд╛ рдпрд╛ рдЫреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЙрд╕ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдирд╛;
- рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХрд╛ рдмрдбрд╝рд╛ рддреГрддреАрдп-рдкрдХреНрд╖ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░;
- рдлрд┐рдХреНрд╕реНрдЪрд░ - рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░, рд╡рд┐рднрд┐рдиреНрди рдЕрдиреБрдкреНрд░рдпреЛрдЧ;
- рдкрд╛рд░рдВрдкрд░рд┐рдХ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдврд╛рдВрдЪреЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВред
рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдФрд░ рд╡рд┐рдиреНрдпрд╛рд╕ рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ,
pytest
рдЙрди рдкрд╛рдпрдерди рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдЦреЛрдЬрдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рдирдХреЗ рдирд╛рдо
test_
рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░
test_
рд╕рд╛рде рд╕рдорд╛рдкреНрдд
_test.py
ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдпрд╣ рдЙрдкрд╕рд░реНрдЧ
test_
рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдирд╛рдореЛрдВ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдХрд┐рд╕реА рдПрдХ
pytest
рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди
pytest
рдЬреЛрдбрд╝рдХрд░ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЖрдЗрдП рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдкрд░реАрдХреНрд╖рдг рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджреЗрдЦреЗрдВ:
class CheckClass(object): def one_check(self): x = "this" assert 'h' in x def two_check(self): x = "hello" assert hasattr(x, 'check')
рдХреНрдпрд╛ рдЖрдкрдиреЗ рдХреБрдЫ рджреЗрдЦрд╛ рд╣реИ? рдХреЛрдИ
assertEqual
рдпрд╛
assertDictEqual
рдХреЛрдИ
assertEqual
рдирд╣реАрдВ рд╣реИ, рд╕рд┐рд░реНрдл рдПрдХ рд╕реБрд▓рдн рдФрд░ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп
assertDictEqual
ред рдХреЗрд╡рд▓ рджреЛ рд╡рд╕реНрддреБрдУрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдореБрдЦрд░ рд╡рд╣реА рд╣реИ рдЬреЛ рдкрд╛рдЗрдерди рдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реИ рдФрд░ рдкрд╣рд┐рдП рдХреЛ рд╕реБрджреГрдврд╝ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛрдб? рдЪрд┐рдВрддрд╛ рдордд рдХрд░реЛ, рдЬреБрдбрд╝рдирд╛рд░ рдмрдЪрд╛рд╡ рдХреЗ рд▓рд┐рдП рднрд╛рдЧрддреЗ рд╣реИрдВ!
рд╡реЙрд▓реЗрдЯ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдмреБрдирд┐рдпрд╛рджреА рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рджреЗрдЦреЗрдВ:
// test_wallet.py from wallet import Wallet def test_default_initial_amount(): wallet = Wallet() assert wallet.balance == 0 wallet.close() def test_setting_initial_amount(): wallet = Wallet(initial_amount=100) assert wallet.balance == 100 wallet.close() def test_wallet_add_cash(): wallet = Wallet(initial_amount=10) wallet.add_cash(amount=90) assert wallet.balance == 100 wallet.close() def test_wallet_spend_cash(): wallet = Wallet(initial_amount=20) wallet.spend_cash(amount=10) assert wallet.balance == 10 wallet.close()
рдЕрд╣рдо, рджрд┐рд▓рдЪрд╕реНрдк! рдХреНрдпрд╛ рдЖрдкрдиреЗ рдЧреМрд░ рдХрд┐рдпрд╛ рд╣реИ? рдмрд╣реБрдд рд╕рд╛рд░реЗ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛрдб рд╣реИред рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдПрдХ рдФрд░ рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпрд╛рддреНрдордХ рднрд╛рдЧ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рдФрд░ рдХрд░рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╡реЙрд▓реЗрдЯ рдмрдирд╛рдирд╛ рдФрд░ рдЗрд╕реЗ рд╡реЙрд▓реЗрдЯ рдХреЗ рд╕рд╛рде рдмрдВрдж рдХрд░рдирд╛ред
wallet.close()
ред
рдЕрдм рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдЖрдк рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ
pytest
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛрдб рд╕реЗ рдХреИрд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред
import pytest from _pytest.fixtures import SubRequest from wallet import Wallet
рдЕрдЪреНрдЫрд╛ рд▓рдЧрд╛, рд╣реИ рди? рдЯреЗрд╕реНрдЯ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдЕрдм рдХреЙрдореНрдкреИрдХреНрдЯ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╡рд╣реА рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЙрдиреНрд╣реЗрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡реЙрд▓реЗрдЯ рдлрд┐рдХреНрд╕реЗрдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡реЙрд▓реЗрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░, рд╕реНрдерд╛рдкрд┐рдд рдФрд░ рдмрдВрдж рд╣реИред рдлрд┐рдХреНрд╕реНрдЪрд░ рди рдХреЗрд╡рд▓ рдкреБрди: рдкреНрд░рдпреЛрдЬреНрдп рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдбреЗрдЯрд╛ рд╢реЗрдпрд░рд┐рдВрдЧ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рднреА рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдмрд╛рд░реАрдХреА рд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ
wallet
рдореЗрдВ рд░рд╛рд╢рд┐ рдкрд░реАрдХреНрд╖рдг рддрд░реНрдХ рджреНрд╡рд╛рд░рд╛ рдмрд╛рд╣рд░реА рд░реВрдк рд╕реЗ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рдХрдареЛрд░рддрд╛ рд╕реЗ рддрдп рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
@pytest.mark.parametrize('wallet', [(10,)], indirect=True)
рдЕрдзрд┐рдХ рдирд┐рдпрдВрддреНрд░рд┐рдд рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ, рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдпрд╛ рд╢реЗрд▓ рдореЗрдВ
test-data.ini
, рдЬреЛ рдЗрд╕реЗ рдкрдврд╝ рд╕рдХрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдЖрдкрдХрд╛ рдЯреЗрд╕реНрдЯ рдлрд╝рдВрдХреНрд╢рди рдЯреЗрд╕реНрдЯ рдбреЗрдЯрд╛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рд╢реЗрд▓ рдХреЙрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдЖрдкрдХреЗ рд╕рднреА рдЬреБрдбрд╝рдирд╛рд░ рдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖
conftest.py
рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП
conftest.py
рд╣реИред рдпрд╣ рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдлрд╝рд╛рдЗрд▓ рд╣реИ рдЬреЛ рдкрд░реАрдХреНрд╖рдг рдХреЛ рд╡реИрд╢реНрд╡рд┐рдХ рдЬреБрдбрд╝рдирд╛рд░ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред
рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдкрд╛рд╕ рдРрд╕реЗ рдорд╛рдорд▓реЗ рд╣реИрдВ рдЬреЛ рдореИрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдбреЗрдЯрд╛рд╕реЗрдЯ рдкрд░ рдЪрд▓рд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ!
рдЪрд┐рдВрддрд╛ рди рдХрд░реЗрдВ,
pytest
рдореЗрдВ рдЖрдкрдХреА рд╕реНрдерд┐рд░рддрд╛ рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫреА рд╕реБрд╡рд┐рдзрд╛ рд╣реИред рдЖрдЗрдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВред
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдкрдХреЗ рдЙрддреНрдкрд╛рдж рдореЗрдВ рдПрдХ CLI рд╣реИ рдЬреЛ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдкрдХреЗ рдЙрддреНрдкрд╛рдж рдореЗрдВ рдХрдИ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ рдЬреЛ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рд╕реЗрдЯ рд╣реИрдВ, рдФрд░ рдЖрдк рдЗрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рднреА рдореВрд▓реНрдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рдЖрдк рдЗрди рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓рд╛ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рд╕рдм рдХреБрдЫ рдХреЗ рд╕рд╛рде!
@pytest.mark.parametrize(тАЬsetting_name, setting_valueтАЭ, [('qdb_mem_usage', 'low'), ('report_crashes', 'yes'), ('stop_download_on_hang', 'no'), ('stop_download_on_disconnect', 'no'), ('reduce_connections_on_congestion', 'no'), ('global.max_web_users', '1024'), ('global.max_downloads', '5'), ('use_kernel_congestion_detection', 'no'), ('log_type', 'normal'), ('no_signature_check', 'no'), ('disable_xmlrpc', 'no'), ('disable_ntp', 'yes'), ('ssl_mode', 'tls_1_2'),])def test_settings_defaults(self, setting_name, setting_value): assert product_shell.run_command(setting_name) == \ self.тАЭThe current value for \'{0}\' is \'{1}\'.тАЭ.format(setting_name, setting_value), \ 'The {} default should be {}'.format(preference_name, preference_value)
рдЕрдЪреНрдЫрд╛ рд╣реИ, рд╣реИ рдирд╛? рдЖрдкрдиреЗ рд╕рд┐рд░реНрдл 13 рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЗ рд▓рд┐рдЦреЗ (рдкреНрд░рддреНрдпреЗрдХ рдПрдХ рдЕрд▓рдЧ
setting_value
рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ), рдФрд░ рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рдЙрддреНрдкрд╛рдж рдореЗрдВ рдПрдХ рдирдпрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдФрд░ рдЯрдкрд▓ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред
рд╕реЗрд▓реЗрдирд┐рдпрдо рдФрд░ рдПрдкреАрдЖрдИ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рд╛рде pytest рдХреИрд╕реЗ рдПрдХреАрдХреГрдд рдХрд░рддрд╛ рд╣реИ?
рдареАрдХ рд╣реИ, рдЖрдкрдХреЗ рдЙрддреНрдкрд╛рдж рдореЗрдВ рдХрдИ рдЗрдВрдЯрд░рдлреЗрд╕ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рд╕реАрдПрд▓рдЖрдИ - рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдКрдкрд░ рдХрд╣рд╛ред рдЬреАрдпреВрдЖрдИ рдФрд░ рдПрдкреАрдЖрдИ рдХреЗ рд╕рдорд╛рдиред рдЕрдкрдиреЗ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдЙрддреНрдкрд╛рдж рдХреЛ рдкрд░рд┐рдирд┐рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЙрди рд╕рднреА рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдПрдВрдЯрд░рдкреНрд░рд╛рдЗрдЬрд╝ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдореЗрдВ, рдЬрд╣рд╛рдВ рдХрдИ рдШрдЯрдХ рдЖрдкрд╕ рдореЗрдВ рдЬреБрдбрд╝реЗ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ-рджреВрд╕рд░реЗ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реЛрддреЗ рд╣реИрдВ, рдПрдХ рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рдмрджрд▓рд╛рд╡ рд╕рднреА рдЕрдиреНрдп рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐
pytest
рдЖрд╕рд╛рди рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдврд╛рдВрдЪрд╛ рд╣реИ, рди рдХрд┐ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкрд░реАрдХреНрд╖рдгред рдпрд╣реА рд╣реИ, рдЖрдк рд╕реЗрд▓реЗрдирд┐рдпрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬреАрдпреВрдЖрдИ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд╛рдпрдерди рд╕реЗ
requests
рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕рд╛рде рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдФрд░ рдЙрдиреНрд╣реЗрдВ
pytest
рд╕рд╛рде рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдЪреНрдЪ рд╕реНрддрд░ рдкрд░, рдпрд╣ рднрдВрдбрд╛рд░ рд╕рдВрд░рдЪрдирд╛ рдХреА рдЬрд╛рдВрдЪ рд╣реЛ рд╕рдХрддреА рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдКрдкрд░ рдХреА рдЫрд╡рд┐ рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВ, рдпрд╣ рдШрдЯрдХреЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЕрд╡рд╕рд░ рджреЗрддрд╛ рд╣реИ:
apiobjects : рдПрдкреАрдЖрдИ рдПрдВрдбрдкреЙрдЗрдВрдЯреНрд╕ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░реИрдкрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫреА рдЬрдЧрд╣ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ
BaseAPIObject
рдФрд░ рдПрдХ рд╡реНрдпреБрддреНрдкрдиреНрди рд╡рд░реНрдЧ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИред
рд╕рд╣рд╛рдпрдХреЛрдВ : рдЖрдк рдЕрдкрдиреЗ рд╕рд╣рд╛рдпрдХ рддрд░реАрдХреЛрдВ рдХреЛ рдпрд╣рд╛рдБ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
lib : рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдлрд╝рд╛рдЗрд▓реЗрдВ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рднрд┐рдиреНрди рдШрдЯрдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
conftest
,
pageobjects
, рдЖрджрд┐ рдореЗрдВ рдЖрдкрдХреЗ
conftest
ред
рдкреЗрдЬреЛрдмрд┐рдЬ :
рдкреЗрдЬрдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░
PageObjects
рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рднрд┐рдиреНрди рдЬреАрдпреВрдЖрдИ рдкреГрд╖реНрдареЛрдВ рдХреЗ рд▓рд┐рдП рдХрдХреНрд╖рд╛рдПрдВ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рдо
рд╡реЗрдмрд┐рдпрдо рдХрд╛ рдЙрдкрдпреЛрдЧ
рдХрд░рддреЗ рд╣реИрдВ , рдЬреЛ рдкрд╛рдпрдерди рдХреЗ рд▓рд┐рдП рдкреЗрдЬ рдСрдмреНрдЬреЗрдХреНрдЯ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИред
рд╕реБрдЗрдЯреНрд╕ : рдЖрдк рдХреЛрдб рдХреЗ рд▓рд┐рдП рдкрд╛рдЗрд▓рд┐рдВрдЯ рдЪреЗрдХ рдХреЗ рдЕрдкрдиреЗ рд╕реЗрдЯ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╡реЗ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдХреЛрдб рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдВрдЧреЗред
рдкрд░реАрдХреНрд╖рдг : рдЖрдк рдЕрдкрдиреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдУрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рд╕реЗ рдЖрдкрдХреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдФрд░ рд╕рдореАрдХреНрд╖рд╛ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
рдореИрдВ рдЗрд╕реЗ рдХреЗрд╡рд▓ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рд▓рд╛рдпрд╛ рдерд╛, рднрдВрдбрд╛рд░ рдФрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдЖрдкрдХреА рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдореЗрд░реЗ рдкрд╛рд╕ рдХрдИ рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЗ рд╣реИрдВ рдФрд░ рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╡реЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдЪрд▓реЗрдВ
рдЖрдкрдХреЗ рд╕реЗрдЯ рдореЗрдВ рдХрдИ рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдЪрд▓рд╛рдиреЗ рдФрд░ рд╕рдордЧреНрд░ рдкрд░реАрдХреНрд╖рдг рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
Pytest,
pytest-xdist
рдирд╛рдордХ рдПрдХ рднрдпрд╛рдирдХ рд╕рдорд╛рдирд╛рдВрддрд░ рдкрд░реАрдХреНрд╖рдг рд░рди рдкреНрд▓рдЧрдЗрди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЖрдзрд╛рд░ pytest рдореЗрдВ рдХрдИ рдЕрджреНрд╡рд┐рддреАрдп рдирд┐рд╖реНрдкрд╛рджрди рдореЛрдб рдЬреЛрдбрд╝рддрд╛ рд╣реИред
pip
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рдкреНрд▓рдЧрдЗрди рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред
pip install pytest-xdist
рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдореЗрд░реЗ рд╕реЗрд▓реЗрдирд┐рдпрдо GUI рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рдкрд╛рд╕ CloudApp рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкрд░реАрдХреНрд╖рдг рднрдВрдбрд╛рд░ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд▓рдЧрд╛рддрд╛рд░ рдмрдврд╝ рд░рд╣рд╛ рд╣реИ рдФрд░ рдирдП рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдЕрджреНрдпрддрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЕрдм рдЗрд╕рдХреЗ рд╕реИрдХрдбрд╝реЛрдВ рдкрд░реАрдХреНрд╖рдг рд╣реИрдВред рдЬреЛ рдореИрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЙрдиреНрд╣реЗрдВ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдЪрд▓рд╛рдПрдВ рдФрд░ рд╕рдордЧреНрд░ рдкрд░реАрдХреНрд╖рдг рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдХреЛ рдХрдо рдХрд░реЗрдВред
рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ, рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░реВрдЯ рдлреЛрд▓реНрдбрд░ / рдЯреЗрд╕реНрдЯ рдлреЛрд▓реНрдбрд░ рдореЗрдВ рдмрд╕
pytest
рдЯрд╛рдЗрдк рдХрд░реЗрдВред рдпрд╣ рдЖрдкрдХреЛ рд╕рднреА рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред
pytest -s -v -n=2

pytest-xdist
рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рд╕рднреА рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдПрдЧрд╛!
рдЗрд╕ рддрд░рд╣, рдЖрдк рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдХрдИ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рднреА рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред
рд░рд┐рдкреЛрд░реНрдЯ
рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рдЯреЗрд╕реНрдЯ рд░рд┐рдЬрд▓реНрдЯ рдлрд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдЯ-рдЗрди рд╕рдкреЛрд░реНрдЯ рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЬреЗрдирдХрд┐рдВрд╕, рдмрдореНрдмреВ рдпрд╛ рдЕрдиреНрдп рдирд┐рд░рдВрддрд░ рдЗрдВрдЯреАрдЧреНрд░реЗрд╢рди рд╕рд░реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЦреЛрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
pytest test/file/path тАФ junitxml=path
рдпрд╣ рдПрдХ рдорд╣рд╛рди XML рдлрд╝рд╛рдЗрд▓ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ рдЬреЛ рдХрдИ рдкрд╛рд░реНрд╕рд░ рдХреЗ рд╕рд╛рде рдЦреЛрд▓реА рдЬрд╛ рд╕рдХрддреА рд╣реИред
рдирд┐рд╖реНрдХрд░реНрд╖
рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рдХреА рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рд╣рд░ рд╕рд╛рд▓ рдмрдврд╝ рд░рд╣реА рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕рдореЗрдВ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╕рд╛рдореБрджрд╛рдпрд┐рдХ рд╕рдорд░реНрдерди рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдХрдИ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдЬреИрд╕реЗ
рдкрд╛рдЗрдЯреЗрд╕реНрдЯ-рдбрдЬреИрдВрдЧреЛ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ Django рдореЗрдВ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рдЕрдирдЯрд╛рдЗрд╕реНрдЯ рдЯреЗрд╕реНрдЯ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рдпреВрдиреАрдЯреЗрд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рдХреЛ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╕реВрддреНрд░реЛрдВ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ
рд╡рд╣ рд╕рдм рд╣реИред
рдХреЛрд░реНрд╕ рдкрд░
рдорд┐рд▓рддреЗ рд╣реИрдВ !