PHP рдПрдХ рдмрд╣реБрдд рд╣реА рд▓реЛрдХрдкреНрд░рд┐рдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрдЬрд╛рдп рд╡рд┐рд╢реЗрд╖рдЬреНрдЮреЛрдВ рдХрд╛ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░ рд╣реИред рдХреНрдпрд╛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ PHP рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╕рднреА redneck рдХреЛрдбрд░ рд╣реИрдВ? рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдирд╣реАрдВред рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдкреНрд░рдгрд╛рд▓рд┐рдпрд╛рдВ рдХрднреА-рдХрднреА рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдЬрдЯрд┐рд▓ рд╣реЛрддреА рд╣реИрдВред рдФрд░ рдкрд░реАрдХреНрд╖рдг, рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдмреЗрд╣рдж рд╕рд░рд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛: рдкрдврд╝рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди, рд▓рд┐рдЦрдирд╛, рдбрд┐рдмрдЧ рдХрд░рдирд╛, рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЬрд▓реНрджреА рд╕реЗ рдЪрд▓рдирд╛ред PHP рдореЗрдВ рдЗрд╕реЗ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░реА рджреГрд╖реНрдЯрд┐
рдХреЛрдбреЗрдкреНрд╢рди рдирд╛рдордХ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╣реБрдИред
рдЗрд╕рдХреЗ рд╕рд╛рде, рдЖрдкрдХреЗ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдкрд░реАрдХреНрд╖рдг рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
<?php $I = new TestGuy($scenario); $I->wantTo('create new blog post'); $I->amOnPage('/blog/posts'); $I->click('Create new post'); $I->fillField('Title','Codeception, a new way of testing!'); $I->fillField('Text','Codeception is new PHP full-stack testing framework.'); $I->click('Send'); $I->see('Congratulations, your post is successfully created!');
рд╕рд╣рдордд рд╣реВрдБ, рдЗрд╕ рддрд░рд╣ рдХреА рдкрд░реАрдХреНрд╖рд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ рд╕рдордЭ рдореЗрдВ рдЖрддреА рд╣реИред
рдФрд░ рдЕрдм рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк: рдЗрд╕ рдХреЛрдб рдХреЛ
рдлреНрд░реЗрдорд╡рд░реНрдХ рд╕рд┐рдореНрдлрдиреА, рд╕рд┐рдореНрдлрдиреА 2,
рдЬрд╝реЗрдВрдб рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдореБрд▓реЗрдЯрд░ рдЧрд╛рдЙрдЯ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐
рд╕реЗрд▓реЗрдирд┐рдпрдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рд╕реА рднреА рдмрджрд▓рд╛рд╡ рдХреЗ рдмрд┐рдирд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЖрдкрдХреЛ рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА рд╕рд╛рдЗрдЯ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рдкреЗрд╢рдХрд╢ рдХреА рдЬрд╛рддреА рд╣реИред
рд╕рдВрд╣рд┐рддрд╛ рдореЗрдВ, рд╕рд░рд▓рддрдо рд╕рдВрднрд╡ рддрд░реАрдХреЗ рд╕реЗ, рдЖрдк рдкреВрд░реА рдкрд░реАрдХреНрд╖рд╛ рдХреЛ рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЖрдк рдЕрдкрдиреЗ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рджреЛрд╣рд░рд╛рддреЗ рд╣реИрдВ: рд▓рд┐рдВрдХ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддрд╛ рд╣реИ, рдлреЙрд░реНрдо рднрд░рддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рдкрд░рд┐рдгрд╛рдо рджреЗрдЦрдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реИред рдПрдХ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдирд╛ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реЛрдЧрд╛ рдЬреЛ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░реЗрдЧрд╛ред рдЙрд╕реА рд╕рдордп, рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ IDE рдореЗрдВ рд╕реНрд╡рддрдГ рдкреВрд░реНрдгрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЕрддреНрдпрдВрдд рд╕рд░рд▓ рд╣реИ:

