Django рдмреАрдбреАрдбреА рд╡рд┐рдХрд╛рд╕

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



рдЫрд╡рд┐



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



рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдХрд╛рд░реНрдпрд╢реАрд▓ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ рдмрдирд╛рдПрдБред рд▓рдЧрднрдЧ рдирд┐рдореНрди рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде:
Django git+git://github.com/svfat/django-behave splinter
      
      







рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдореИрдВ рдЕрдкрдиреЗ рдХрд╛рдВрдЯрд╛ django- рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рдХреЛрдб рдиреЗ рдХрд╛рдо рдХрд░рдиреЗ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛, рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдЕрд╕рдВрдЧрддрд┐ рдХреЗ рдХрд╛рд░рдгред
 $ pip install -r requirements.txt $ django-admin.py startproject habratest $ cd habratest/ $ ./manage.py startapp vote
      
      







рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, Django рдХреЗ рдирд╡реАрдирддрдо рд╕реНрдерд┐рд░ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рд╡рд┐рдХрд╛рд╕ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╕реЗрдЯрд┐рдВрдЧрдлреНрд░реЗрдо рдореЗрдВ рдХреЗрд╡рд▓ рдХреБрдЫ рд▓рд╛рдЗрдиреЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
 INSTALLED_APPS = ( ... 'vote', 'django_behave', ) TEMPLATE_DIRS = ( os.path.join(BASE_DIR, 'templates/'), #     habratest/templates ) TEST_RUNNER = 'django_behave.runner.DjangoBehaveTestSuiteRunner'
      
      







рдкрд╣рд▓рд╛ рдЪрд░рдг рд╕рд╛рдЗрдЯреЛрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдореМрдЬреВрдж рдФрдЬрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ BDD рд╕реНрдЯрд╛рдЗрд▓ рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдлрд╝реЛрд▓реНрдбрд░ рд╣реИрдмреНрд░реЗрдЯ / рд╡реЛрдЯ / рдлреАрдЪрд░реНрд╕ рдФрд░ рд╣реИрдмреНрд░реЗрдЯ / рд╡реЛрдЯ / рдлреАрдЪрд░ / рд╕реНрдЯреЗрдкреНрд╕ рдмрдирд╛рдПрдВ



рдпрд╣рд╛рдВ рд╣рдо рдЙрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВрдЧреЗ рдЬрд┐рд╕реЗ рд╣рдо рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдлрд╝реАрдЪрд░ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ, рдирд┐рдореНрди рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдПрдХ habra.features рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ:
 Feature: Habrarating Scenario: Show a rating Given I am a visitor When I visit url "http://localhost:8081/" Then I should see link contents url "habrahabr.ru"
      
      







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



рд╣рдо рдЗрд╕ URL рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ django-behave рдкрд░реАрдХреНрд╖рдг рд╕рд░реНрд╡рд░ рдХреЛ рдкреЛрд░реНрдЯ 8081 рдкрд░ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред



рдПрдХ рд╣реА рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ, рдПрдиреНрд╡рд╛рдпрд░реНрдирдореЗрдВрдЯрд▓ рдмрдирд╛рдПрдВ, рд╡рд╣ рдХреЛрдб рдЬрд┐рд╕рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдФрд░ рдмрд╛рдж рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЕрдм рддрдХ рдХреЗрд╡рд▓ рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдХрд╛рд░реНрдп рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ:
 from splinter.browser import Browser def before_all(context): context.browser = Browser() def after_all(context): context.browser.quit() context.browser = None
      
      







рд╣рдо рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВ
 $ ./manage.py test vote
      
      







рдХреБрдЫ рдирд╣реАрдВ рд╣реБрдЖ - рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдорд╛рд╣реМрд▓ рд╕рдордЭ рдирд╣реАрдВ рдкрд╛ рд░рд╣рд╛ рд╣реИ рдХрд┐ habra.features рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рджрд┐рдП рдЧрдП рдЪрд░рдгреЛрдВ рдХрд╛ рдХреНрдпрд╛ рдХрд░реЗрдВред рдкреАрд▓реЗ (рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рдпрд╛ рднреВрд░реЗ-рдкреАрд▓реЗ) рд░рдВрдЧ рдХреА рдкрдВрдХреНрддрд┐рдпрд╛рдБ рджреЗрдЦреЗрдВред рдмреЗрдЭрд┐рдЭрдХ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВ / рд╡реЛрдЯ / рд╕реБрд╡рд┐рдзрд╛рдУрдВ / рдЪрд░рдгреЛрдВ / habra.feature.py, рдпрд╣ рдЪрд░рдгреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдиреА рдЪрд╛рд╣рд┐рдП:
 from behave import given, when, then @then(u'I should see link contents url "{content}"') def i_should_see_link_contents_url(context, content): msg = context.browser.find_link_by_partial_href(content).first assert msg @when(r'I visit url "{url}"') def i_visit_url(context, url): br = context.browser br.visit(url) @given(u'I am a visitor') def i_am_a_visitor(context): pass
      
      







рдлрд┐рд░ рд╕реЗ рджреМрдбрд╝реЛ
  $ ./manage.py test vote
      
      







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



рд╡реЛрдЯ / рдореЙрдбрд▓ рдереНрд░реЗрдб рдореЗрдВ рдПрдХ рдореЙрдбрд▓ рдмрдирд╛рдПрдБ
 class VoteItem(models.Model): url = models.URLField() rating = models.IntegerField(default=0) class Meta: #      ListView      ordering = ["-rating"] def __unicode__(self): return self.url
      
      







рд╣рдо рдХрд░рддреЗ рд╣реИрдВ:
 $ ./manage.py syncdb
      
      







рд╣реИрдмреНрд░реЗрдЯреЗрд╕реНрдЯ / urls.py рдореЗрдВ рд╣рдо рдЖрдпрд╛рдд рдХрд░рддреЗ рд╣реИрдВ
 from vote.views import VoteListView
      
      







рдФрд░ urlpatterns рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ
  url(r'^$', VoteListView.as_view(), name="index"),
      
      







рдореЗрдВ рд╡реЛрдЯ / рд╡рд┐рдЪрд╛рд░
 from django.views.generic import ListView from models import VoteItem class VoteListView(ListView): model=VoteItem template_name="list.html"
      
      







рд╣реИрдмреНрд░реЗрдЯреЗрд╕реНрдЯ / рдЯреЗрдореНрдкреНрд▓реЗрдЯ / рд▓рд┐рд╕реНрдЯ рдореЗрдВред рд╣рдорд╛рд░рд╛ рд░реЗрдЯреНрд░реЛ рд╕реНрдЯрд╛рдЗрд▓ рдЯреЗрдореНрдкреНрд▓реЗрдЯ:
 <!DOCTYPE html> <html> <head> <title>Habra rating</title> </head> <body> <ol> {% for voteitem in object_list %} <li id="{{voteitem.pk}}"><a href="{{ voteitem.url }}">{{ voteitem.url }}</a> | Rating:{{voteitem.rating}}</li> {% endfor %} </ul> </body> </html>
      
      







рдЬрдм рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рд░ рдмрд╛рд░ рдореЗрдореЛрд░реА рдореЗрдВ рдПрдХ рдирдпрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЕрдВрдд рдХреЗ рдмрд╛рдж рдЗрд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЗрд╕реЗ рдХреБрдЫ рдбреЗрдЯрд╛ рд╕реЗ рднрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рдХреЗ рд▓рд┐рдП рдлрд╛рдЗрд▓ рдореЗрдВ habratest / habratest / populate.py рд▓рд┐рдЦреЗрдВ:
 from vote.models import VoteItem VoteItem(url="http://www.yandex.ru", rating=6).save() VoteItem(url="http://www.google.com", rating=5).save() VoteItem(url="http://www.habrahabr.ru", rating=6).save()
      
      







рдФрд░ рдЗрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдЖрдпрд╛рдд рдХреЛ environment.py рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ
 from habratest import populate
      
      







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



рд╣рдо рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ
 $ ./manage.py test vote
      
      







- рдЙрддреНрдХреГрд╖реНрдЯ, рдкрд░реАрдХреНрд╖рдг рдкрд╛рд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рд░реЗрдЯрд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ - рд╣рдореЗрдВ рдХрд┐рд╕реА рддрд░рд╣ рд╕рд╛рдЗрдЯреЛрдВ рдХреЗ рд▓рд┐рдП рд╡реЛрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ



Habra.feature рдореЗрдВ рдПрдХ рдирдИ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬреЛрдбрд╝реЗрдВ:
  Scenario: Vote for a site Given I am a visitor When I visit url "http://localhost:8081/" When I click link contents "+" Then I should see "Vote successful" somewhere in page
      
      







рдкрд░реАрдХреНрд╖рд╛ рдХрд╛ рд╡рд╛рддрд╛рд╡рд░рдг рдЕрдВрддрд┐рдо рджреЛ рдЪрд░рдгреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдирд╛ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЪрд░рдгреЛрдВ рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ / habra.feature.py:
 @then(u'I should see "{text}" somewhere in page') def i_should_see_text_somwhere_in_page(context, text): assert text in context.browser.html @when(u'I click link contents "{text}"') def i_click_link_contents_text(context, text): link = context.browser.find_link_by_text(text).first assert link link.click()
      
      







рдлрд┐рд░ рд╣рдо рдкрд░реАрдХреНрд╖рдг рдлрд┐рд░ рд╕реЗ рдЪрд▓рд╛рддреЗ рд╣реИрдВред рдЪрд░рдг рдореЗрдВ рддреНрд░реБрдЯрд┐ рдЬрдм рдореИрдВ рд▓рд┐рдВрдХ рд╕рд╛рдордЧреНрд░реА "+" рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддрд╛ рд╣реВрдВред рдЗрд╕рд▓рд┐рдП - рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ "+" рд▓рд┐рдВрдХ рдирд╣реАрдВ рд╣реИ, рдФрд░ рди рд╣реА рдЗрд╕ рдкрд░ рдХреЛрдИ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╕рд╣реА рдХрд░реЗрдВрдЧреЗ (рдзреНрдпрд╛рди рди рджреЗрдВ рдХрд┐ рдХреЛрдб рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдзреЛрдЦрд╛ рджреЗрдиреЗ рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:



рд╣реИрдмреНрд░реЗрдЯреЗрд╕реНрдЯ / рдЯреЗрдореНрдкреНрд▓реЗрдЯ / рд▓рд┐рд╕реНрдЯ рдореЗрдВред
 <li id="{{voteitem.pk}}"><a href="{{ voteitem.url }}">{{ voteitem.url }}</a> | Rating:{{voteitem.rating}} | <a href={% url 'addvote' voteitem.pk %}>+<a></li>
      
      







рддрджрдиреБрд╕рд╛рд░, рд╣рдо рд╡реЛрдЯ / view.py рдореЗрдВ addvote рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрджрд┐рдо рджреГрд╢реНрдп рдмрдирд╛рддреЗ рд╣реИрдВ:
 from django.shortcuts import render_to_response def addvote(request, pk): return render_to_response('successful.html', context)
      
      







рдЗрд╕реЗ urls.py рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ,
 from vote.views import VoteListView, addvote
      
      







рдФрд░
  url(r'^plus/(?P<pk>\d+)/$', addvote, name='addvote'),
      
      







рдФрд░ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдЯреЗрдореНрдкреНрд▓реЗрдЯ / рд╕рдлрд╝рд▓ред Html
 <!DOCTYPE html> <html> <head> <title>Habra rating</title> </head> <body> <p>Vote successful</p> </body> </html>
      
      







рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдПрдВ - рд╕рдм рдХреБрдЫ рд╕рдлрд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред



рдФрд░ рдЕрдм рд╣рдо рд░реЗрдЯрд┐рдВрдЧ рдмрдврд╝рд╛рдиреЗ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦреЗрдВрдЧреЗред рд╣рдореЗрдВ рдорддрджрд╛рди рдХреЗ рджреМрд░рд╛рди рд╕реВрдЪреА рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╣рд╛рдВ рд╣рдо рдЗрд╕ рддрдереНрдп рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдПрдВрдЧреЗ рдХрд┐ рд╣рдо рд╕реНрд░реЛрдд рдбреЗрдЯрд╛ рдХреЛ рдЬрд╛рдирддреЗ рд╣реИрдВ (рдЬреЛ рдХрд┐ populate.py рд╣реЛ рдЧрдпрд╛ рдерд╛), y habrahabr.ru рд░реЗрдЯрд┐рдВрдЧ = 6 рдХреЗ рдмрд╛рдж рд╕реЗ, "+" рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдкрд░ рдЗрд╕рдХреА рд░реЗрдЯрд┐рдВрдЧ рдПрдХ рд╕реЗ рдмрджрд▓ рд╕рдХрддреА рд╣реИ, рдФрд░ рдкрд┐рдЫрд▓реЗ рдкрд░рд┐рджреГрд╢реНрдп рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЗрд╕рдХреА рд░реЗрдЯрд┐рдВрдЧ "7" рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред
  Scenario: Vote for a site and look at the rating Given I am a visitor When I visit url "http://localhost:8081/" Then I should see "Rating:7" somewhere in page
      
      







рдлрд┐рд░, рдЕрдВрддрд┐рдо рдЪрд░рдг рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, addvote рджреГрд╢реНрдп рдЬреЛрдбрд╝реЗрдВ:
 def addvote(request, pk): item = VoteItem.objects.get(pk=pk) item.rating += 1 item.save() return render_to_response('successful.html')
      
      







рд╣рдо рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ, рдЕрдм рдкрд░реАрдХреНрд╖рдг рд╕рдлрд▓ рд╣реИред



рдЗрд╕рд▓рд┐рдП, рдЬреЗрд░рдХрд┐рди рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВ (рдЬреЛ, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рдХрд╣рд╛, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рд╡реНрдпрдХреНрддрд┐ рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИ) рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рддрдХрдиреАрдХреА рдХрд╛рд░реНрдп рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдмрдирд╛рдПрдВрдЧреЗ рдФрд░, рдЙрд╕реА рд╕рдордп, рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреА рд╕реНрд╡реАрдХреГрддрд┐ рдкрд░реАрдХреНрд╖рдгред



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



рдФрд░ рдХреНрдпрд╛ рдкрдврд╝реЗрдВ:

рдкреНрд░рд▓реЗрдЦрди рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдВ

рд╕реНрдкреНрд▓рд┐рдВрдЯрд░ - рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рд░реВрдкрд░реЗрдЦрд╛

Django рдлреБрд▓ рд╕реНрдЯреИрдХ рдЯреЗрд╕реНрдЯрд┐рдВрдЧ рдПрдВрдб рд▓реЗрдЯрд░ рд╡рд┐рдж рдмреАрдбреАрдбреА рдПрдВрдб рд▓реЗрдЯреНрдпреВрд╕




All Articles