{"id":313004,"date":"2020-11-12T09:00:41","date_gmt":"2020-11-12T09:00:41","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=313004"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=313004","title":{"rendered":"\u0422\u0435\u0441\u0442\u044b, \u0434\u0435\u043d\u044c\u0433\u0438 \u0438 \u0442\u0435\u0445\u0434\u043e\u043b\u0433 (\u0441\u043a\u0430\u0437 \u0438\u0437 \u0436\u0438\u0437\u043d\u0438 \u043e\u0434\u043d\u043e\u0433\u043e Java-\u043f\u0440\u043e\u0435\u043a\u0442\u0430)"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/xu\/lg\/g1\/xulgg1bl5y0tvubnrckuk7zfm4o.jpeg\"><\/p>\n<p>  \u0414\u043e\u0440\u043e\u0433\u043e\u0439 \u0434\u0440\u0443\u0433, \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043e\u0442\u0447\u0430\u0441\u0442\u0438 \u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438, \u0430 \u043e\u0442\u0447\u0430\u0441\u0442\u0438 \u043e \u0434\u0435\u043d\u044c\u0433\u0430\u0445 \u0438 \u0436\u0438\u0437\u043d\u0438. \u042f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0435\u0451 \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u0440\u0430\u0437 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u043e\u043c\u0443 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u044b \u043f\u0438\u0448\u0435\u043c \u0442\u0435\u0441\u0442\u044b, \u043a\u043e\u0433\u0434\u0430 \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u043c\u044b \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u043c. \u0422\u0435\u043f\u0435\u0440\u044c \u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u0443\u0434\u0443 \u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0430 \u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e \u0441\u0441\u044b\u043b\u043a\u0443, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c\u0441\u044f. \u042f \u0432\u044b\u0440\u0430\u0436\u0430\u044e \u0441\u0432\u043e\u0439 \u043b\u0438\u0447\u043d\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u0438 \u043c\u043d\u0435\u043d\u0438\u0435, \u043d\u0430\u0434\u0435\u044f\u0441\u044c, \u0447\u0442\u043e \u0438 \u0442\u0435\u0431\u0435 \u043e\u043d \u0442\u043e\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u0435\u043d.<\/p>\n<p>  \u0421\u043a\u0430\u0437 \u043c\u043e\u0439 \u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043d\u0430 Java, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432\u0441\u0451 \u043d\u0438\u0436\u0435\u0438\u0437\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0435 \u0441\u043f\u0440\u0430\u0432\u0435\u0434\u043b\u0438\u0432\u043e \u0438 \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u041e\u0442 \u0441\u043c\u0435\u043d\u044b \u044f\u0437\u044b\u043a\u043e\u0432 \u043b\u044e\u0434\u0438 \u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0432 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043d\u0435 \u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f.<\/p>\n<blockquote><p><strong>\u041e\u0442\u043a\u0430\u0437 \u043e\u0442 \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u0438 (aka disclaimer)<\/strong>: \u0432\u0441\u0435 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432\u044b\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u044b\u043c\u0438, \u0438 \u043b\u044e\u0431\u043e\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435 \u0441 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0436\u0438\u0432\u0443\u0449\u0438\u043c\u0438 \u0438\u043b\u0438 \u043a\u043e\u0433\u0434\u0430-\u043b\u0438\u0431\u043e \u0436\u0438\u0432\u0448\u0438\u043c\u0438 \u043b\u044e\u0434\u044c\u043c\u0438 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e.<\/p><\/blockquote>\n<p>  <a name=\"habracut\"><\/a><br \/>  \u0427\u0442\u043e \u0432\u044b \u0443\u0437\u043d\u0430\u0435\u0442\u0435 \u0438\u0437 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438:  <\/p>\n<ul>\n<li>\u0437\u0430\u0447\u0435\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u044b \u043f\u0438\u0448\u0443\u0442 \u0442\u0435\u0441\u0442\u044b;<\/li>\n<li>\u043f\u043e\u0447\u0435\u043c\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u044b \u041d\u0415 \u043f\u0438\u0448\u0443\u0442 \u0442\u0435\u0441\u0442\u044b;<\/li>\n<li>\u043a\u0442\u043e \u0442\u0430\u043a\u0438\u0435 \u043d\u0438\u0433\u0438\u043b\u0438\u0441\u0442\u044b \u0438 \u043f\u0440\u0438\u0447\u0451\u043c \u0437\u0434\u0435\u0441\u044c \u0434\u0435\u043d\u044c\u0433\u0438.<\/li>\n<\/ul>\n<p>  \u041a\u043e\u043c\u0443 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430 \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f:  <\/p>\n<ul>\n<li>\u043d\u0438\u0433\u0438\u043b\u0438\u0441\u0442\u0430\u043c \u0438 \u043d\u0435 \u0437\u043d\u0430\u044e\u0449\u0438\u043c, \u043a\u0442\u043e \u044d\u0442\u043e \u0442\u0430\u043a\u0438\u0435;<\/li>\n<li>\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430\u043c-\u043e\u0434\u0438\u043d\u043e\u0447\u043a\u0430\u043c, \u043d\u0435 \u043f\u0440\u0438\u0432\u044b\u043a\u0448\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435;<\/li>\n<li>\u0441\u0442\u0443\u0434\u0435\u043d\u0442\u0430\u043c, \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0442\u0438\u0432\u0435.<\/li>\n<\/ul>\n<h1>\u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043d\u0430\u0447\u0430\u0442\u044c, \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0434\u0430\u0442\u044c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0442\u0435\u043e\u0440\u0438\u0438. \u0417\u043d\u0430\u044e, \u044d\u0442\u043e \u0437\u0430\u043d\u0443\u0434\u043d\u043e, \u043d\u043e \u0447\u0442\u043e \u043f\u043e\u0434\u0435\u043b\u0430\u0442\u044c&#8230;<\/h1>\n<p>  \u041e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0432 \u0432\u0430\u0448\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u041f\u041e \u0432\u0435\u043b\u0430\u0441\u044c \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Continuous Integration, \u043e\u043d\u0430 \u0436\u0435 CI, \u043e\u043d\u0430 \u0436\u0435 \u00ab\u041d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u0430\u044f \u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f\u00bb.<\/p>\n<p>  <strong>Continuous integration<\/strong> \u2014 \u044d\u0442\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0435\u0434\u0438\u043d\u044b\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u043c \u043a\u043e\u0434\u0430, \u0447\u0430\u0441\u0442\u043e \u0435\u0433\u043e \u0430\u043a\u0442\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0442\u044c \u0441 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0432\u0435\u0442\u043a\u043e\u0439 \u043a\u043e\u0434\u0430, \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438. <\/p>\n<p>  \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438 \u043d\u0430 \u0440\u0430\u043d\u043d\u0435\u0439 \u0441\u0442\u0430\u0434\u0438\u0438, \u0440\u0435\u0448\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b.<\/p>\n<p>  \u041a\u043e\u043d\u0435\u0447\u043d\u0430\u044f \u0446\u0435\u043b\u044c \u2014 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b\u0439 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442 \u043f\u0440\u043e\u0435\u043a\u0442\u0430. <\/p>\n<p>  <b>CI Pipeline<\/b><br \/>  \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/0d6\/ef9\/63c\/0d6ef963ccf85c630c4e7ae1b5fa40d0.png\"><\/div>\n<p>  <\/p>\n<ol>\n<li>\u0415\u0441\u0442\u044c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u044b \u0445\u0440\u0430\u043d\u0438\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0441 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b.<\/li>\n<li>\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0445 \u0434\u043e\u0441\u0442\u0430\u0442\u044c, \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u043f\u0440\u043e\u0433\u043d\u0430\u0442\u044c \u0442\u0435\u0441\u0442\u044b.<\/li>\n<li>\u041f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0443\u044e\u0441\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u0444\u0430\u0439\u043b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 Docker-\u043e\u0431\u0440\u0430\u0437, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u044b <code>docker build<\/code>.<\/li>\n<li>\u041a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432.<\/li>\n<\/ol>\n<p>  \u0412 \u0445\u043e\u0434\u0435 \u0441\u0431\u043e\u0440\u043a\u0438 \u043a\u0440\u0430\u0439\u043d\u0435 \u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443:   <\/p>\n<ul>\n<li>\u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u043c\u043e\u0434\u0443\u043b\u044c\u043d\u044b\u0435 (unit) \u0442\u0435\u0441\u0442\u044b;<\/li>\n<li>\u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 (functional) \u0442\u0435\u0441\u0442\u044b;<\/li>\n<li>\u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u0434\u044b\u043c\u043e\u0432\u043e\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 (smoke testing);<\/li>\n<li>\u043f\u0440\u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0438, \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u0438 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435.<\/li>\n<\/ul>\n<p>  \u0414\u043e\u0440\u043e\u0433\u043e\u0439 \u0434\u0440\u0443\u0433, \u0442\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0448\u044c \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0437\u0434\u043d\u0435\u0435 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0432 \u043a\u0430\u043a\u043e\u043c-\u0442\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438. \u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u0431\u044b\u043b\u043e \u0434\u0432\u043e\u0439\u043d\u043e\u0433\u043e \u0442\u043e\u043b\u043a\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e \u0440\u0430\u0437\u043d\u044b\u043c \u0432\u0438\u0434\u0430\u043c \u0442\u0435\u0441\u0442\u043e\u0432, \u044f \u043e\u0431\u044a\u044f\u0441\u043d\u044e \u0441\u0432\u043e\u0438\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0447\u0442\u043e \u044d\u0442\u043e \u0442\u0430\u043a\u043e\u0435.<\/p>\n<p>  <b>\u041c\u043e\u0434\u0443\u043b\u044c\u043d\u043e\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 (unit testing)<\/b><br \/>  \u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043c\u0430\u043b\u043e\u0433\u043e \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430 \u043a\u043e\u0434\u0430: \u0443\u0442\u0438\u043b\u0438\u0442\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0441 \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u043e\u0439. <\/p>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440: \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 <code>A<\/code> \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 <code>\u0411<\/code>.<\/p>\n<pre><code class=\"java\">@Test void defineBirthdayShouldReturnDateSuccessfully() {    LocalDate expectedDate = LocalDate.of(1991, 5, 29);    String sourceData = &quot;1991 05 29&quot;;     LocalDate resultDate = projectService.defineBirthday(sourceData);    assertEquals(expectedDate, resultDate); } <\/code><\/pre>\n<p>  <b>\u0424\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 (functional testing)<\/b><br \/>  C \u0435\u0433\u043e \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0432\u044f\u0437\u043d\u043e\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0431\u043b\u043e\u043a\u043e\u0432 \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043e\u0434\u043d\u043e\u0439 \u043e\u0431\u0449\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0438. \u041f\u0440\u0438\u043c\u0435\u0440: \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f:  <\/p>\n<ul>\n<li>\u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435;<\/li>\n<li>\u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435;<\/li>\n<li>\u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0430\u0443\u0434\u0438\u0442\u0430;<\/li>\n<li>\u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435.<\/li>\n<\/ul>\n<p>  <\/p>\n<pre><code class=\"java\">@Test void nextUserShouldPersistUserObjectSuccessfully() {    User user = buildTestUser();    UserAudit userAudit = buildTestUserAudit(user);       doReturn(user).when(userDAO).saveUser(eq(user));    doReturn(userAudit).when(userAuditDAO).saveUserAudit(eq(userAudit));     projectService.nextUser(user);     verify(userDAO).saveUser(eq(user));    verify(userAuditDAO).saveUserAudit(eq(userAudit)); } <\/code><\/pre>\n<p>  <b>\u0414\u044b\u043c\u043e\u0432\u043e\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 (smoke testing)<\/b><br \/>  \u0412 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0438 \u0435\u0441\u0442\u044c \u0438\u0433\u0440\u0430 \u0441\u043b\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0438\u0448\u043b\u0430 \u0438\u0437 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u0442\u0435\u0445\u043d\u0438\u043a\u0438: \u043f\u043e\u0441\u043b\u0435 \u0441\u0431\u043e\u0440\u043a\u0438 \u0441\u0445\u0435\u043c\u044b \u0446\u0435\u043f\u0438 \u0435\u0451 \u0432\u043a\u043b\u044e\u0447\u0430\u043b\u0438 \u0432 \u0441\u0435\u0442\u044c \u0438 \u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438, \u043d\u0435 \u043f\u043e\u0448\u0451\u043b \u043b\u0438 \u0433\u0434\u0435 \u0434\u044b\u043c. \u041f\u043e \u0441\u0443\u0442\u0438, \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0442\u0435\u0441\u0442, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u0441\u043b\u0443\u0436\u0431\u0430 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u0430 \u0441\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f, \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c\u0441\u044f \u0438 \u043e\u0442\u0432\u0435\u0442\u0438\u0442\u044c \u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0437\u0430\u043f\u0440\u043e\u0441. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, web-\u0437\u0430\u043f\u0440\u043e\u0441 \u043f\u043e URI <code>\/ping<\/code> \u0438\u043b\u0438 <code>\/version<\/code> \u0441 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u044b\u043c \u043e\u0442\u0432\u0435\u0442\u043e\u043c. \u0422\u0430\u043a\u0438\u0435 \u0442\u0435\u0441\u0442\u044b \u043b\u0435\u0433\u0447\u0435 \u043f\u0438\u0441\u0430\u0442\u044c, \u0447\u0435\u043c \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435, \u0430 \u0432\u0435\u0434\u044c \u043d\u0430\u0448\u0430 \u0433\u043b\u0430\u0432\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u2014 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0443\u0437\u043d\u0430\u0442\u044c \u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0435. <\/p>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440: backend-\u0441\u043b\u043e\u0439 \u043d\u0435 \u0436\u0435\u043d\u0438\u0442\u0441\u044f c web-\u0441\u043b\u043e\u0435\u043c, \u043e \u0447\u0451\u043c \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0438\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0430, \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u0441 Dependency injection.<\/p>\n<pre><code class=\"java\">@Test public void getPingShouldReturnSuccessResponse() {    ServerResponse response = executeGet(&quot;\/ping&quot;);    StatusDTO responseDTO = MAPPER.readValue(response.body, StatusDTO.class);     assertEquals(OK_200, response.code);    assertEquals(new StatusDTO(&quot;up&quot;), responseDTO);     verify(rabbitService).hasRabbitConnection(); } <\/code><\/pre>\n<p>  <b>\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 (integration testing)<\/b><br \/>  \u0413\u043b\u0430\u0432\u043d\u044b\u0439 \u0432\u0438\u0434 \u0442\u0435\u0441\u0442\u043e\u0432. \u041c\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0435 \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u0430 \u0437\u0430\u0434\u0430\u0447\u0438, \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0437\u0430\u0442\u0440\u0430\u0433\u0438\u0432\u0430\u044e\u0449\u0438\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u0443\u0436\u0431, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u043e\u0434\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0430 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0431\u043e\u043b\u044c\u0448\u0435. <\/p>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440: \u044d\u0442\u0430\u043f\u044b \u0441\u043c\u0435\u043d\u044b \u043f\u0430\u0440\u043e\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f:  <\/p>\n<ul>\n<li>\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u0430\u0440\u043e\u043b\u044f \u0438 \u043f\u0430\u0440\u043e\u043b\u044f \u0434\u043b\u044f \u0431\u0443\u0434\u0443\u0449\u0435\u0439 \u0437\u0430\u043c\u0435\u043d\u044b;<\/li>\n<li>\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f;<\/li>\n<li>\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f;<\/li>\n<li>\u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0434\u043b\u044f \u0441\u043b\u0443\u0436\u0431\u044b SMS-\u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0439 \u043e \u0441\u043c\u0435\u043d\u0435 \u043f\u0430\u0440\u043e\u043b\u044f;<\/li>\n<li>\u0441\u043c\u0435\u043d\u0430 \u043f\u0430\u0440\u043e\u043b\u044f \u0441 \u043a\u043e\u0434\u043e\u043c \u0438\u0437 SMS;<\/li>\n<li>\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441 \u043d\u043e\u0432\u044b\u043c \u043f\u0430\u0440\u043e\u043b\u0435\u043c;<\/li>\n<li>\u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.<\/li>\n<\/ul>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041a\u043e\u0434<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"java\">@Test public void stage001_validateUserPasswords() {    String password = genPassword();    String nextPassword = genPassword();    setPassword(password);    setNextPassword(nextPassword);     List.of(password, nextPassword).forEach(pwd -&gt; {        var dto = PasswordValidateRequest.builder().password(pwd).build();        ResponseEntity&lt;Void&gt; response = restTemplate                .postForEntity(baseUrl + API_USERS_URI + &quot;\/PasswordValidateRequests&quot;, dto, Void.class);        assertEquals(HttpStatus.OK, response.getStatusCode());    }); }  @Test public void stage002_createNewUser() {    String login = buildPhoneNumber();    String password = getPassword();    setLogin(login);     UserDTO dto = buildUser(login, password, INTERNET);     HttpHeaders headers = new HttpHeaders();    headers.add(ACCESS_HEADER, ACCESS_TOKEN);    HttpEntity&lt;UserDTO&gt; httpEntity = new HttpEntity&lt;&gt;(dto, headers);    ResponseEntity&lt;UserDTO&gt; response = restTemplate            .exchange(baseUrl + SRV_USERS_URI, HttpMethod.POST, httpEntity, UserDTO.class);     UserDTO data = response.getBody();    assertEquals(HttpStatus.CREATED, response.getStatusCode());       assertNotNull(&quot;response data is null&quot;, data);    setUserId(data.getId());     assertNotNull(&quot;user id undefined&quot;, data.getId());    assertEquals(&quot;user login undefine&quot;, login, data.getUserName());    assertTrue(&quot;user is not active&quot;, data.getActive()); }  @Test public void stage003_readUserByAuthSuccessfully() {    readUserByAuth(); }  @Test public void stage010_sendSmsNotificationToRestorePassword() {    String phone = getLogin();    UserPhone dto = new UserPhone(phone);     ResponseEntity&lt;Void&gt; response = restTemplate            .postForEntity(baseUrl + API_USERS_URI + &quot;\/restore_password&quot;, dto, Void.class);    assertEquals(&quot;SMS hasn't sent&quot;, OK, response.getStatusCode());     var notification = notificationRepository.findLastByPhone(phone);    assertEquals(&quot;SMS_RESTORE_PASSWORD_CODE&quot;, notification.getSmsTemplate());    assertNotNull(&quot;no confirm SMS data&quot;, notification.getContentData());     var smsData = smsDataReader.readValue(notification.getContentData());    assertNotNull(&quot;no sms code&quot;, smsData.getCode());     setSmsConfirmCode(smsData.getCode()); }  @Test public void stage011_patchShouldChangeUserPasswordBySmsCode() {    String smsCode = getSmsConfirmCode();    String login = getLogin();    String nextPassword = getNextPassword();    setPassword(nextPassword);  UserPhonePassword dto = UserPhonePassword.builder()        .password(nextPassword).phone(login).code(smsCode)        .build();    HttpEntity&lt;UserPhonePassword&gt; httpEntity = new HttpEntity&lt;&gt;(dto, new HttpHeaders());    ResponseEntity&lt;Void&gt; response = restTemplate.exchange(baseUrl + API_USERS_URI + &quot;\/password&quot;, PATCH, httpEntity, Void.class);    assertEquals(HttpStatus.OK, response.getStatusCode()); }  @Test public void stage012_readUserByAuthSuccessfully() throws IOException {    readUserByAuth(); }  @Test public void stage099_deleteUser() {    Object userId = getUserId();    HttpHeaders headers = new HttpHeaders();    headers.add(ACCESS_HEADER, ACCESS_TOKEN);    HttpEntity&lt;?&gt; httpEntity = new HttpEntity&lt;&gt;(HttpEntity.EMPTY, headers);     ResponseEntity&lt;String&gt; before = restTemplate.exchange(baseUrl + SRV_USERS_URI + &quot;\/{id}&quot;, HttpMethod.GET, httpEntity, String.class, userId);    assertEquals(HttpStatus.OK, before.getStatusCode());     ResponseEntity&lt;Void&gt; response = restTemplate.exchange(baseUrl + SRV_USERS_URI + &quot;\/{id}&quot;, DELETE, httpEntity, Void.class, userId);    assertEquals(HttpStatus.NO_CONTENT, response.getStatusCode());     ResponseEntity&lt;Void&gt; after = restTemplate.exchange(baseUrl + SRV_USERS_URI + &quot;\/{id}&quot;, HttpMethod.GET, httpEntity, Void.class, userId);    assertEquals(HttpStatus.NOT_FOUND, after.getStatusCode()); }  private void readUserByAuth() throws IOException {    String login = getLogin();    String password = getPassword();    HttpHeaders headers = authHeaders(login, password);    headers.add(ACCESS_HEADER, ACCESS_TOKEN);    HttpEntity&lt;?&gt; httpEntity = new HttpEntity&lt;&gt;(HttpEntity.EMPTY, headers);     ResponseEntity&lt;String&gt; response = restTemplate.exchange(baseUrl + SRV_USERS_URI + &quot;\/me&quot;,GET, httpEntity, String.class);    assertEquals(OK, response.getStatusCode());     UserDTO data = userReader.readValue(response.getBody());    assertNotNull(&quot;user id undefined&quot;, data.getId());    assertTrue(&quot;user is not active&quot;, data.getActive()); } <\/code><\/pre>\n<\/div><\/div>\n<p>  \u0414\u043e\u0440\u043e\u0433\u043e\u0439 \u0434\u0440\u0443\u0433, \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0437\u043e\u0432\u0430 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0432 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u043c \u0442\u0435\u0441\u0442\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u043e\u0442 \u0436\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u043b\u0438\u0435\u043d\u0442 \u043d\u0430 \u0431\u043e\u0435\u0432\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435. \u041d\u0430\u0448\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u2014 \u0442\u043e\u0447\u043d\u043e \u0443\u0437\u043d\u0430\u0442\u044c, \u0447\u0442\u043e \u043d\u0438 \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u044d\u0442\u0430\u043f\u043e\u0432 \u043c\u044b <code>\u043d\u0435 \u0437\u0430\u0444\u0430\u043a\u0430\u043f\u0438\u043b\u0438<\/code>, \u0438 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445 \u043c\u043e\u0436\u0435\u043c \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e <code>\u043f\u043e\u0447\u0438\u043b\u0438\u0442\u044c<\/code>, \u0430 \u043d\u0435 \u0441\u0438\u0434\u0435\u0442\u044c \u0437\u0430 <code>\u043a\u043e\u043c\u043f\u0443\u0442\u0435\u0440\u043e\u043c<\/code> \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u0443\u0441\u043e\u0432\u043e\u0447\u043a\u0438 \u0441 <code>\u0431\u0435\u0441\u0442\u0444\u0440\u0435\u043d\u0434\u0430\u043c\u0438<\/code>.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ur\/yn\/yi\/urynyiz267yn8iu5bbtiswxjdec.jpeg\"><\/p>\n<h1>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435<\/h1>\n<p>  \u0412 \u0442\u0435\u043e\u0440\u0438\u0438 \u0432\u0441\u0451 \u0433\u043b\u0430\u0434\u043a\u043e: \u0442\u0435\u0441\u0442\u044b \u043f\u0438\u0448\u0443\u0442\u0441\u044f, \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0434\u0435\u043f\u043b\u043e\u044f\u0442\u0441\u044f, <s>\u043b\u0430\u0432\u044d\u0445\u0430 \u043c\u0443<\/s> \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u044b\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u044b \u043f\u043b\u0430\u0442\u044f\u0442 \u0434\u0435\u043d\u044c\u0433\u0438 = \u043f\u0440\u043e\u0444\u0438\u0442. \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b\u2026 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0432 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0431\u044b\u043b\u043e \u043e\u0437\u0432\u0443\u0447\u0435\u043d\u043e \u0432\u044b\u0448\u0435.<\/p>\n<p>  \u0417\u0434\u0435\u0441\u044c-\u0442\u043e, \u043c\u043e\u0439 \u0434\u043e\u0440\u043e\u0433\u043e\u0439 \u0434\u0440\u0443\u0433, \u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0433\u0435\u0440\u043e\u044f. \u041f\u043e\u0437\u0432\u043e\u043b\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u0435\u0431\u0435 \u043c\u043e\u043b\u043e\u0434\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430\u2026 \u0411\u043e\u043b\u044c\u0448\u043e\u0439 \u041a\u0440\u0438\u0441. <\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/da\/jk\/he\/dajkhesr8rc_qnzyyepwagfng6s.jpeg\"><\/p>\n<p>  \u0424\u043e\u0442\u043e \u0441\u0442\u0430\u0440\u043e\u0435, \u0438\u0437 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0436\u0438\u0437\u043d\u0438 \u041a\u0440\u0438\u0441\u0430. \u041d\u0435 \u043f\u0435\u0440\u0435\u0436\u0438\u0432\u0430\u0439, \u0411\u043e\u043b\u044c\u0448\u043e\u0439 \u041a\u0440\u0438\u0441 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u044b\u0439 \u043f\u0430\u0440\u0435\u043d\u044c, \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u043e\u0442\u0441\u0438\u0434\u0435\u0432\u0448\u0438\u0439 \u0437\u0430 \u0443\u0433\u043e\u043d \u0430\u0432\u0442\u043e\u043c\u043e\u0431\u0438\u043b\u044f \u0441 \u043e\u0442\u044f\u0433\u0447\u0430\u044e\u0449\u0438\u043c\u0438 \u043e\u0431\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430\u043c\u0438. \u041a\u0440\u0438\u0441 \u0440\u0435\u0448\u0438\u043b, \u0447\u0442\u043e \u0441\u0442\u043e\u0438\u0442 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0432\u043e\u044e \u0436\u0438\u0437\u043d\u044c \u0438 \u0432\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u043d\u0430 \u043f\u0443\u0442\u044c \u0438\u0441\u0442\u0438\u043d\u043d\u044b\u0439, \u0441\u0442\u0430\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u043c. \u041d\u0443, \u043d\u0435 \u0442\u0430\u043a\u0441\u043e\u0432\u0430\u0442\u044c \u0436\u0435 \u0432\u0441\u044e \u0436\u0438\u0437\u043d\u044c, \u0432 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435? \u0420\u0435\u043a\u043b\u0430\u043c\u0430 \u0432 <code>\u042e\u0442\u0443\u0431\u0447\u0438\u043a\u0435<\/code> \u0442\u0430\u043a \u0438 \u0442\u0440\u0443\u0431\u0438\u0442, \u0447\u0442\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u044b \u043e\u0447\u0435\u043d\u044c \u043d\u0443\u0436\u043d\u044b, \u0438 \u0434\u0435\u043d\u044c\u0436\u0430\u0442\u0430 \u0443 \u043d\u0438\u0445, \u0432\u0440\u043e\u0434\u0435 \u0431\u044b, \u0432\u043e\u0434\u044f\u0442\u0441\u044f. \u0412\u043e\u0442 \u0438 \u0440\u0435\u0448\u0438\u043b \u041a\u0440\u0438\u0441, \u0447\u0442\u043e \u043b\u0443\u0447\u0448\u0435 \u0434\u0435\u043b\u0430\u0442\u044c \u0445\u043e\u0440\u043e\u0448\u0438\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0435 \u0432\u0435\u0449\u0438, \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0443\u043c\u043d\u044b\u043c\u0438 \u043b\u044e\u0434\u044c\u043c\u0438 \u0438 \u0437\u0430\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0434\u0435\u043d\u044c\u0433\u0438. \u0418\u043d\u0430\u0447\u0435 \u0437\u0430\u0447\u0435\u043c \u0442\u044b \u0432\u043e\u043e\u0431\u0449\u0435 \u0447\u0438\u0442\u0430\u0435\u0448\u044c \u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e?<\/p>\n<p>  \u0418\u0437\u0443\u0447\u0438\u043b \u043e\u043d \u043f\u0430\u0440\u043e\u0447\u043a\u0443 \u043e\u043d\u043b\u0430\u0439\u043d-\u043a\u0443\u0440\u0441\u043e\u0432, \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043b \u00ab\u0427\u0438\u0441\u0442\u044b\u0439 \u043a\u043e\u0434\u00bb \u0420\u043e\u0431\u0435\u0440\u0442\u0430 \u041c\u0430\u0440\u0442\u0438\u043d\u0430, \u043f\u0440\u043e\u0448\u0451\u043b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0439 \u043d\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u044e Java Junior Developer, \u0438 \u0431\u044b\u043b \u043f\u0440\u0438\u043d\u044f\u0442 \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0443. \u0412 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044b\u0439 \u0434\u0435\u043d\u044c \u041a\u0440\u0438\u0441 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u043c\u043e\u043b\u043e\u0434\u044b\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c. \u0415\u043c\u0443 \u0433\u043e\u0432\u043e\u0440\u044f\u0442: \u00ab\u0412\u043e\u0442 \u0442\u0435\u0431\u0435 \u043d\u0430\u0448 \u043f\u0440\u043e\u0435\u043a\u0442. \u041c\u043e\u0436\u0435\u0448\u044c \u0441 \u043d\u0438\u043c \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f\u00bb.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/40f\/ff2\/846\/40fff28462c5f67ab2f0694dac0247e4.png\"><\/div>\n<p>  \u041a\u0440\u0438\u0441 \u0432\u0438\u0434\u0438\u0442, \u0447\u0442\u043e \u043f\u0440\u043e\u0435\u043a\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 Git, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u0435\u0433\u043e \u043d\u0430 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439:<\/p>\n<pre><code class=\"plaintext\">git pull https:\/\/internet.com\/any-repo\/money-transfer.git <\/code><\/pre>\n<p>  \u0417\u0430\u0442\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u041e\u0431\u044b\u0447\u043d\u043e \u044d\u0442\u043e \u043b\u0438\u0431\u043e Gradle, \u043b\u0438\u0431\u043e Maven:<\/p>\n<pre><code class=\"plaintext\">$ .\/gradlew clean build $ .\/mvnw clean package <\/code><\/pre>\n<p>  \u041d\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0442 \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043e\u0448\u0438\u0431\u043a\u0438:<\/p>\n<pre><code class=\"plaintext\">Tests in error:  restorePasswordByCall_Phone(uk.bank.services.UserServiceTest): PreparedStatementCallback; SQL [INSERT INTO authorities(user_id, authority) VALUES (?, ?)]; ERROR: deadlock detected(..)  restorePasswordByCall_Phone(uk.bank.services.UserServiceTest): StatementCallback; uncategorized SQLException for SQL [truncate users cascade]; SQL state [25P02]; error code [0]; ERROR: current transaction is aborted, commands ignored until end of transaction block; nested exception is org.postgresql.util.PSQLException: ERROR: current transaction is aborted, commands ignored until end of transaction block  getUsersAuthoritiesShouldGetMapRoles(uk.bank.services.UserRoleServiceTest): StatementCallback; SQL [truncate users cascade]; ERROR: deadlock detected(..)  getUsersAuthoritiesShouldGetMapRoles(uk.bank.services.UserRoleServiceTest): StatementCallback; uncategorized SQLException for SQL [truncate authorities cascade]; SQL state [25P02]; error code [0]; ERROR: current transaction is aborted, commands ignored until end of transaction block; nested exception is org.postgresql.util.PSQLException: ERROR: current transaction is aborted, commands ignored until end of transaction block <\/code><\/pre>\n<p>  \u0415\u0441\u043b\u0438 \u043f\u0440\u0438\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c\u0441\u044f, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c:<\/p>\n<pre><code class=\"plaintext\">ERROR: current transaction is aborted, commands ignored until end of transaction block <\/code><\/pre>\n<p>  \u041f\u043e\u044f\u0441\u043d\u044e: \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u043e \u043e\u0448\u0438\u0431\u043a\u0443 \u0432 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u043b\u043e \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0434\u0430\u043b\u044c\u0448\u0435.<\/p>\n<p>  \u041a\u0440\u0438\u0441 \u0445\u043c\u0443\u0440\u0438\u0442 \u0431\u0440\u043e\u0432\u0438, \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043a \u043a\u043e\u043c\u0443-\u0442\u043e \u0438\u0437 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0438 \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442: \u00ab\u0427\u0442\u043e \u044d\u0442\u043e \u0442\u0430\u043a\u043e\u0435?\u00bb. \u0415\u043c\u0443 \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0442: \u00ab\u041a\u0430\u043a\u0430\u044f-\u0442\u043e \u0441\u0442\u0440\u0430\u043d\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439 \u0435\u0449\u0451 \u0440\u0430\u0437\u00bb.<\/p>\n<p>  \u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u21162. \u0412\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0434\u0440\u0443\u0433\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430:<\/p>\n<pre><code class=\"plaintext\">Caused by: org.postgresql.util.PSQLException: Connection to 172.18.18.18:5463 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP\/IP connections.   at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:247) <\/code><\/pre>\n<p>  \u041a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0437\u0434\u0435\u0441\u044c:<\/p>\n<pre><code class=\"plaintext\">PSQLException: Connection to 172.18.18.18:5463 <\/code><\/pre>\n<p>  \u041f\u043e\u044f\u0441\u043d\u044e: \u043d\u0430 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u043f\u0440\u043e\u043f\u0430\u043b\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441 VPN. \u041a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f\u0445 \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044f\u044f \u0441\u0435\u0442\u044c, \u0438 \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u043a \u043d\u0435\u0439 \u0438\u0434\u0451\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435. \u0422\u0430\u043a \u0431\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0435\u0442\u0438 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438. \u0418 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438 \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0431\u044b\u0442\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u043c \u043a VPN. \u041a\u0440\u0438\u0441 \u0441 \u043f\u0440\u0435\u0436\u043d\u0438\u043c \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u043c \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043a \u043a\u043e\u043c\u0430\u043d\u0434\u0435. \u0415\u043c\u0443 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e\u0442 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0432 \u0442\u0440\u0435\u0442\u0438\u0439 \u0440\u0430\u0437. <\/p>\n<p>  \u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u21163. \u041f\u0440\u043e\u0435\u043a\u0442 \u0441\u043e\u0431\u0440\u0430\u043b\u0441\u044f, \u0434\u0430\u0436\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b\u0441\u044f \u0447\u0435\u0440\u0435\u0437 VPN \u043a \u043a\u0430\u043a\u043e\u043c\u0443-\u0442\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0443. \u0418 \u0442\u0443\u0442 \u0432\u044b\u043b\u0435\u0442\u0430\u0435\u0442 \u043d\u043e\u0432\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430:<\/p>\n<pre><code class=\"plaintext\">14:34:51.127 [XNIO-2 task-4] ERROR uk.bank.controllers.ControllerV1Test name=createUser - exception, \/v1\/users java.lang.IllegalStateException: error parse person for user: 32000140   at uk.bank.services.PersonClient.parsePersonData(PersonClient.java:173) <\/code><\/pre>\n<p>  \u041e\u0431\u0440\u0430\u0449\u0430\u0435\u043c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435:<\/p>\n<pre><code class=\"plaintext\">java.lang.IllegalStateException: error parse person for user <\/code><\/pre>\n<p>  \u041f\u043e\u044f\u0441\u043d\u044e: \u043d\u0430 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u0442\u0435\u0441\u0442\u044b \u043e\u0431\u0440\u0430\u0449\u0430\u044e\u0442\u0441\u044f \u043a \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0432\u043d\u0435\u0448\u043d\u0435\u043c\u0443 \u0441\u0435\u0440\u0432\u0438\u0441\u0443 <code>Person<\/code>, \u0430 \u0442\u043e\u0442, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u0431\u044b\u043b \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d, \u0438 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0435\u0440\u043d\u0443\u043b\u0430\u0441\u044c \u043e\u0448\u0438\u0431\u043a\u0430 <code>500 Internal Server Error<\/code>.<\/p>\n<p>  \u0412 \u0433\u043e\u043b\u043e\u0432\u0435 \u041a\u0440\u0438\u0441\u0430 \u0441\u0442\u0430\u043b \u043a\u0440\u0443\u0442\u0438\u0442\u044c\u0441\u044f \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0432\u043e\u043f\u0440\u043e\u0441: \u00ab\u041a\u0430\u043a\u043e\u0433\u043e \u0445@#?!\u00bb. \u0425\u043e\u0442\u044c \u0438 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u0434\u0440\u0430\u0436\u0451\u043d\u043d\u044b\u0439, \u043e\u043d \u043d\u0435 \u0441\u0442\u0430\u043b \u043e\u0437\u0432\u0443\u0447\u0438\u0432\u0430\u0442\u044c \u0435\u0433\u043e, \u0438 \u043f\u043e \u043f\u0440\u0438\u0432\u044b\u0447\u043a\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b \u0441\u0431\u043e\u0440\u043a\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0437\u0430\u043d\u043e\u0432\u043e. \u0410\u043b\u043b\u0438\u043b\u0443\u0439\u044f, \u043d\u0430 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u0432\u0441\u0451 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c!<\/p>\n<pre><code class=\"plaintext\">Results :  Tests run: 278, Failures: 0, Errors: 0, Skipped: 5  ...  [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time:  01:12 min [INFO] Finished at: 2020-10-18T14:10:03+03:00 [INFO] ------------------------------------------------------------------------ <\/code><\/pre>\n<p>  \u0418\u0442\u043e\u0433: \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0434\u0435\u043d\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0447\u0430\u043b\u0441\u044f, \u0430 \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u0443\u0436\u0435 \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0441\u044f \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u043d\u0430 \u0440\u043e\u0432\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435. \u00ab\u0421\u0442\u0430\u0440\u0438\u0447\u043a\u0438\u00bb \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u043b\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0435, \u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u043b\u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0441\u0431\u043e\u0440\u043a\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u043e\u043d\u0430 \u043d\u0435 \u043f\u0440\u043e\u0439\u0434\u0451\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e. \u00ab\u0423 \u043c\u0435\u043d\u044f \u0432\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0442\u044b \u0447\u0442\u043e-\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0448\u044c \u043d\u0435 \u0442\u0430\u043a\u00bb, \u2014 \u0431\u044b\u043b\u043e \u0438\u0445 \u043e\u0431\u044b\u0447\u043d\u044b\u043c \u043e\u0442\u0432\u0435\u0442\u043e\u043c. \u0412\u044b \u0434\u0443\u043c\u0430\u0435\u0442\u0435, \u044d\u0442\u043e \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043f\u0440\u0438\u043a\u043e\u043b \u0438 \u0442\u0430\u043a\u043e\u0433\u043e \u043d\u0435 \u0431\u044b\u0432\u0430\u0435\u0442 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u0436\u0438\u0437\u043d\u0438? <\/p>\n<p>  <strong>\u0412\u043e\u0442 \u0438 \u0411\u043e\u043b\u044c\u0448\u043e\u0439 \u041a\u0440\u0438\u0441 \u043f\u043e\u0434\u0443\u043c\u0430\u043b, \u0447\u0442\u043e \u0441\u0442\u0430\u043b \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u043e\u043c \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0448\u0443\u0442\u043a\u0438, \u0437\u0430\u0431\u0430\u0432\u044b \u0438\u043b\u0438 \u00ab\u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0438\u044f\u00bb, \u043a\u0430\u043a \u043a\u043e\u0433\u0434\u0430-\u0442\u043e \u0432 \u0430\u0440\u043c\u0438\u0438 \u0431\u044b\u0432\u0430\u043b\u043e. \u042d\u0442\u043e \u0431\u044b\u043b\u043e \u043f\u0435\u0440\u0432\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b.<\/strong><\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/su\/vs\/c9\/suvsc9dqlskwkx-m7bmofwgp14k.jpeg\"><\/p>\n<p>  \u0414\u043e\u0440\u043e\u0433\u043e\u0439 \u0434\u0440\u0443\u0433, \u0430 \u0447\u0442\u043e \u0431\u044b \u0442\u044b \u0441\u0434\u0435\u043b\u0430\u043b \u043d\u0430 \u043c\u0435\u0441\u0442\u0435 \u0411\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u041a\u0440\u0438\u0441\u0430? \u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442: \u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0442\u0435\u0441\u0442\u044b \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435. \u042d\u0442\u043e \u043f\u0435\u0440\u0432\u043e\u0435, \u0441 \u0447\u0435\u043c \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u043b\u044e\u0431\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0443 \u043d\u0430\u0434 \u043d\u043e\u0432\u044b\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c. \u0422\u0430\u043a \u043a\u0430\u043a \u0438\u043c\u0435\u043d\u043d\u043e \u0441 \u043d\u0438\u043c\u0438 \u0443 \u041a\u0440\u0438\u0441\u0430 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0438 \u043f\u0435\u0440\u0432\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u0442\u043e \u044d\u0442\u043e \u0432\u043f\u043e\u043b\u043d\u0435 \u043b\u043e\u0433\u0438\u0447\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435. \u0418\u0442\u0430\u043a, \u0432\u0437\u0433\u043b\u044f\u043d\u0435\u043c\u2026<\/p>\n<pre><code class=\"java\">@Test public void find_user_by_phone_error() {    when(userServiceV2.findUserByPhoneAndMail(PHONE, EMAIL))            .thenReturn(null);    when(userServiceV2.findUserByPhoneAndMailIsNull(PHONE))            .thenReturn(null);     mockMvc.perform(get(END_POINT)            .param(&quot;phone&quot;, PHONE)            .param(&quot;email&quot;, EMAIL)            .accept(APPLICATION_JSON)            .contentType(APPLICATION_JSON))            .andDo(print())            .andExpect(status().isBadRequest())            .andExpect(content().contentType(&quot;application\/json;charset=UTF-8&quot;))            .andExpect(jsonPath(&quot;$.success&quot;, is(false)))            .andExpect(jsonPath(&quot;$.errors[0].code&quot;, is(ErrorDTO.PHONE_ALREADY_IN_USE.getCode())))            .andExpect(jsonPath(&quot;$.errors[0].userMessage&quot;, containsString(&quot;\u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 \u043f\u0430\u0440\u043e\u043b\u044c&quot;))); }  @Test public void testCarlineService() {    RestTemplate restTemplate = new RestTemplate();    UserWrap userWrap = new UserWrap();    userWrap.setTransactId(&quot;tran123&quot;);    userWrap.setId(123L);    HttpEntity&lt;UserWrap&gt; entity = new HttpEntity&lt;&gt;(userWrap);    ResponseEntity&lt;UserWrap&gt; response = restTemplate.exchange(portalSbernedHost + unitUrl, HttpMethod.POST, entity, UserWrap.class);    System.out.println(&quot;response: &quot; + response.getStatusCode()); } <\/code><\/pre>\n<p>  \u0414\u0432\u0443\u0445 \u043f\u0435\u0440\u0432\u044b\u0445 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0438 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u043a \u043f\u0440\u043e\u0435\u043a\u0442\u0443:  <\/p>\n<ul>\n<li><strong>\u041a\u0430\u043a\u0438\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435?<\/strong><br \/>   \u0412 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0438 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0430 \u0441\u043b\u043e\u0432\u0430 \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f <code>\u043f\u043e\u0434\u0447\u0451\u0440\u043a\u0438\u0432\u0430\u043d\u0438\u0435\u043c<\/code>, \u0432 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0438 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0430 \u043a\u0430\u0436\u0434\u043e\u0435 \u043d\u043e\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 <code>\u043f\u0440\u043e\u043f\u0438\u0441\u043d\u043e\u0439 \u0431\u0443\u043a\u0432\u044b<\/code>. \u0418 \u043f\u043e\u0445\u043e\u0436\u0435 (\u043f\u043e \u0434\u0440\u0443\u0433\u0438\u043c \u0442\u0435\u0441\u0442\u0430\u043c), \u0447\u0442\u043e \u0432\u0441\u0435\u0445 \u0432\u0441\u0451 \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442.   <\/li>\n<li><strong>\u0427\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u0442\u0435\u0441\u0442\u0430\u0445: MockMvc, \u0438\u043b\u0438 RestTemplate, \u0438\u043b\u0438 TestRestTemplate?<\/strong><br \/>   \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430 Java \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Spring Framework. <br \/>  \u0415\u0441\u0442\u044c <code>RestTemplate<\/code>, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0432 \u0431\u043e\u0435\u0432\u043e\u043c \u043a\u043e\u0434\u0435 \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043f\u043e HTTP. <code>TestRestTemplate<\/code> \u2014 \u044d\u0442\u043e \u043e\u0431\u0451\u0440\u0442\u043a\u0430 \u043d\u0430\u0434 <code>RestTemplate<\/code> \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u0442\u0435\u0441\u0442\u0430\u0445, \u043d\u0435 \u0431\u0440\u043e\u0441\u0430\u044e\u0449\u0430\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u043a\u043e\u0434\u0430 \u043e\u0448\u0438\u0431\u043a\u0438 <code>5xx<\/code>. <br \/>  <code>MockMVC<\/code> \u0441\u043e\u0437\u0434\u0430\u043d \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u043e\u043b\u044c\u043a\u043e web-\u0441\u043b\u043e\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u0430. \u041e\u0431\u0430 \u0442\u0435\u0441\u0442\u0430 \u0431\u044b\u043b\u0438 \u0432 \u043e\u0434\u043d\u043e\u043c \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435. \u041d\u0435\u0445\u043e\u0440\u043e\u0448\u043e \u043a\u0430\u043a-\u0442\u043e.   <\/li>\n<li><strong>\u041f\u043e\u0447\u0435\u043c\u0443 \u0432 \u0442\u0435\u0441\u0442\u0430\u0445 \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f?<\/strong><br \/>   \u0412\u0441\u0451 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a, \u0441\u043b\u043e\u0432\u043d\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u043f\u0438\u0448\u0435\u0442 \u0442\u0435\u0441\u0442\u044b \u043a\u0430\u043a \u0435\u043c\u0443 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f, \u0438\u043b\u0438 \u043a\u0430\u043a \u0443 \u043d\u0435\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0438\u0445 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c, \u0431\u0435\u0437 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043e\u0431\u0449\u0438\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432 \u0438 code review.   <\/li>\n<li><strong>\u0415\u0441\u0442\u044c \u043b\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 <code>mock<\/code>\/<code>spy<\/code>-\u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438?<\/strong><br \/>   \u0412 \u043f\u0435\u0440\u0432\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435 \u0435\u0441\u0442\u044c \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0441\u043b\u043e\u0432\u0430 <code>when<\/code> \u0438 <code>thenReturn<\/code>. \u0422\u043e \u0435\u0441\u0442\u044c \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442, \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u043a\u0438\u0439 \u043c\u0435\u0442\u043e\u0434. \u041c\u044b \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043e\u0431\u043c\u0430\u043d\u043a\u0443, \u0433\u043e\u0432\u043e\u0440\u044f, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 <code>M<\/code>, \u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>N<\/code>. \u041e\u0434\u043d\u0430\u043a\u043e \u0432 \u043a\u043e\u043d\u0446\u0435 \u0442\u0435\u0441\u0442\u0430 \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u044d\u0442\u0438\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043b\u0438 \u043e\u043d\u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u043b\u0438\u0441\u044c, \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043b\u0438 \u043c\u044b \u0432\u0435\u0440\u043d\u0443\u043b\u0438 \u0442\u043e, \u0447\u0442\u043e \u043e\u0436\u0438\u0434\u0430\u043b\u0438.  <\/li>\n<li><strong>\u0412 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <code>null<\/code><\/strong><br \/>   \u0412 \u044d\u0442\u043e\u043c \u043d\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u0445\u043e\u0440\u043e\u0448\u0435\u0433\u043e. \u041f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u043d\u0438\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u043c\u043d\u043e\u0433\u0438\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u0438 \u0435\u0441\u043b\u0438 \u043c\u043e\u0436\u043d\u043e, \u0442\u043e \u043b\u0443\u0447\u0448\u0435 \u0443\u0439\u0442\u0438 \u043e\u0442 \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 <code>null<\/code> \u2014 \u044f\u0432\u043d\u044b\u0439 \u043f\u0440\u0438\u0437\u043d\u0430\u043a \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0438 \u0432 \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043e\u043d \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f. \u041f\u0430\u0445\u043d\u0435\u0442 \u043f\u043b\u043e\u0445\u0438\u043c \u043a\u043e\u0434\u043e\u043c.   <\/li>\n<li><strong>\u0415\u0441\u0442\u044c \u043b\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0432\u044b\u0432\u043e\u0434\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043d\u0430 \u043f\u0435\u0447\u0430\u0442\u044c?<\/strong><br \/>   \u0412 \u0442\u0435\u043a\u0441\u0442\u0435 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>System.out.println<\/code> \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u043e\u043c HTTP-\u043a\u043e\u0434\u0435. \u042d\u0442\u043e \u043d\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0445\u043e\u0440\u043e\u0448\u0435\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u043b\u0443\u0447\u0448\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043b\u043e\u0433\u0430\u043c\u0438. \u0422\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0438 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e: \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u043b\u0438\u0448\u044c \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u044f \u0438 \u043e\u0448\u0438\u0431\u043a\u0438 (<code>warn<\/code>), \u0447\u0442\u043e-\u0442\u043e \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u043e\u0442\u043b\u0430\u0434\u043a\u0438 (<code>debug<\/code>). \u0417\u0434\u0435\u0441\u044c \u0436\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u043d\u0435\u0442, \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0435\u043a\u0441\u0442 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u0438.<br \/>   \u0412\u044b \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442\u0435, \u0447\u0442\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0433\u043b\u0430\u0437\u0430\u043c\u0438 \u0432\u044b\u0432\u043e\u0434 \u043d\u0430 \u043f\u0435\u0447\u0430\u0442\u044c \u2014 \u044d\u0442\u043e \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0442\u0435\u0441\u0442\u0435? \u041d\u0435\u0442 \u043d\u0438 <code>assertEquals<\/code>, \u043d\u0438 <code>assertTrue<\/code>. \u041e\u0447\u0435\u043d\u044c \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u0439 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u043c\u0435\u0442\u043e\u0434, \u0437\u0430\u0447\u0435\u043c \u0432\u043e\u043e\u0431\u0449\u0435 \u043e\u043d \u043d\u0443\u0436\u0435\u043d, \u0435\u0441\u043b\u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0438 \u043d\u0435 \u0434\u0430\u0451\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0439 \u0441\u0432\u044f\u0437\u0438?   <\/li>\n<\/ul>\n<p>  <b>\u0412\u044b\u0432\u043e\u0434\u044b<\/b><br \/>  \u041a\u0430\u0436\u0434\u044b\u0439 \u043d\u043e\u0432\u044b\u0439 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u043c\u043e\u0436\u0435\u0442:   <\/p>\n<ul>\n<li>\u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043f\u043b\u043e\u0445\u043e\u0439 \u043a\u043e\u0434 \u0432 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u0430\u0445;<\/li>\n<li>\u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0442\u0435\u0441\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442;<\/li>\n<li>\u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0442\u0435\u0441\u0442\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u043f\u043b\u043e\u0445\u043e \u2014 \u0437\u043d\u0430\u0447\u0438\u0442, \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438 \u0432 \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430.<\/li>\n<\/ul>\n<p>  <b>\u0412\u043e\u043f\u0440\u043e\u0441\u044b<\/b>  <\/p>\n<ul>\n<li>\u041a\u0442\u043e \u0432\u0441\u0451 \u044d\u0442\u043e \u043f\u0438\u0441\u0430\u043b?<\/li>\n<li>\u041a\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b \u0432\u0441\u0451 \u044d\u0442\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c?<\/li>\n<\/ul>\n<p>  \u0414\u043e\u0440\u043e\u0433\u043e\u0439 \u0434\u0440\u0443\u0433, \u044d\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u0440\u0430\u0434\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u044f \u043d\u0430\u0447\u0430\u043b \u043f\u0438\u0441\u0430\u0442\u044c \u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0411\u043e\u043b\u044c\u0448\u043e\u0439 \u041a\u0440\u0438\u0441 \u043f\u0440\u0438\u0448\u0451\u043b \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u043e\u0432, \u043d\u0430 \u043f\u0440\u043e\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u044b \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438. \u041e\u043d \u043c\u043e\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043d \u043d\u0430\u0447\u0430\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u0436\u0438\u0437\u043d\u044c, \u043e\u0431\u0440\u0435\u0441\u0442\u0438 \u043d\u043e\u0432\u044b\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u0430, \u043f\u0435\u0440\u0435\u043d\u044f\u0442\u044c \u043e\u043f\u044b\u0442 \u0443\u043c\u043d\u044b\u0445 \u043b\u044e\u0434\u0435\u0439. \u0427\u0442\u043e \u041a\u0440\u0438\u0441 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b \u0432 \u0438\u0442\u043e\u0433\u0435?<\/p>\n<p>  <b>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u21161<\/b><br \/>  \u041f\u0440\u043e\u0435\u043a\u0442 \u00ab\u0418\u041a\u0421\u00bb \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u00ab\u0420\u043e\u0433\u0430 \u0438 \u041a\u043e\u043f\u044b\u0442\u0430\u00bb \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u0435\u043d. \u041e\u043d \u043f\u0440\u0438\u043d\u043e\u0441\u0438\u0442 \u0434\u0435\u043d\u044c\u0433\u0438 \u043e\u0441\u043d\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c \u0431\u0438\u0437\u043d\u0435\u0441\u0430, \u043a\u043e\u0440\u043c\u0438\u0442 \u0441\u0430\u043c\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u043d\u0435\u0434\u0440\u044f\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u044b, \u0435\u0449\u0451 \u043d\u0435 \u0434\u043e\u0441\u0442\u0438\u0433\u0448\u0438\u0435 \u0431\u0435\u0437\u0443\u0431\u044b\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438. \u041a\u0430\u043a \u044f \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u043b \u0440\u0430\u043d\u0435\u0435, \u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0442\u0438\u0432\u0435 \u0443\u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044b, \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043d\u0438\u0445 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043e \u0441\u0432\u043e\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u043e\u0439 \u0438 \u0437\u0430 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0435 \u0441\u0440\u043e\u043a\u0438 \u0432\u043d\u0435\u0434\u0440\u044f\u0435\u0442 \u043d\u043e\u0432\u044b\u0435 \u0444\u0438\u0447\u0438, \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u0448\u0438\u0435 \u0431\u0430\u0433\u0438. \u0422\u0430\u043a\u043e\u0439 \u0440\u0435\u0436\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u0441\u0442\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c, \u0430 \u0434\u0430\u0436\u0435 \u043f\u0440\u043e\u0435\u043a\u0442 \u0438\u0437\u0443\u0447\u0438\u0442\u044c. \u041a\u0430\u043a \u0438\u0442\u043e\u0433, \u043e\u0431\u0449\u0435\u0435 \u0434\u0435\u043b\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043b\u043e\u0441\u043a\u0443\u0442\u043d\u043e\u0435 \u043e\u0434\u0435\u044f\u043b\u043e.<\/p>\n<p>  <b>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u21162<\/b><br \/>  \u0423 \u0411\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u041a\u0440\u0438\u0441\u0430 \u0435\u0449\u0451 \u043c\u0430\u043b\u043e \u043e\u043f\u044b\u0442\u0430, \u0438 \u043e\u043d \u043d\u0435 \u0437\u043d\u0430\u0435\u0442, \u0447\u0442\u043e \u043a\u0443\u043b\u044c\u0442\u0443\u0440\u0430 \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u043d\u0435 \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0430, \u0430 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u0438\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u044b: \u0435\u0433\u043e \u043c\u043d\u0435\u043d\u0438\u0435, \u043a\u0430\u043a \u043c\u043e\u043b\u043e\u0434\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430, \u043d\u0438\u043a\u043e\u043c\u0443 \u043d\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e. <\/p>\n<p>  \u2014 \u042f \u0432\u0438\u0436\u0443, \u0447\u0442\u043e \u0442\u0435\u0441\u0442\u044b \u043d\u0435 \u043f\u043e\u043c\u043e\u0433\u0443\u0442 \u043c\u043d\u0435 \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u0440\u043e\u0435\u043a\u0442, \u043e\u043d\u0438 \u0441\u0430\u043c\u0438 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442, \u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u044e\u0442. \u041c\u043e\u0436\u0435\u0442, \u043f\u0440\u043e\u0432\u0435\u0434\u0451\u043c \u043e\u0431\u0449\u0443\u044e \u0432\u0441\u0442\u0440\u0435\u0447\u0443 \u0434\u043b\u044f \u0432\u0441\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b? \u042f \u0447\u0438\u0442\u0430\u043b \u0432 \u043e\u0434\u043d\u043e\u0439 \u043a\u043d\u0438\u0433\u0435\u2026 \u2014 \u043d\u0430\u0447\u0430\u043b \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u0411\u043e\u043b\u044c\u0448\u043e\u0439 \u041a\u0440\u0438\u0441<\/p>\n<p>  \u2014 \u0421\u043b\u0443\u0448\u0430\u0439, \u044f \u0441\u0435\u0439\u0447\u0430\u0441 \u0437\u0430\u043d\u044f\u0442. \u0414\u0430\u0432\u0430\u0439 \u043f\u043e\u0437\u0436\u0435, \u0438\u043b\u0438 \u043e\u0431\u0440\u0430\u0442\u0438\u0441\u044c \u043a \u0442\u0438\u043c\u043b\u0438\u0434\u0443, \u2014 \u043e\u0442\u0432\u0435\u0442\u0438\u043b product owner \u043f\u0440\u043e\u0435\u043a\u0442\u0430.<\/p>\n<p>  \u2014 \u041d\u0435 \u0434\u0443\u043c\u0430\u044e, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u2014 \u043e\u0442\u0432\u0435\u0442\u0438\u043b \u0442\u0438\u043c\u043b\u0438\u0434.<\/p>\n<p>  \u2014 \u041d\u043e \u0442\u0435\u0441\u0442\u044b \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u043e\u0447\u0435\u043d\u044c \u0441\u0442\u0440\u0430\u043d\u043d\u043e. \u041c\u043e\u0436\u0435\u0442 \u043c\u043d\u0435 \u043a\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u043f\u043e\u043c\u043e\u0447\u044c? \u2014 \u0432\u044b\u043f\u0430\u043b\u0438\u043b \u041a\u0440\u0438\u0441, \u043d\u0435 \u0441\u0434\u0435\u0440\u0436\u0430\u0432\u0448\u0438\u0441\u044c.<\/p>\n<p>  \u2014 \u0422\u044b \u0437\u0434\u0435\u0441\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0434\u0435\u043d\u044c \u0438 \u0443\u0436\u0435 \u0432\u0441\u0435\u043c \u043c\u0435\u0448\u0430\u0435\u0448\u044c. \u041c\u043e\u0436\u0435\u0448\u044c \u043d\u0435 \u043e\u0442\u0432\u043b\u0435\u043a\u0430\u0442\u044c \u043e\u0442 \u0440\u0430\u0431\u043e\u0442\u044b? \u2014 \u043e\u0442\u0432\u0435\u0442\u0438\u043b \u0435\u043c\u0443 Senior Certified Java Programmer.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/oe\/vf\/of\/oevfofxm7wrzcnquednudeiicxy.jpeg\" width=\"400\"><\/div>\n<p>  <strong>\u041a\u0440\u0430\u0442\u043a\u0438\u0439 \u0438 \u0451\u043c\u043a\u0438\u0439 \u0434\u0438\u0430\u043b\u043e\u0433. \u0411\u043e\u043b\u044c\u0448\u043e\u0439 \u041a\u0440\u0438\u0441 \u0432\u0441\u0451 \u0437\u0430\u043f\u043e\u043c\u043d\u0438\u043b. \u042d\u0442\u043e \u0441\u0442\u0430\u043b\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u043e\u0448\u0438\u0431\u043a\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b.<\/strong><\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/i1\/s6\/5d\/i1s65dgtjo5mre31scg1washv7g.jpeg\"><\/p>\n<p>  \u0416\u0435\u043b\u0430\u043d\u0438\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043b\u0443\u0447\u0448\u0435, \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0442\u044c \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0445\u043e\u0440\u043e\u0448\u0438\u0435 \u0442\u0435\u0441\u0442\u044b, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u044e\u0442\u0441\u044f:   <\/p>\n<ul>\n<li>\u043e \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u0434\u0430;<\/li>\n<li>\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c;<\/li>\n<li>\u043e \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0431\u044b\u0442\u044c \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u043c \u0432 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0438 \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0435\u0442 \u0442\u0435\u0441\u0442\u043e\u0432.<\/li>\n<\/ul>\n<p>  \u0414\u043e\u0440\u043e\u0433\u043e\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u0432\u043e\u0437\u0440\u0430\u0437\u0438\u0442\u044c, \u0447\u0442\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0442\u0435\u0441\u0442\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u043f\u0440\u0430\u0432\u0434\u0430\u043d\u043e:  <\/p>\n<ul>\n<li>\u0412\u0435\u0434\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430\u043c \u043d\u0435 \u0437\u0430 \u0442\u0435\u0441\u0442\u044b \u043f\u043b\u0430\u0442\u044f\u0442 \u0434\u0435\u043d\u044c\u0433\u0438, \u0430 \u0437\u0430 \u0444\u0438\u0447\u0438\u2026<\/li>\n<li>\u041d\u0430 \u0442\u0435\u0441\u0442\u044b \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u0430 \u0435\u0433\u043e \u043d\u0435\u0442 \u0438 \u043d\u0443\u0436\u043d\u043e \u0444\u0438\u0447\u0438 \u043f\u0438\u043b\u0438\u0442\u044c\u2026<\/li>\n<\/ul>\n<p>  <b>\u0412\u044b\u0432\u043e\u0434\u044b <\/b>  <\/p>\n<ul>\n<li>\u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 <strong>\u043d\u0435\u0442 \u043a\u0443\u043b\u044c\u0442\u0443\u0440\u044b<\/strong>, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442<strong> \u043d\u0435\u0442 \u0438 \u043f\u0440\u0430\u0432\u0438\u043b<\/strong>;<\/li>\n<li>\u0435\u0441\u043b\u0438 \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 <strong>\u043d\u0435\u0442 \u043f\u0440\u0430\u0432\u0438\u043b<\/strong>, \u0442\u043e <strong>\u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u043f\u043e\u0434\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0435\u043d<\/strong>;<\/li>\n<li>\u0435\u0441\u043b\u0438 \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 <strong>\u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u043f\u043e\u0434\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0435\u043d<\/strong>, \u0442\u043e \u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442\u0441\u044f <strong>\u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0434\u043e\u043b\u0433<\/strong>.<\/li>\n<\/ul>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/e4e\/9d9\/b8e\/e4e9d9b8ed0326b9c6bdb75d92313835.png\" width=\"300\"><\/div>\n<p>  \u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430\u043c \u043f\u043b\u0430\u0442\u044f\u0442 \u0434\u0435\u043d\u044c\u0433\u0438 \u0437\u0430 \u0444\u0438\u0447\u0438, \u0438 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043d\u0435\u0442 \u0442\u0435\u0441\u0442\u043e\u0432, \u0442\u043e \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u0435\u0442 \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043d\u043e\u0432\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0438, \u043a\u0430\u043a \u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435, \u043d\u0430 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0449\u0438\u0445 \u043e\u0448\u0438\u0431\u043e\u043a. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0444\u0438\u0447\u0438 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044e\u0442\u0441\u044f \u0432 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u0439 \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433 \u043a\u043e\u0434\u0430. \u041a\u0430\u043a \u0438\u0442\u043e\u0433, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u044b \u0442\u0440\u0430\u0442\u044f\u0442 \u0432\u0441\u0451 \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438\u2026 \u043d\u0430 <strong>\u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u0443\u043b\u0443\u0447\u0448\u0438\u0442 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u2026 \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 <strong>\u043d\u0435\u0442 \u043a\u0443\u043b\u044c\u0442\u0443\u0440\u044b<\/strong> \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430. \u041e\u0431\u0440\u0430\u0437\u0443\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u044b\u0439 <strong>\u0442\u0435\u0445\u0434\u043e\u043b\u0433<\/strong>. \u0426\u0438\u043a\u043b \u0437\u0430\u043c\u043a\u043d\u0443\u0442.<\/p>\n<p>  <b>\u0422\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0434\u043e\u043b\u0433<\/b> \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0435 \u0440\u0435\u0448\u0438\u043b\u0438 \u0432\u043e\u0432\u0440\u0435\u043c\u044f \u0438 \u043e\u0442\u043b\u043e\u0436\u0438\u043b\u0438 \u043d\u0430 \u0431\u0443\u0434\u0443\u0449\u0435\u0435. \u0421\u0435\u0439\u0447\u0430\u0441 \u043e\u043d \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0435\u043f\u044f\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432\u0432\u0435\u0434\u0435\u043d\u0438\u044e \u043d\u043e\u0432\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u043d\u043e \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u044f\u0432\u0438\u0442\u044c\u0441\u044f \u0432 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0435, \u0432 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0435, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0435\u043b\u044c\u0437\u044f \u0440\u0435\u0448\u0438\u0442\u044c \u0432\u043e\u0432\u0440\u0435\u043c\u044f \u0438 \u0431\u044b\u0441\u0442\u0440\u043e. \u041f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 (\u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435) \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u043b\u0433\u0430.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/829\/0ec\/9c5\/8290ec9c5a4ce0b306da323b5b52760e.png\" width=\"500\"><\/div>\n<p>  \u0414\u043e\u0440\u043e\u0433\u043e\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c, \u0435\u0441\u043b\u0438 \u0442\u044b \u0435\u0449\u0451 \u043d\u0435 \u043f\u043e\u043d\u044f\u043b, \u043e\u0431\u044a\u044f\u0441\u043d\u044e: \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u0442\u043e\u0440\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u044b\u0445 \u0447\u0430\u0441\u0442\u0435\u0439. \u041a\u043e\u043c\u0430\u043d\u0434\u0435, \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0449\u0435\u0439\u0441\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0432\u0430\u0436\u043d\u043e:  <\/p>\n<ul>\n<li>\u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c;<\/li>\n<li>\u0438 \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u043a\u043e\u0434 \u0442\u0435\u0441\u0442\u0430\u043c\u0438;<\/li>\n<li>\u0438 \u043f\u043e\u0432\u044b\u0448\u0430\u0442\u044c \u043a\u0443\u043b\u044c\u0442\u0443\u0440\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043b\u043b\u0435\u043a\u0442\u0438\u0432\u0430. <\/li>\n<\/ul>\n<p>  \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f \u0442\u0440\u0430\u0442\u0438\u0442 \u0434\u0435\u043d\u044c\u0433\u0438 \u043d\u0435 \u043d\u0430 \u0444\u0438\u0447\u0438, \u0430 \u043d\u0430 <code>\u043d\u0438\u0433\u0438\u043b\u0438\u0441\u0442\u043e\u0432<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0436\u0435\u043b\u0430\u044e\u0442 \u0431\u044b\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u044b\u043c\u0438 \u0438\u0433\u0440\u043e\u043a\u0430\u043c\u0438. \u0412\u0441\u0451, \u0447\u0442\u043e \u0438\u0445 \u043e\u043a\u0440\u0443\u0436\u0430\u0435\u0442, \u044d\u0442\u043e \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0434\u043e\u043b\u0433, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u043c \u043e\u0441\u0442\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0435\u0437\u0430\u043c\u0435\u043d\u0438\u043c\u044b\u043c\u0438. \u041e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0431\u0430\u0433\u0438, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0441\u0430\u043c\u0438 \u0438\u0445 \u0438 \u0441\u043e\u0437\u0434\u0430\u043b\u0438.<\/p>\n<p>  <b>\u041d\u0438\u0433\u0438\u043b\u0438\u0437\u043c<\/b> (\u043e\u0442 \u043b\u0430\u0442. nihil \u2014 \u043d\u0438\u0447\u0442\u043e) \u2014 \u0444\u0438\u043b\u043e\u0441\u043e\u0444\u0438\u044f, \u0441\u0442\u0430\u0432\u044f\u0449\u0430\u044f \u043f\u043e\u0434 \u0441\u043e\u043c\u043d\u0435\u043d\u0438\u0435 \u043e\u0431\u0449\u0435\u043f\u0440\u0438\u043d\u044f\u0442\u044b\u0435 \u0446\u0435\u043d\u043d\u043e\u0441\u0442\u0438, \u0438\u0434\u0435\u0430\u043b\u044b, \u043d\u043e\u0440\u043c\u044b \u043d\u0440\u0430\u0432\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u0438, \u043a\u0443\u043b\u044c\u0442\u0443\u0440\u0443. \u041d\u0438\u0433\u0438\u043b\u0438\u0437\u043c \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442 \u043e\u0442\u0440\u0438\u0446\u0430\u043d\u0438\u0435, \u043d\u0435\u0433\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u043a \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u043c, \u0438\u043b\u0438 \u0434\u0430\u0436\u0435 \u043a\u043e \u0432\u0441\u0435\u043c \u0441\u0442\u043e\u0440\u043e\u043d\u0430\u043c \u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0436\u0438\u0437\u043d\u0438.<\/p>\n<p>  <strong>\u00ab\u041d\u0435 \u0431\u0443\u0434\u044c \u043d\u0438\u0433\u0438\u043b\u0438\u0441\u0442\u043e\u043c Senior Certified Java-\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u043c\u00bb, \u2014 \u0441\u043a\u0430\u0437\u0430\u043b \u0431\u044b \u0418. \u0412. \u0422\u0443\u0440\u0433\u0435\u043d\u0435\u0432 \u0441\u0435\u0439\u0447\u0430\u0441. \u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u0441\u043f\u043e\u0439\u043b\u0435\u0440\u0438\u0442\u044c \u0441\u044e\u0436\u0435\u0442, \u0447\u0438\u0442\u0430\u0439\u0442\u0435 \u0435\u0433\u043e \u043a\u043d\u0438\u0433\u0443 \u00ab\u041e\u0442\u0446\u044b \u0438 \u0434\u0435\u0442\u0438\u00bb \u043e \u0415\u0432\u0433\u0435\u043d\u0438\u0438 \u0411\u0430\u0437\u0430\u0440\u043e\u0432\u0435.<\/strong><\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/jo\/1l\/4h\/jo1l4h4wi7yr5r3jspeuwmrb3ak.jpeg\"><\/p>\n<p>  \u0417\u0430\u0434\u0430\u0439\u0442\u0435\u0441\u044c \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u043c: \u00ab\u0415\u0441\u043b\u0438 \u0432\u0441\u0451 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0441\u0435\u0439\u0447\u0430\u0441, \u0431\u0443\u0434\u0435\u0442 \u043b\u0438 \u0442\u0430\u043a \u0438 \u0434\u0430\u043b\u044c\u0448\u0435, \u043a\u043e\u0433\u0434\u0430 \u0438\u0437 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0443\u0439\u0434\u0443\u0442 \u0442\u0435 \u0441\u0430\u043c\u044b\u0435 Senior Certified Java-\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u044b?\u00bb. \u0423\u0432\u044b, \u0435\u0441\u043b\u0438 \u0437\u043d\u0430\u043d\u0438\u044f \u043d\u0435 \u0444\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u0432 \u043a\u043e\u0434\u0435 \u0447\u0435\u0440\u0435\u0437 \u0442\u0435\u0441\u0442\u044b \u0438 \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u043d \u0441\u0430\u043c\u043e\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0449\u0438\u0439\u0441\u044f \u043a\u0430\u0440\u043a\u0430\u0441 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438\u0437 \u0442\u0435\u0441\u0442\u043e\u0432, \u0442\u043e \u0432\u0430\u0441 \u0436\u0434\u0443\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u043c \u0432 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u043e\u0432\u044b\u0445 \u043b\u044e\u0434\u0435\u0439.<\/p>\n<p>  \u0414\u043e\u0440\u043e\u0433\u043e\u0439 \u0434\u0440\u0443\u0433, \u043f\u043e\u0437\u0432\u043e\u043b\u044c \u0441\u0432\u043e\u0438 \u0441\u043b\u043e\u0432\u0430 \u043f\u043e\u0434\u043a\u0440\u0435\u043f\u0438\u0442\u044c \u0446\u0438\u0442\u0430\u0442\u043e\u0439 \u0438\u0437 \u0435\u0449\u0451 \u043e\u0434\u043d\u043e\u0439 \u043a\u043d\u0438\u0433\u0438, \u00ab<strong>\u0428\u0430\u0431\u043b\u043e\u043d\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043e\u0440\u043f\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439<\/strong>\u00bb \u0437\u0430 \u0430\u0432\u0442\u043e\u0440\u0441\u0442\u0432\u043e\u043c \u041a\u0435\u043d\u0442 \u0411\u0435\u043a\u0430:<\/p>\n<blockquote><p>\u041f\u041e \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0441\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u043b\u0430\u0441\u044c \u0435\u0433\u043e \u043e\u0431\u0449\u0430\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c. \u041e\u043d\u0430 \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0435\u043d\u0438\u044f:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/e18\/9d8\/bae\/e189d8bae79d8633adbbcd6b8ec026be.png\"><\/div>\n<p>  \u041a\u043e\u0433\u0434\u0430 \u0432 \u0438\u043d\u0434\u0443\u0441\u0442\u0440\u0438\u0438 \u0431\u044b\u043b \u043d\u0430\u043a\u043e\u043f\u043b\u0435\u043d \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u044b\u0439 \u043e\u043f\u044b\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u041f\u041e, \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u0438\u0445 \u0441\u0442\u0430\u043b \u0441\u044e\u0440\u043f\u0440\u0438\u0437\u043e\u043c \u0442\u043e\u0442 \u0444\u0430\u043a\u0442, \u0447\u0442\u043e <u>\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c<\/u> \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043d\u0438\u0436\u0435 <u>\u0441\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u0438 \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0435\u043d\u0438\u044f<\/u>.<\/p>\n<p>  <u>\u0421\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0435\u043d\u0438\u0435<\/u> \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0434\u043e\u0440\u043e\u0433\u043e, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043a\u043e\u0434\u0430 \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u0439 \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438 \u043f\u043e\u0434\u0432\u0435\u0440\u0436\u0435\u043d\u043d\u044b\u0439 \u043e\u0448\u0438\u0431\u043a\u0430\u043c. \u0412\u043d\u0435\u0441\u0435\u043d\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u0431\u043b\u0435\u0433\u0447\u0430\u0435\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c. \u0418\u0437\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u043a\u043e\u0434\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u043e\u0439 \u0442\u0440\u0443\u0434\u043e\u0451\u043c\u043a\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e. \u0412\u0441\u0435 \u0432\u043d\u043e\u0441\u0438\u043c\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0438 \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u044b.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/969\/71b\/9b1\/96971b9b18acf34ff0ca5f205e2cab56.png\"><\/div>\n<p>  \u2026 \u0421\u0435\u0433\u043e\u0434\u043d\u044f\u0448\u043d\u0438\u0439 \u0434\u043e\u043b\u043b\u0430\u0440 \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u0442\u043e\u0438\u0442\u044c \u0434\u043e\u0440\u043e\u0436\u0435 \u0437\u0430\u0432\u0442\u0440\u0430\u0448\u043d\u0435\u0433\u043e.  <\/p><\/blockquote>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0437\u0430\u043a\u0440\u0443\u0433\u043b\u044f\u0442\u044c\u0441\u044f, \u0430 \u0442\u043e \u044f \u0447\u0442\u043e-\u0442\u043e \u043c\u043d\u043e\u0433\u043e \u0443\u0436\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043b. \u041f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u0441\u0440\u0430\u0437\u0443 \u043a \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u044f\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0442 \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0434\u043e\u043b\u0433 \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u0421\u0440\u0430\u0437\u0443 \u043e\u0433\u043e\u0432\u043e\u0440\u044e\u0441\u044c, \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u0435\u043d \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434 \u0432 \u0442\u0435\u0441\u0442\u0430\u0445, \u0437\u0434\u0435\u0441\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 TDD, BDD \u0438 \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0446\u0438\u0439 Given-When-Then. \u041d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u0447\u0438\u0442\u0430\u0442\u044c, \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u044f\u0442\u044c. \u0412\u0441\u0451 \u044d\u0442\u043e \u043c\u043e\u0451 \u0418\u041c\u0425\u041e \u0438\u0437 \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430\u0434 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u043c\u0438 \u0438 \u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441 \u0436\u0438\u0432\u044b\u043c\u0438 \u043b\u044e\u0434\u044c\u043c\u0438.<\/p>\n<h1>\u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0438<\/h1>\n<p>  <b>\u0412\u0435\u0434\u0438\u0442\u0435 \u0444\u0430\u0439\u043b Readme.md<\/b><br \/>  \u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u0432 \u043a\u043e\u0440\u043d\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u044d\u0442\u043e\u0442 \u0444\u0430\u0439\u043b \u0438 \u043e\u043f\u0438\u0448\u0438\u0442\u0435 \u043a\u0440\u0430\u0442\u043a\u043e:   <\/p>\n<ul>\n<li>\u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0441\u0435\u0440\u0432\u0438\u0441 \u0438 \u0434\u043b\u044f \u0447\u0435\u0433\u043e \u043e\u043d \u0431\u044b\u043b \u0441\u043e\u0437\u0434\u0430\u043d;<\/li>\n<li>\u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438, \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435;<\/li>\n<li>\u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043e\u0439, \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c API.<\/li>\n<\/ul>\n<p>  \u0415\u0441\u043b\u0438 \u043c\u043d\u043e\u0433\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043a\u0440\u0430\u0442\u043a\u0438\u0435 \u0437\u0430\u043c\u0435\u0442\u043a\u0438 \u0441\u043e \u0441\u0441\u044b\u043b\u043a\u043e\u0439 \u043d\u0430 Wiki. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043d\u0435 \u0434\u0443\u043c\u0430\u0439\u0442\u0435, \u0447\u0442\u043e \u0432\u0441\u0451 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e \u0438 \u0434\u043b\u044f \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0442\u0430\u043a\u043e\u0439 \u0444\u0430\u0439\u043b \u043d\u0435 \u043d\u0443\u0436\u0435\u043d, \u044d\u0442\u043e \u0441\u0430\u043c\u043e\u043e\u0431\u043c\u0430\u043d. \u0414\u043b\u044f \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f: \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043d\u0430\u0439\u0442\u0438 \u0441\u0432\u043e\u0439 \u0441\u0430\u043c\u044b\u0439 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0441\u0442\u0430\u0440\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430 GitHub \u0438 \u043f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0439\u0442\u0435 \u0432\u0440\u0435\u043c\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u0432 \u043d\u0451\u043c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f.<\/p>\n<p>  <b>\u041d\u0435 \u0431\u0443\u0434\u044c\u0442\u0435 \u0442\u043e\u043b\u0435\u0440\u0430\u043d\u0442\u043d\u044b \u043a \u043d\u0438\u0433\u0438\u043b\u0438\u0441\u0442\u0430\u043c<\/b><br \/>  \u0421 \u0442\u0430\u043a\u0438\u043c\u0438 \u043b\u044e\u0434\u044c\u043c\u0438 \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d\u0438 \u2014 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0434\u043e\u043b\u0433\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c \u0432\u0430\u043c \u0438\u043b\u0438 \u0432\u0430\u0448\u0438\u043c \u043a\u043e\u043b\u043b\u0435\u0433\u0430\u043c. \u041d\u0438\u0433\u0438\u043b\u0438\u0441\u0442\u0430\u043c \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u043d\u0435\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0441 \u0447\u0435\u043c \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u0442\u0441\u044f \u0438\u0445 \u043a\u043e\u043b\u043b\u0435\u0433\u0438. \u0418\u043c \u0432\u0430\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0441\u0432\u043e\u0438 \u043b\u0438\u0447\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0437\u0434\u0435\u0441\u044c \u0438 \u0441\u0435\u0439\u0447\u0430\u0441, \u0431\u044b\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u043c \u0441\u0438\u044e \u043c\u0438\u043d\u0443\u0442\u0443: \u00ab\u0410 \u043f\u043e\u0441\u043b\u0435 \u043d\u0430\u0441 \u0445\u043e\u0442\u044c \u043f\u043e\u0442\u043e\u043f\u00bb. \u0415\u0441\u043b\u0438 \u0432\u044b \u0442\u0430\u043a\u043e\u0439 \u0447\u0435\u043b\u043e\u0432\u0435\u043a, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0439\u0442\u0435 \u0432 IT.<\/p>\n<p>  <b>\u0418\u043d\u0438\u0446\u0438\u0438\u0440\u0443\u0439\u0442\u0435 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u044b\u0439 \u043a\u043e\u043c\u0438\u0442\u0435\u0442<\/b><br \/>  \u0414\u0432\u0430 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430 \u0441\u043c\u043e\u0433\u0443\u0442 \u0434\u0440\u0443\u0433 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c \u0434\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c\u0441\u044f. \u0415\u0441\u043b\u0438 \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u0432\u0443\u0445 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u0432 \u0438 \u0432\u044b \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0442\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0442\u044c\u0441\u044f, \u0442\u043e \u0444\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u043e\u0433\u043e\u0432\u043e\u0440\u0451\u043d\u043d\u043e\u0441\u0442\u0438 \u0447\u0435\u0440\u0435\u0437 \u043e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u0435 \u2014 \u044d\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u0438\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438. \u0422\u0430\u043a \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043a \u043e\u0434\u043d\u0438\u043c \u0438 \u0442\u0435\u043c \u0436\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u043c. \u0418\u0442\u043e\u0433\u0438 \u0430\u0440\u0445\u043a\u043e\u043c\u043e\u0432 \u0441\u0442\u043e\u0438\u0442 \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438.<\/p>\n<p>  <b>\u041d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 <code>when<\/code> \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0439\u0442\u0435 <code>verify<\/code><\/b><br \/>  \u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0439\u0442\u0435 \u043c\u0435\u0442\u043e\u0434-\u043e\u0431\u043c\u0430\u043d\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0432\u044b\u0437\u0432\u0430\u043d \u0432 \u0442\u0435\u0441\u0442\u0435, \u0438\u043d\u0430\u0447\u0435 \u0437\u0430\u0447\u0435\u043c \u0432\u043e\u043e\u0431\u0449\u0435 \u0432\u044b \u0435\u0433\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438?<\/p>\n<pre><code class=\"java\">verify(rabbitService).hasRabbitConnection(); <\/code><\/pre>\n<p>  <b>\u041d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 <code>null<\/code><\/b><br \/>  \u0418\u0437\u0431\u0438\u0442\u0430\u044f \u0442\u0435\u043c\u0430, \u043d\u043e\u2026 \u0441\u0442\u0430\u0440\u0430\u0439\u0442\u0435\u0441\u044c \u043e\u0442\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f, \u0433\u0434\u0435 \u044d\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043e\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f <code>null<\/code>, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u043d\u0435 \u043f\u0440\u043e\u043d\u0438\u0437\u044b\u0432\u0430\u043b, \u043a\u0430\u043a \u0438\u0433\u043b\u0430, \u0432\u0435\u0441\u044c \u0432\u0430\u0448 \u043a\u043e\u0434. \u00abI call it my billion-dollar mistake\u2026\u00bb, \u2014 \u0441\u043a\u0430\u0437\u0430\u043b Antony Hoare, \u0430\u0432\u0442\u043e\u0440 \u044f\u0437\u044b\u043a\u0430 ALGOL \u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 Quicksort.<\/p>\n<pre><code class=\"java\">public List&lt;String&gt; listFiles(String path) {    String[] files = getFiles(path);    if (files != null) return List.of(files);    else return null; } <\/code><\/pre>\n<p>  <b>\u041f\u0440\u043e\u0433\u043e\u043d\u044f\u0439\u0442\u0435 \u0442\u0435\u0441\u0442\u044b \u043f\u0435\u0440\u0435\u0434 \u0442\u0435\u043c, \u043a\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442<\/b><br \/>  \u0421\u043b\u0435\u0434\u0438\u0442\u0435 \u0437\u0430 \u0442\u0435\u043c, \u0447\u0442\u043e\u0431\u044b:  <\/p>\n<ul>\n<li>\u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0431\u044b\u043b\u0438 \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u044b \u043c\u043e\u0434\u0443\u043b\u044c\u043d\u044b\u0435 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u044b;<\/li>\n<li>\u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0431\u044b\u043b\u0438 \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u044b \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u044b, \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0447\u0430\u0441\u0442\u044c\u044e \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438 \u043d\u0435 \u043e\u0431\u0440\u0430\u0449\u0430\u044e\u0442\u0441\u044f \u043a\u043e \u0432\u043d\u0435\u0448\u043d\u0438\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c;<\/li>\n<li>\u0434\u043e\u0441\u0442\u0443\u043f \u043a\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0441\u0435\u0442\u0438 \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c (\u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c \u043d\u0435 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f).<\/li>\n<\/ul>\n<p>  \u0415\u0441\u043b\u0438 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u044b \u043d\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0447\u0430\u0441\u0442\u044c\u044e \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0439\u0442\u0435 \u0438\u0445 \u0443\u0436\u0435 \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432 QA \u0438\u043b\u0438 Stage-\u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>  <b>\u041d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u043e\u0431\u0449\u0438\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b<\/b><br \/>  \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 <code>testcontainers<\/code> \u0438\u043b\u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u043d\u0443\u0436\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0441\u0440\u0430\u0437\u0443 \u0432 \u0444\u0430\u0439\u043b\u0435 <code>docker-compose.yml<\/code>, \u0435\u0441\u043b\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u043c\u0438 \u0441\u043b\u0443\u0436\u0431\u0430\u043c\u0438 (PostgreSQL, RabbitMQ \u0438 \u0434\u0440.). \u0418 \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u043e\u0431\u0449\u0443\u044e \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u0438\u0445, \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044e\u044e \u0411\u0414:<\/p>\n<ul>\n<li>\u0417\u0430\u043f\u0443\u0441\u043a \u0442\u0435\u0441\u0442\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u043a \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u043c \u00ab\u043c\u0438\u0433\u0430\u044e\u0449\u0438\u043c\u00bb \u043e\u0448\u0438\u0431\u043a\u0430\u043c.<\/li>\n<li>\u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0442\u0435\u0445\u0434\u043e\u043b\u0433, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0432 \u0433\u043e\u043b\u043e\u0432\u0435 \u0434\u043b\u044f \u0432\u044b\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0445 \u0438 \u043d\u0435\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a.<\/li>\n<li>\u0422\u0435\u0441\u0442\u044b \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u043e\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0434\u0440\u0443\u0433\u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.<\/li>\n<\/ul>\n<p>  <b>\u0420\u0430\u0437\u0434\u0435\u043b\u044f\u0439\u0442\u0435 \u043f\u0440\u043e\u0435\u043a\u0442 \u0438 \u0442\u0435\u0441\u0442\u044b \u043d\u0430 \u0441\u043b\u043e\u0438<\/b><br \/>  \u0421\u0442\u0430\u0440\u0430\u0439\u0442\u0435\u0441\u044c \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0442\u044c \u0442\u0435\u0441\u0442\u044b \u043d\u0430 \u0441\u043b\u043e\u0438, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u0438 \u043d\u0435 \u043e\u0442\u0432\u043b\u0435\u043a\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u0434\u0430, \u043d\u0435 \u043e\u0442\u043d\u043e\u0441\u044f\u0449\u0435\u0433\u043e\u0441\u044f \u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c\u0443 \u0442\u0435\u0441\u0442\u0443. \u041a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0432\u044b\u0434\u0435\u043b\u044f\u044e\u0442 \u0442\u0440\u0438 \u0441\u043b\u043e\u044f:  <\/p>\n<ul>\n<li> \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0411\u0414: CRUD-\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441 Entity-\u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c\u0438;<\/li>\n<li> \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0432\u043d\u0435\u0448\u043d\u0438\u043c API \u0441\u0435\u0440\u0432\u0438\u0441\u0430 (mocks \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u043a \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0435 \u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0411\u0414);<\/li>\n<li> \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u043e\u0439 (mocks \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u043a \u0411\u0414).<\/li>\n<\/ul>\n<p>  <b>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0435 \u0438\u043c\u0435\u043d\u0430 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u043c \u043c\u0435\u0442\u043e\u0434\u0430\u043c<\/b>  <\/p>\n<ul>\n<li>\u042d\u0442\u043e \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u0435\u0441\u0442.<\/li>\n<li>\u0422\u0430\u043a\u0438\u0435 \u0438\u043c\u0435\u043d\u0430 \u043f\u043e\u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0432\u0432\u043e\u0434\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0445 \u043b\u044e\u0434\u0435\u0439 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442.<\/li>\n<li>\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u0435 \u0444\u0430\u043d\u0442\u0430\u0437\u0438\u044e \u0438 \u0438\u0437\u0431\u0435\u0433\u0430\u0439\u0442\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0439, \u0441\u0445\u043e\u0436\u0438\u0445 \u0441 <code>testRoleSuccess<\/code>, <code>testRoleFail<\/code>, <code>testRoleUnknown<\/code>.<\/li>\n<li>\u0426\u0435\u043d\u0438\u0442\u0435 \u0438 \u0441\u0432\u043e\u0451 \u0432\u0440\u0435\u043c\u044f, \u0438 \u0432\u0440\u0435\u043c\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u0432.<\/li>\n<li>\u041d\u0435 \u0441\u0442\u0435\u0441\u043d\u044f\u0439\u0442\u0435\u0441\u044c \u0434\u043b\u0438\u043d\u043d\u044b\u0445 \u0438\u043c\u0451\u043d, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/li>\n<\/ul>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/s-\/me\/k9\/s-mek9b7tmh865ddyjcevlg9hjg.jpeg\"><\/p>\n<p>  <b>\u0422\u0435\u0441\u0442\u044b \u2014 \u044d\u0442\u043e \u0436\u0438\u0432\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/b><br \/>  \u0415\u0441\u043b\u0438 \u0432\u0430\u0441 \u043f\u043e\u043f\u0440\u043e\u0441\u044f\u0442 \u0432\u0435\u0441\u0442\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043e\u0442 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0442\u043e \u043e\u043d\u0430 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043a\u043e\u0433\u0434\u0430-\u043d\u0438\u0431\u0443\u0434\u044c \u0443\u0441\u0442\u0430\u0440\u0435\u0435\u0442. \u041f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u044b \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0443\u0441\u0442\u0430\u0440\u0435\u0442\u044c, \u0438\u043d\u0430\u0447\u0435 \u043e\u043d\u0438 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u0443\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c. \u0418\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0430\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0438 \u043c\u0435\u0442\u043e\u0434\u043e\u0432.<\/p>\n<p>  <b>\u0423\u0434\u0430\u043b\u044f\u0439\u0442\u0435 \u043d\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u043a\u043e\u0434<\/b><br \/>  \u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u043c, \u0442\u043e, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0435\u0442\u043e\u043a. \u041e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f <code>master<\/code>, <code>develop<\/code> \u0438 <code>stage<\/code>:  <\/p>\n<ul>\n<li>\u041d\u0435 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0439\u0442\u0435 \u0432 \u0442\u0435\u0441\u0442\u0430\u0445 <code>master<\/code>-\u0432\u0435\u0442\u043a\u0438 \u0447\u0430\u0441\u0442\u0438 \u0437\u0430\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0438\u043b\u0438 \u043f\u043e\u043c\u0435\u0442\u043a\u0438 <code>@Ignore<\/code>.<\/li>\n<li>\u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f, \u0438 \u0432\u0441\u043a\u043e\u0440\u0435 \u0432\u0441\u0435 \u043c\u043e\u0433\u0443\u0442 \u0437\u0430\u0431\u044b\u0442\u044c \u043f\u0440\u043e \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043d\u0435\u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u0433\u043e \u043a\u043e\u0434\u0430.<\/li>\n<li>\u041d\u0435\u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u043a\u043e\u0434 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0442\u0435\u0445\u0434\u043e\u043b\u0433.<\/li>\n<\/ul>\n<p>  <b>\u041d\u0435 \u0436\u0430\u043b\u0435\u0439\u0442\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u0442\u0435\u0441\u0442\u044b<\/b><br \/>  \u0422\u0435\u0441\u0442\u044b \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u044b, \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u0438\u0445 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435. \u0416\u0430\u043b\u0435\u044f \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u0442\u0435\u0441\u0442\u044b, \u0432\u044b \u043a\u0440\u0430\u0434\u0435\u0442\u0435 \u0441\u0432\u043e\u0451 \u0431\u0443\u0434\u0443\u0449\u0435\u0435, \u0436\u0435\u043b\u0430\u044f \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442\u044c \u0441\u0435\u0439\u0447\u0430\u0441. \u0420\u0430\u0441\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u044b \u0438 \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u0435, \u0447\u0442\u043e \u0434\u043b\u044f \u0432\u0430\u0441 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0446\u0435\u043d\u043d\u044b\u043c:  <\/p>\n<ul>\n<li><strong>\u0412\u0440\u0435\u043c\u044f<\/strong> \u2014 \u044d\u0442\u043e \u0432\u0430\u0448 \u0430\u043a\u0442\u0438\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u043f\u043b\u0430\u0442\u0438\u0442 \u0441\u0432\u043e\u0438 \u0434\u0438\u0432\u0438\u0434\u0435\u043d\u0434\u044b \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c.<\/li>\n<li><strong>\u0422\u0435\u0445\u0434\u043e\u043b\u0433<\/strong> \u2014 \u044d\u0442\u043e \u0432\u0430\u0448 \u043f\u0430\u0441\u0441\u0438\u0432, \u0438 \u0442\u0435\u0441\u0442\u044b \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0442 \u0435\u043c\u0443 \u0432\u044b\u0440\u0430\u0441\u0442\u0438.<\/li>\n<\/ul>\n<p>  \u0422\u0435\u0441\u0442\u044b \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u044e\u0442 \u043a\u0430\u0440\u043a\u0430\u0441 \u0438 \u043f\u043e\u043c\u043e\u0433\u0443\u0442 \u0443\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0432\u0430\u0448 \u043f\u0440\u043e\u0435\u043a\u0442 \u0432 \u0440\u0430\u0431\u043e\u0447\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u043f\u0440\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u043e\u0432\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438.<\/p>\n<p>  \u0412\u044b\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043d\u0438\u0435 \u0430\u043c\u0435\u0440\u0438\u043a\u0430\u043d\u0441\u043a\u043e\u0433\u043e \u0438\u043d\u0432\u0435\u0441\u0442\u043e\u0440\u0430 \u0423\u043e\u0440\u0440\u0435\u043d\u0430 \u0411\u0430\u0444\u0444\u0435\u0442\u0430 \u044f\u0440\u043a\u043e \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u043f\u043e\u0442\u0440\u0430\u0447\u0435\u043d\u043d\u044b\u0445 \u0441\u0440\u0435\u0434\u0441\u0442\u0432 \u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0432\u0437\u0430\u043c\u0435\u043d \u0431\u043b\u0430\u0433. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0437\u0430\u0442\u0440\u0430\u0442\u044b \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u0435\u0441\u0442\u043e\u0432. \u041c\u0430\u0433\u0438\u044f \u00ab\u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u043d\u0442\u0430\u00bb \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442 \u0432\u0430\u0441 \u0438 \u0432\u0430\u0448\u0438\u0445 \u043a\u043e\u043b\u043b\u0435\u0433 \u043e\u0442 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043e\u0448\u0438\u0431\u043e\u043a \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c. <\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/gt\/it\/to\/gtittogc6pqdu34ramf3basst9y.jpeg\"><\/p>\n<p>  <b>\u041d\u0435 \u0441\u0442\u0440\u0435\u043c\u0438\u0442\u0435\u0441\u044c \u043f\u043e\u043a\u0440\u044b\u0442\u044c \u0442\u0435\u0441\u0442\u0430\u043c\u0438 100% \u043a\u043e\u0434\u0430<\/b><br \/>  \u0411\u044b\u0432\u0430\u0435\u0442 \u043e\u0431\u0440\u0430\u0442\u043d\u0430\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f, \u043a\u043e\u0433\u0434\u0430 \u043f\u0435\u0440\u0444\u0435\u043a\u0446\u0438\u043e\u043d\u0438\u0441\u0442\u044b \u0441\u0442\u0440\u0435\u043c\u044f\u0442\u0441\u044f \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u043e\u043a\u0440\u044b\u0442\u044c \u043a\u043e\u0434 \u0442\u0435\u0441\u0442\u0430\u043c\u0438.  <\/p>\n<ul>\n<li>\u041f\u043e\u043a\u0440\u043e\u0439\u0442\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0432\u044b\u0437\u043e\u0432\u044b \u0432\u0430\u0448\u0435\u0433\u043e API \u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u043e\u0439 \u0440\u0430\u0437\u043d\u043e\u0433\u043e \u0438\u0441\u0445\u043e\u0434\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.<\/li>\n<li>\u041b\u0438\u0448\u043d\u0435\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u043e\u0432\u043e\u0439 \u0438\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u0440\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438.<\/li>\n<\/ul>\n<p>  <\/p>\n<h1>\u0418\u0442\u043e\u0433\u043e<\/h1>\n<p>  \u0412\u0440\u0435\u043c\u044f \u2014 \u044d\u0442\u043e \u0432\u0430\u0448 \u0430\u043a\u0442\u0438\u0432. \u0422\u0435\u0445\u0434\u043e\u043b\u0433 \u2014 \u044d\u0442\u043e \u0432\u0430\u0448 \u043f\u0430\u0441\u0441\u0438\u0432.<br \/>  \u0410\u043a\u0442\u0438\u0432 \u2014 \u044d\u0442\u043e \u0442\u043e, \u0447\u0442\u043e \u043f\u0440\u0438\u043d\u043e\u0441\u0438\u0442 \u0434\u043e\u0445\u043e\u0434\u044b. \u041f\u0430\u0441\u0441\u0438\u0432 \u2014 \u044d\u0442\u043e \u0442\u043e, \u0447\u0442\u043e \u043f\u0440\u0438\u043d\u043e\u0441\u0438\u0442 \u0440\u0430\u0441\u0445\u043e\u0434\u044b.<br \/>  \u0422\u0435\u0441\u0442\u044b \u2014 \u044d\u0442\u043e \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0444\u043e\u0440\u043c\u0430 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0430\u043a\u0442\u0438\u0432\u0430, \u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0442\u0435\u0441\u0442\u043e\u0432 \u2014 \u0447\u0451\u0440\u043d\u0430\u044f \u0434\u044b\u0440\u0430 \u043f\u0430\u0441\u0441\u0438\u0432\u0430.<\/p>\n<p>  \u0422\u0435\u0441\u0442\u044b \u0431\u0443\u0434\u0443\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0434\u0438\u0432\u0438\u0434\u0435\u043d\u0434\u044b, \u044d\u043a\u043e\u043d\u043e\u043c\u044f \u0432\u0430\u0448\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u0432\u0441\u0451\u043c \u043f\u0440\u043e\u0442\u044f\u0436\u0435\u043d\u0438\u0438 \u0436\u0438\u0437\u043d\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u041e\u0442 \u0442\u0435\u0445\u0434\u043e\u043b\u0433\u0430 \u043d\u0435 \u0443\u0439\u0442\u0438, \u043e\u043d \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u0442, \u043f\u043e\u043a\u0430 \u0436\u0438\u0432 \u043f\u0440\u043e\u0435\u043a\u0442 \u0438 \u0432\u0435\u0434\u0451\u0442\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u0430. \u0412\u0430\u0448\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u2014 \u0441\u0442\u0430\u0440\u0430\u0442\u044c\u0441\u044f \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0442\u0435\u0445\u0434\u043e\u043b\u0433 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0440\u0430\u0437\u0443\u043c\u043d\u043e\u0433\u043e.<\/p>\n<p>  <b>\u041f\u043e\u0441\u0442\u0441\u043a\u0440\u0438\u043f\u0442\u0443\u043c (aka P.S.):<\/b><br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/wk\/0a\/ff\/wk0affkcy3ldphgotvtnzwepp3i.jpeg\"><\/p>\n<p>  \u0414\u043e\u0440\u043e\u0433\u043e\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c, \u0443 \u0411\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u041a\u0440\u0438\u0441\u0430 \u0432\u0441\u0451 \u0445\u043e\u0440\u043e\u0448\u043e. \u041f\u043e\u0441\u043b\u0435 \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u0434\u043d\u044f \u043e\u043d \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441\u043e \u0441\u0432\u043e\u0438\u043c\u0438 \u043a\u043e\u043b\u043b\u0435\u0433\u0430\u043c\u0438 \u0447\u0443\u0442\u044c \u043f\u043e\u0431\u043b\u0438\u0436\u0435 \u0438 \u043f\u0440\u0438\u0433\u043b\u0430\u0441\u0438\u043b \u0438\u0445 \u043d\u0430 \u043f\u0438\u043a\u043d\u0438\u043a, \u043b\u044e\u0431\u0435\u0437\u043d\u043e \u0441\u043e\u0433\u043b\u0430\u0441\u0438\u0432\u0448\u0438\u0441\u044c \u043f\u043e\u0434\u0432\u0435\u0437\u0442\u0438 \u043d\u0430 \u0441\u0432\u043e\u0451\u043c \u0430\u0432\u0442\u043e\u043c\u043e\u0431\u0438\u043b\u0435. \u042d\u0442\u043e \u0431\u044b\u043b\u0430 \u043f\u0435\u0440\u0432\u0430\u044f \u0432\u0441\u0442\u0440\u0435\u0447\u0430 \u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u043e\u0433\u043e \u041a\u043e\u043c\u0438\u0442\u0435\u0442\u0430, \u043f\u043e\u0441\u043b\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0432 \u043e\u0431\u0449\u0435\u043d\u0438\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0431\u044b\u043b\u043e, \u043d\u043e \u044d\u0442\u043e \u0443\u0436\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0434\u0440\u0443\u0433\u0430\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/t3\/be\/mr\/t3bemrzt5uk7avjkarw7sgstohw.jpeg\"><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/company\/domclick\/blog\/527108\/\"> https:\/\/habr.com\/ru\/company\/domclick\/blog\/527108\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/xu\/lg\/g1\/xulgg1bl5y0tvubnrckuk7zfm4o.jpeg\"><\/p>\n<p>  \u0414\u043e\u0440\u043e\u0433\u043e\u0439 \u0434\u0440\u0443\u0433, \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u043e\u0442\u0447\u0430\u0441\u0442\u0438 \u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438, \u0430 \u043e\u0442\u0447\u0430\u0441\u0442\u0438 \u043e \u0434\u0435\u043d\u044c\u0433\u0430\u0445 \u0438 \u0436\u0438\u0437\u043d\u0438. \u042f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0435\u0451 \u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u0440\u0430\u0437 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u043e\u043c\u0443 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u044b \u043f\u0438\u0448\u0435\u043c \u0442\u0435\u0441\u0442\u044b, \u043a\u043e\u0433\u0434\u0430 \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u043c\u044b \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u043c. \u0422\u0435\u043f\u0435\u0440\u044c \u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u0443\u0434\u0443 \u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0430 \u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e \u0441\u0441\u044b\u043b\u043a\u0443, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c\u0441\u044f. \u042f \u0432\u044b\u0440\u0430\u0436\u0430\u044e \u0441\u0432\u043e\u0439 \u043b\u0438\u0447\u043d\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u0438 \u043c\u043d\u0435\u043d\u0438\u0435, \u043d\u0430\u0434\u0435\u044f\u0441\u044c, \u0447\u0442\u043e \u0438 \u0442\u0435\u0431\u0435 \u043e\u043d \u0442\u043e\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u0435\u043d.<\/p>\n<p>  \u0421\u043a\u0430\u0437 \u043c\u043e\u0439 \u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043d\u0430 Java, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432\u0441\u0451 \u043d\u0438\u0436\u0435\u0438\u0437\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0435 \u0441\u043f\u0440\u0430\u0432\u0435\u0434\u043b\u0438\u0432\u043e \u0438 \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u041e\u0442 \u0441\u043c\u0435\u043d\u044b \u044f\u0437\u044b\u043a\u043e\u0432 \u043b\u044e\u0434\u0438 \u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0432 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043d\u0435 \u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f.<\/p>\n<blockquote><p><strong>\u041e\u0442\u043a\u0430\u0437 \u043e\u0442 \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u0438 (aka disclaimer)<\/strong>: \u0432\u0441\u0435 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432\u044b\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u044b\u043c\u0438, \u0438 \u043b\u044e\u0431\u043e\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435 \u0441 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0436\u0438\u0432\u0443\u0449\u0438\u043c\u0438 \u0438\u043b\u0438 \u043a\u043e\u0433\u0434\u0430-\u043b\u0438\u0431\u043e \u0436\u0438\u0432\u0448\u0438\u043c\u0438 \u043b\u044e\u0434\u044c\u043c\u0438 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e.<\/p><\/blockquote>\n<p>  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-313004","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/313004","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=313004"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/313004\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=313004"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=313004"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=313004"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}