рддреАрди рдЦрдВрднреЛрдВ рдкрд░ рдЪрд▓рддрд╛ рд╣реИ рд╕рдВрд╣рд┐рддрд╛:
- рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ,
PHPUnit рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
- рд╕реНрд╡реАрдХреГрддрд┐ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП -
рдорд┐рдВрдХ ред рдЙрдирдХреЗ рд▓рд┐рдП, рдХреЙрдиреНрд╕реНрдЯреЗрдВрдЯрд┐рди
рдХреБрджреНрд░реНрдпрд╛рд╢реЛрд╡ рдПрд╡рд░рдЬреЗрдЯ рдХреЗ рд▓рд┐рдП
рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред
- рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ,
рд╕рд┐рдореНрдлрдиреА рдШрдЯрдХ ред рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рд▓рдЧрднрдЧ рд╣рд░ рдЪреАрдЬ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдиреЛрдЯ рдХреА BrowserKit рд╣реИ, рдЬреЛ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИред
рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, PEAR рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЛрдб рд╕реЗрдЯ рдХрд░реЗрдВ:
$ pear channel-discover codeception.com/pear $ pear install codeception/Codeception
рдЕрдм рдЖрд╡рд╢реНрдпрдХ рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред
$ codecept install
рдЙрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ рдЬрд┐рд╕реЗ рдЖрдк рдХрдорд╛рдВрдб рдХреЛ рдЙрд╕рдХреЗ рд░реВрдЯ рдореЗрдВ рдЯреЗрд╕реНрдЯ рдФрд░ рд░рди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ
$ codecept bootstrap $ codecept build
рдмреВрдЯрд╕реНрдЯреНрд░реИрдк рдХрдорд╛рдВрдб рддреАрди рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдФрд░ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдПрдЧрд╛:
- рдЗрдХрд╛рдИ
- рдХрд╛рд░реНрдпрд╛рддреНрдордХ
- рд╕реНрд╡реАрдХреГрддрд┐
рдпрд╣рд╛рдВ рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд╣рдо рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдФрд░ рд╕реНрд╡реАрдХреГрддрд┐ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рддреЗ рд╣реИрдВред рдмрд╛рдж рд╡рд╛рд▓реЗ рдХреЛ рдПрдХ рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдЙрд╕реА рдЧрд╛рдЙрдЯ рдпрд╛ рд╕реЗрд▓реЗрдирд┐рдпрдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдлрд╝рдВрдХреНрд╢рдВрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдЕрдВрджрд░ рд╣реА рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рд╕рд┐рдореНрдлрдиреА рдпрд╛ рдЬрд╝реЗрдВрдб рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╣реИрдВред
рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╕реНрд╡реАрдХреГрддрд┐ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдирд╛ рд╣реИред рдкрд░реАрдХреНрд╖рдг / рд╕реНрд╡реАрдХреГрддрд┐ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ, рдПрдХ рдирдпрд╛ StartPageCept.php рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ:
<?php $I = new WebGuy($scenario); $I->wantToTest('front page of my site'); $I->amOnPage('/'); $I->see('A sample text on my site');
рдпрд╣ рдЬрд╛рдБрдЪрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреА рд╕рд╛рдЗрдЯ рдХреЗ рдореБрдЦ рдкреГрд╖реНрда рдкрд░ рдкрд╛рда рд╣реИ: 'рдореЗрд░реА рд╕рд╛рдЗрдЯ рдкрд░ рдПрдХ рдирдореВрдирд╛ рдкрд╛рда'ред рдЙрд╕ рдкрд╛рда рдореЗрдВ рдЯрд╛рдЗрдк рдХрд░реЗрдВ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд╣рд╛рдВ рд╣реИ, рдФрд░ рдЖрдкрдХрд╛ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИред
рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рд╕реНрд╡реАрдХреГрддрд┐ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рд╕рд╛рдЗрдЯ рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХреЗ рдЕрдВрджрд░ рдЪрд▓реЗред рддреЛ рдЖрдкрдХреЛ url рдмрддрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдЖрдк рд╣рдорд╛рд░реА рд╕рд╛рдЗрдЯ рддрдХ рдкрд╣реБрдБрдЪ рд╕рдХрддреЗ рд╣реИрдВред рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓реЗрдВ: рдкрд░реАрдХреНрд╖рдг / рд╕реНрд╡реАрдХреГрддрд┐ редsuite.yml
config: PhpBrowser: url: ' url '
рдЕрдм рдХрд░ рд▓реЛред
$ codecept run acceptance
рдФрд░ рдЖрдкрдХреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:
Suite acceptance started Trying to see front page of my site (StartPageCept) - Ok Time: 1 second, Memory: 21.00Mb OK (1 test, 1 assertions)
рдЕрдм рдЖрдк рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХрд┐рд╕реА рд╕рд╛рдЗрдЯ рдкрд░ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реАрдХреНрд╖рдг рдХреА рддрд░рд╣ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ:
<?php $I = new WebGuy($scenario); $I->wantTo('log in as regular user'); $I->amOnPage('/login'); $I->fillField('Username','davert'); $I->fillField('Password','qwerty'); $I->click('Login'); $I->see('Hello, davert'); ?>
рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдкрдврд╝реЗрдВред
рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рдЕрдВрджрд░ рдЗрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдЯреЗрд╕реНрдЯ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЯреЗрд╕реНрдЯ рдХреЛ 'рдЯреЗрд╕реНрдЯ / рдлрдВрдХреНрд╢рдирд▓' рдореЗрдВ рдХреЙрдкреА рдХрд░реЗрдВ рдФрд░ рдлрд╛рдЗрд▓ рдЯреЗрд╕реНрдЯ / functional.suite.yml рдХреЛ рдПрдбрд┐рдЯ рдХрд░реЗрдВред
рдореИрдВ Symfony2 рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдареАрдХ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдЖрдк Zend рдлреНрд░реЗрдорд╡рд░реНрдХ рдпрд╛ рд╕рд┐рдореНрдлрдиреА, рд╕рд╛рде рд╣реА Doctrine1 рдпрд╛ Doctrine2 рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
class_name: TestGuy modules: enabled: [Symfony2, TestHelper]
рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП Symfony2 рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ред рдпрджрд┐ рдЖрдкрдХрд╛ рдРрдк рдХрд░реНрдиреЗрд▓ 'рдРрдк' рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕реНрдерд┐рдд рд╣реИ, рддреЛ рдкрд░реАрдХреНрд╖рдг рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рдмрд┐рдирд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:
$ codecept run functional
рдореИрдВ рдЖрдкрдХреЛ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реВрдБред рдореЙрдбреНрдпреВрд▓ рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрддреЗ рд╕рдордп рдЙрдкрд▓рдмреНрдз рд╣реИрдВред рдХрдИ рдореЙрдбреНрдпреВрд▓ рд╕реЗ рд▓рд┐рдП рдЧрдП рддрд░реАрдХреЗ TestGuy рдпрд╛ WebGuy рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╡рд┐рд╡рд░рдг рд╡рд░реНрдЧ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред
рдореЙрдбреНрдпреВрд▓ рд╡рд╕реНрддреБрддрдГ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рднреА рд╡рд┐рднрд┐рдиреНрди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХреАрдХрд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЖрдкрдХреЗ рдЖрд╡реЗрджрди рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд▓рдЧрдЗрдиреНрд╕ рдпрд╛ рдмрдВрдбрд▓реЛрдВ рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред
рд╕рдВрд╣рд┐рддрд╛ рди рдХреЗрд╡рд▓ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреА рд╣реИ, рдмрд▓реНрдХрд┐ рдЦрд░реЛрдВрдЪ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╡рд╛рддрд╛рд╡рд░рдг рдмрдирд╛рдиреЗ рдХреА рднреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреА рд╣реИред рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рддреИрдпрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╕рд╛рдл рдХрд░ рд░рд╣рд╛ рд╣реИред
рдпрд╣ рдореЙрдбреНрдпреВрд▓ рдбреАрдмреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛рдмреЗрд╕ рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рднрд░реЗрдВред рдЖрдк рдЗрд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдпрд╛ рдЬреБрдбрд╝рдирд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдбрдВрдк рдмрдирд╛рдПрдБ рдФрд░ рдЗрд╕реЗ рдкрд░реАрдХреНрд╖рдг / _data рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд░рдЦреЗрдВред рдлрд┐рд░ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд░реВрдЯ рдореЗрдВ codeception.yml рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓реЗрдВ рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдПрдХреНрд╕реЗрд╕ рдорд╛рдкрджрдВрдбреЛрдВ рдФрд░ рдбреАрдмреА рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдбрдВрдк рдкрде рджрд░реНрдЬ рдХрд░реЗрдВред рдЕрдм, рдпрджрд┐ рдЖрдк рдкрд░реАрдХреНрд╖рдг / рд╕реНрд╡реАрдХреГрддрд┐.suite.yml рдпрд╛ functional.suite.yml рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рдХреА рд╕реВрдЪреА рдореЗрдВ рдбреАрдмреА рдореЙрдбреНрдпреВрд▓ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдмрд╛рдж рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЕрдкрдбреЗрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдХреЗрд╡рд▓ рд╕рдлрд╛рдИ рдХрд╛ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЖрдк Doctrine рдпрд╛ Doctrine2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЙрдкрдпреБрдХреНрдд рдореЙрдбреНрдпреВрд▓ рдЖрдкрдХреЗ рд╕рднреА рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд▓реЗрдирджреЗрди рдореЗрдВ рдбрд╛рд▓рддреЗ рд╣реИрдВ рдФрд░ рдЕрдВрдд рдореЗрдВ рд░реЛрд▓рдмреИрдХ рдХрд░рддреЗ рд╣реИрдВред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рднрд░рд╛ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЗрд╕реЗ рдирд┐рд░рдВрддрд░ рд╕рдлрд╛рдИ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдРрд╕реЗ рдкрд░реАрдХреНрд╖рдг рдмрд╣реБрдд рддреЗрдЬрд╝реА рд╕реЗ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рд▓реЗрдирджреЗрди рдХреЗрд╡рд▓ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдФрд░ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред
рдЖрдк
рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдЕрдзрд┐рдХ рдкреВрд░реНрдг рдкреНрд░рд▓реЗрдЦрди рдкрд╛рдПрдВрдЧреЗред рджреЛрдиреЛрдВ рдЕрд╡рд▓реЛрдХрди рд╕рд╛рдордЧреНрд░реА рдФрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд╡рд┐рд╡рд░рдг рд╡рд╣рд╛рдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред
рд╕рдВрд╣рд┐рддрд╛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдмреАрдЯрд╛ рдореЗрдВ рд╣реИ рдФрд░ рдЖрдкрдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдЕрддреНрдпрдзрд┐рдХ рд╕рд░рд╛рд╣рдирд╛ рдХреА рдЬрд╛рдПрдЧреАред
GitHub рдкрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВред