рдкрд░реАрдХреНрд╖рдг Django рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ

рдкрд┐рдЫрд▓реА рдкреЛрд╕реНрдЯ рдореЗрдВ, рд╣рдордиреЗ рдЕрдЬрдЧрд░ рдХреЛрдб рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдХреБрдЫ рддрдХрдиреАрдХреЛрдВ рдХреА рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╕рдореАрдХреНрд╖рд╛ рдХреАред рдпрд╣ рд╕рдм рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ Django рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдкрд░ рднреА рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд░реНрдпрд╛рдкреНрдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдиреБрдХрд╕рд╛рди рдФрд░ рд╕рд┐рд░реНрдл рджрд┐рд▓рдЪрд╕реНрдк рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬрд┐рдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рдмрд╛рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред

рдкрдж рдХрд╛ рд╕рд╛рд░рд╛рдВрд╢:
  1. рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░реАрдХреНрд╖рдг рдХрдард┐рди рдФрд░ рд╕рдордЭ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИ
  2. django рдореЗрдВ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг
  3. рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ рдФрд░ рдЗрд╕рд╕реЗ рдХреИрд╕реЗ рдирд┐рдкрдЯреЗрдВ
  4. рдзреВрдореНрд░рдкрд╛рди рдкрд░реАрдХреНрд╖рдг
  5. рдХреЛрдб рдХрд╡рд░реЗрдЬ

рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░реАрдХреНрд╖рдг


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

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

рд╣рдо (рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд) рд╕рд░рд▓ рдФрд░ рд╕рд╣рдЬ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

Django рдореЗрдВ рдпреВрдирд┐рдЯ рдЯреЗрд╕реНрдЯ


Django рдореЗрдВ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг django.utils.unittest рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд░рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЕрдЬрдЧрд░ 2.7 (unittest2) рд╕реЗ рдорд╛рдирдХ unittest рдореЙрдбреНрдпреВрд▓ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реИрдВред рдХреНрдпрд╛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ:

HTTP рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВред рдпрд╣ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рддрд╛ рд╣реИ, рдХреЙрд▓ рдХреЗ рдмреАрдЪ рдХреБрдХреАрдЬрд╝ рдмрдЪрд╛рддрд╛ рд╣реИ, рдЕрдиреБрд░реЛрдз рдФрд░ рдкреЛрд╕реНрдЯ-рдЕрдиреБрд░реЛрдз рднреЗрдЬ рд╕рдХрддрд╛ рд╣реИред

 >>> from django.test.client import Client >>> c = Client() >>> response = c.post('/login/', {'username': 'admin', 'password': 'qwerty'}) >>> response.status_code 200 

рдкрд░реАрдХреНрд╖рдг рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдХрдИ рд╕реАрдорд╛рдПрдБ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдХреЗрд╡рд▓ рдПрдХ рд╕рд╛рдкреЗрдХреНрд╖ рдкрде рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдлреЙрд░реНрдо рдХрд╛ рдПрдХ URL http: / / / localhost: 8000 / рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ (рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ)ред

рдЪреЗрдХ рдХрд╛ рд╡рд┐рд╕реНрддреГрдд рд╕реЗрдЯред рдорд╛рдирдХ рд╕реЗрдЯ рдХреЗ рдЕрд▓рд╛рд╡рд╛, django.test.TestCase рдХреНрд▓рд╛рд╕ рдореЗрдВ django-specific assert* рд╡рд┐рдзрд┐рдпрд╛рдБ django.test.TestCase рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

 assertContains(response, text, ...) # ,       ; assertTemplateUsed(response, template_name, ...) # ,       ; assertRedirects(response, expected_url, ...) # ,   ; 

рдФрд░ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧреА рдЪреАрдЬреЗрдВ ред

рдкрд░реАрдХреНрд╖рдг рдореЗрд▓ред Django.core.mail рдореЙрдбреНрдпреВрд▓ рдЖрдЙрдЯрдмреЙрдХреНрд╕ рд╡реИрд░рд┐рдПрдмрд▓ рдореЗрдВ send_mail() рдорд╛рдзреНрдпрдо рд╕реЗ рднреЗрдЬреЗ send_mail() рд╕рднреА send_mail() рдХреА рдПрдХ рд╕реВрдЪреА рдмрдЪрд╛рддрд╛ рд╣реИред

рд╕рд╢рд░реНрдд рдкрд░реАрдХреНрд╖рдг рдЕрдкрд╡рд╛рджред рдпрджрд┐ рдЪрдпрдирд┐рдд DBMS рдЯреНрд░рд╛рдВрдЬреЗрдХреНрд╢рдирд▓рд┐рдЯреА рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ (рдпрд╛, рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ), рддреЛ рдЖрдк @skipUnlessDBFeature('supports_transactions') рдпрд╛ @skipIfDBFeature('supports_transactions') рдбреЗрдХреЛрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬрд╛рдирдмреВрдЭрдХрд░ рдЯреВрдЯреЗ рд╣реБрдП рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдмрд╛рд╣рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдкрд░реАрдХреНрд╖рдг рдЗрд╕ рддрд░рд╣ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ:

 $ ./manage.py test [ ] 

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

 from utils import func_a, func_b __test__ = {"func_a": func_a, "func_b": func_b} 

рдпрд╣рд╛рдБ func_* рдПрдХ рдлрд╝рдВрдХреНрд╢рди (рдпрд╛ рдЕрдиреНрдп рдЗрдХрд╛рдИ) рд╣реИ рдЬрд┐рд╕рдХрд╛ рдбреЙрдХрд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣рдорд╛рд░реЗ рд╣рд┐рдд рдореЗрдВ рд╣реИред

рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ рдХреЗ рд▓рд┐рдП, рдкрд░реАрдХреНрд╖рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

 $ ./manage.py test main Creating test database for alias 'default'... .......... Ran 10 tests in 0.790s OK Destroying test database for alias 'default'... 

рдбреАрдмреА рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ рдФрд░ рдЗрд╕рд╕реЗ рдХреИрд╕реЗ рдирд┐рдкрдЯреЗрдВ


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

 GRANT ALL PRIVILEGES ON `project`.* TO 'user'@'localhost'; GRANT ALL PRIVILEGES ON `test_project`.* TO 'user'@'localhost'; 

рдпрд╣ test_project рдбреЗрдЯрд╛рдмреЗрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред

рдорд╛рд▓рдХрд┐рди рдиреЛрдЯ рдпрджрд┐ рдЖрдк MySQL рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рд▓рд╛рдЗрди рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рддреЛ рд╕рдм рдХреБрдЫ рддреЗрдЬрд╝реА рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ

 [mysqld] skip-sync-frm=OFF 

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

 $ ./manage.py dumpdata > app/fixtures/test_data.json 

рдХреЛрдб рдореЗрдВ:

 class HelloTestCase(TestCase): fixtures = ['test_data.json', 'moar_data.json'] 

рдФрд░ рдЕрдзрд┐рдХред рдЙрддреНрдкрд╛рджрди рд╕рд░реНрд╡рд░ рдкрд░ рд╡рд┐рдХрд╛рд╕ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди DBMS рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдЗрд╕рд╕реЗ рдЖрдкрдХреА рдиреАрдВрдж 28% * рд╢рд╛рдВрдд рд╣реЛ рдЬрд╛рдПрдЧреАред

* рд╡реИрдЬреНрдЮрд╛рдирд┐рдХ рд░реВрдк рд╕реЗ рд╕рд┐рджреНрдз рд╣реИ рдХрд┐ 87.56% рдЖрдБрдХрдбрд╝реЗ рдЫрдд рд╕реЗ рд▓рд┐рдП рдЧрдП рд╣реИрдВред

рдзреБрдЖрдБ рдкрд░реАрдХреНрд╖рдг


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

рд╡рд░реНрдгрд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рднреА рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╕рдордп рдЕрднреНрдпрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред Django рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ test.py рдореЗрдВ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐.confs рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдЬреИрд╕реЗ:

urls.py
 urlpatterns = patterns(None, url(r'^registration/$', registration, name='registration'), url(r'^login/$', ..., name='login'), url(r'^logout/$', logout_then_login, name='logout'), ) 

tests.py
 from django import test from django.core.urlresolvers import reverse __test__ = {"urls": """ >>> c = test.Client() >>> c.get(reverse('registration')).status_code 200 >>> c.get(reverse('login')).status_code 200 >>> c.get(reverse('logout')).status_code 302 """} 

рдмреЗрд╢рдХ, рдРрд╕рд╛ рдЪреЗрдХ рдкрдВрдЬреАрдХрд░рдг рдФрд░ рд▓реЙрдЧрд┐рди рдХреЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкрд░реАрдХреНрд╖рдг рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдХрд░реНрдирд▓ рд╕рд╛рдХреНрд╖реНрдп рдкрдж рд╕реНрд╡реАрдХреГрддред

