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