рдХреЛрдб рдХрд╡рд░реЗрдЬ


рдХреЛрдб рдХрд╡рд░реЗрдЬ рдПрдХ рдореАрдЯреНрд░рд┐рдХ рд╣реИ рдЬреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдЖрд╡реЗрджрди рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╕реНрд░реЛрдд рдХреЛрдб рдХреА рдкреВрд░реА рд░рд╛рд╢рд┐ рдХреЗ рдЦрд┐рд▓рд╛рдл рдХрд┐рддрдирд╛ рд╕реНрд░реЛрдд рдХреЛрдб рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдХрдо рдХреЛрдб рдХрд╡рд░реЗрдЬ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рдХрдореА рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред

рдиреЛрдЯ -2 рдкрд░ рдорд╛рд▓рдХрд┐рди рдХреЛрдб рдХреЗ рдЙрдЪреНрдЪ рдХрд╡рд░реЗрдЬ рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реИ (рди рддреЛ рдХреЛрдб рдореЗрдВ, рди рд╣реА рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ), рдпрд╣ рдХрд▓реНрдкрдирд╛ рд╣реИред

рдкрд╛рдпрдерди рдореЗрдВ рдХреЛрдб рдХрд╡рд░реЗрдЬ рдХреЛ рдорд╛рдкрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╡рд░реЗрдЬ рдереНрд░реАрдбреА рд╣реИред Google рджреЛрд╕реНрддреЛрдВ рдХреЛ рдорд┐рддреНрд░реЛрдВ рдХреЛ Oracle рдФрд░ Django рдмрдирд╛рдиреЗ рдХреЗ рдХрдИ рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреЛ рдпрд╛рдж рдХрд░рддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЯрд┐рдХрдЯ # 4501 (рд╡рд╣ рдЪрд╛рд░ рд╕рд╛рд▓ рдХрд╛ рд╣реИ) рд╣реИред

рдФрд░ рддреБрд░рдВрдд рдорд░рд╣рдо рдореЗрдВ рдЙрдбрд╝рдирд╛: Django 1.3 (рдФрд░ рджреЗрд╡ рд╕рдВрд╕реНрдХрд░рдг) рдХреЗ рд╕рд╛рде, рдХреЛрдб рдХрд╡рд░реЗрдЬ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рднреА рддреИрдпрд╛рд░ рд╕рдорд╛рдзрд╛рди рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рдореБрдЭреЗ рдареАрдХ рдХрд░реЗрдВ рдЕрдЧрд░ рдпрд╣ рдирд╣реАрдВ рд╣реИ)ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рд╣рдореЗрдВ рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рд╕реЗ рдХрд╡рд░реЗрдЬ рдерд┐рдВрдХрдкреИрдб рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рд╕реЗ рдирд╣реАрдВ рд░реЛрдХреЗрдЧрд╛ред

 $ coverage run --source=main,users manage.py test main users $ coverage html #   

рд╣рдо рдХреЗрд╡рд▓ рдЙрди рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╣рдорд╛рд░реА рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ (- рд╕реНрд░реЛрдд рд╕реНрд╡рд┐рдЪ); рдпрджрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рддреЛ django, mysqldb рдФрд░ рдорд╛рдирдХ рдЕрдЬрдЧрд░ рдЖрдкреВрд░реНрддрд┐ рдХрд╛ рдЖрдзрд╛ рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧрд╛ред

рдЙрд╕рдХреЗ рдмрд╛рдж, htmlcov рдлрд╝реЛрд▓реНрдбрд░ (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкрде) рдореЗрдВ, рдЖрдк рдХреЛрдб рдХреА рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐, рдореЙрдбреНрдпреВрд▓ рджреНрд╡рд╛рд░рд╛ рдХрд╡рд░реЗрдЬ рдФрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рджреНрд╡рд╛рд░рд╛ рдХреБрд▓ рдкрд░ рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд░рд┐рдкреЛрд░реНрдЯ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрдЧрд▓реЗ рдЕрдВрдХ рдореЗрдВ: рдПрдХ рдирд┐рд╡рд╛рд░рдХ рдЙрдкрд╛рдп, рд▓реЗрдЖрдЙрдЯ рдФрд░ рдЬреЗрдПрд╕ рдкрд░реАрдХреНрд╖рдг, рд▓реЛрдб рдкрд░реАрдХреНрд╖рдг рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдереИрддрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдгред

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


All Articles