{"id":307847,"date":"2020-08-01T21:00:22","date_gmt":"2020-08-01T21:00:22","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=307847"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=307847","title":{"rendered":"\u0422\u0435\u0441\u0442\u044b \u043d\u0430 pytest \u0441 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0435\u0439 \u043e\u0442\u0447\u0435\u0442\u043e\u0432 \u0432 Allure \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Docker \u0438 Gitlab Pages \u0438 \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e selenium"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/513432\/\">\n<p>\u042d\u0442\u043e\u0442 \u0442\u0435\u043a\u0441\u0442 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0434\u043b\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0445 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u043e\u0432, \u0436\u0435\u043b\u0430\u044e\u0449\u0438\u0445 \u043f\u043e\u043d\u044f\u0442\u044c \u043a\u0430\u043a \u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0442\u0447\u0435\u0442\u044b \u043d\u0430 allure \u0441 \u0438\u0441\u0442\u043e\u0440\u0438\u0435\u0439 \u0442\u0435\u0441\u0442\u043e\u0432, \u0442\u0430\u043a\u0436\u0435 \u0440\u0430\u0437\u044a\u044f\u0441\u043d\u0438\u0442\u044c \u0433\u0434\u0435 \u0438\u0445 \u0445\u0440\u0430\u043d\u0438\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u0432 \u043e\u0442\u0447\u0435\u0442 \u043c\u043e\u0433 \u0437\u0430\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a \u0432\u0430\u0448\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/bb\/xd\/ws\/bbxdwsvdjcdawfrthmdipnxju8i.png\" alt=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u043e\u0442\u0447\u0435\u0442\u0430, \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0449\u0438\u0439\u0441\u044f \u0432 allure\"\/><\/p>\n<p>  <\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u044f \u0445\u043e\u0442\u0435\u043b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 gitlab \u0430\u0432\u0442\u043e\u0442\u0435\u0441\u0442\u044b \u0432 \u0441\u0442\u0435\u043a\u0435 python, allure, docker, \u0442\u043e \u044f \u0432\u044b\u044f\u0441\u043d\u0438\u043b, \u0447\u0442\u043e \u0442\u043e\u043b\u043a\u043e\u0432\u044b\u0445 \u0441\u0442\u0430\u0442\u0435\u0439 \u043d\u0430 \u044d\u0442\u0443 \u0442\u0435\u043c\u0443 \u043d\u0435\u0442. \u041f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0438 \u043a\u0430\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0440\u043e\u0431 \u0438 \u043e\u0448\u0438\u0431\u043e\u043a \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043a\u043e\u0440\u0435\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0433\u0430\u0439\u0434\u043e\u043c, \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e \u0437\u0430\u0442\u0440\u0430\u0433\u0438\u0432\u0430\u044e\u0449\u0438\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u0435\u0441\u0442\u043e\u0432, \u043d\u043e \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0438\u0439 \u0444\u043e\u043a\u0443\u0441 \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430 \u0432\u044b\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043d\u0438\u0438 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b. \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0443\u0436\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u0442\u0435\u0441\u0442\u044b \u043d\u0430 allure, \u0442\u043e \u0432\u044b \u0441\u0440\u0430\u0437\u0443 \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043a \u0440\u0430\u0437\u0434\u0435\u043b\u0443 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b. \u041e\u0442\u043c\u0435\u0447\u0443, \u0447\u0442\u043e \u0442\u0435\u043a\u0441\u0442 \u041d\u0415 \u0437\u0430\u0442\u0440\u0430\u0433\u0438\u0432\u0430\u0435\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 UI \u0442\u0435\u0441\u0442\u043e\u0432, \u043d\u043e \u044f \u0437\u0430\u0442\u0440\u043e\u043d\u0443 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0434\u043b\u044f \u043d\u0438\u0445 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u0431\u043b\u043e\u043a\u0435.<\/p>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u043d\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u043b\u0443\u0447\u0448\u0438\u0435 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438 \u043f\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u0442\u0435\u0441\u0442\u043e\u0432 \u0438 \u0432\u044b\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043d\u0438\u044e \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b. \u0421\u043a\u043e\u0440\u0435\u0435 \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u043b\u0435\u043d\u0438\u0435 \u0441 \u0442\u0435\u043c, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0432\u0441\u0435 \u044d\u0442\u043e \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u0442\u044c. \u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u044b \u043d\u0430 windows, \u043d\u0430 \u0434\u0440\u0443\u0433\u0438\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 \u043f\u043e\u0434\u0445\u043e\u0434 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u043e\u0439 \u0436\u0435.<\/p>\n<p>  <\/p>\n<p>\u042d\u0442\u043e\u0442 \u0433\u0430\u0439\u0434 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442, \u0447\u0442\u043e \u0443 \u0432\u0430\u0441 \u0443\u0436\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d python, \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d \u043f\u0443\u0441\u0442\u043e\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439, \u043a\u0443\u0434\u0430 \u0432\u044b \u0431\u0443\u0434\u0435\u0442\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u0432\u043e\u0439 \u043a\u043e\u0434. \u041f\u0440\u0438 \u0447\u0442\u0435\u043d\u0438\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0437\u043d\u0430\u0442\u044c pytest, \u043d\u043e \u043e\u0447\u0435\u043d\u044c \u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0437\u043d\u0430\u0442\u044c \u0447\u0442\u043e \u0438\u0437 \u0441\u0435\u0431\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u0430, \u043a\u0430\u043a \u0435\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u0430 \u0442\u0430\u043a \u0436\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432. \u0414\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d <a href=\"https:\/\/dog.ceo\/dog-api\/\">Dog API<\/a>. \u0415\u0441\u043b\u0438 \u0432\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a \u0442\u0435\u0441\u0442\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 gitlab, \u0442\u043e \u0432\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c docker.<\/p>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e \u0432\u044b\u0448\u0435\u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0435 \u041f\u041e, \u0442\u043e \u043d\u0438\u0436\u0435 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0439\u0442\u0438 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438:<\/p>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/docs.python.org\/3.8\/using\/index.html\">\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 Python<\/a><\/li>\n<li><a href=\"https:\/\/docs.qameta.io\/allure\/#_installing_a_commandline\">\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 Allure<\/a> \u0415\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u0447\u0435\u0442\u044b \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e. \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0442\u0430\u043a\u043e\u0439 \u043c\u0435\u0442\u043e\u0434 \u043d\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442\u0441\u044f.<\/li>\n<li><a href=\"https:\/\/www.jetbrains.com\/ru-ru\/pycharm\/download\/\">\u0421\u043a\u0430\u0447\u0430\u0442\u044c PyCharm Community<\/a><\/li>\n<li><a href=\"https:\/\/docs.gitlab.com\/ee\/ssh\/\">\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 ssh \u0432 git \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u043a\u043e\u0434\u0430 \u0432 gitlab<\/a><\/li>\n<li><a href=\"https:\/\/coderlessons.com\/tutorials\/python-technologies\/uznaite-pytest\/pytest-kratkoe-rukovodstvo\">Pytest \u2014 \u043a\u0440\u0430\u0442\u043a\u043e\u0435 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e<\/a><\/li>\n<\/ul>\n<p>  <\/p>\n<h2 id=\"soderzhanie\">\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435<\/h2>\n<p>  <\/p>\n<ul>\n<li>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u043a \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u0442\u0435\u0441\u0442\u043e\u0432<\/li>\n<li>\u041d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u044b \u0438 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0434\u043b\u044f API \u0442\u0435\u0441\u0442\u043e\u0432<\/li>\n<li>\u041f\u0438\u0448\u0435\u043c \u0442\u0435\u0441\u0442\u044b<\/li>\n<li>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c allure \u0432 \u0442\u0435\u0441\u0442\u044b<\/li>\n<li>\u0414\u0435\u043b\u0430\u0435\u043c \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432<\/li>\n<li>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f<\/li>\n<li>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Gitlab Runner<\/li>\n<li>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430 \u0432 .gitlab-ci.yml<\/li>\n<li>\u0417\u0430\u043f\u0443\u0441\u043a \u0442\u0435\u0441\u0442\u043e\u0432 \u0438 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u043e\u0442\u0447\u0435\u0442\u0430<\/li>\n<li>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430 \u0434\u043b\u044f UI \u0442\u0435\u0441\u0442\u043e\u0432<\/li>\n<li>\u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438<\/li>\n<\/ul>\n<p>  <\/p>\n<h2 id=\"podgotovka-k-napisaniyu-testov\">\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u043a \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u0442\u0435\u0441\u0442\u043e\u0432<\/h2>\n<p>  <\/p>\n<p>\u042f \u043d\u0430\u0437\u0432\u0430\u043b \u0441\u0432\u043e\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 <code>allure_pages<\/code> \u0438 \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043b \u0435\u0433\u043e \u043d\u0430 \u0441\u0432\u043e\u0439 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440.<\/p>\n<p>  <\/p>\n<p>\u041d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0441 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u043c:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/zx\/ns\/-a\/zxns-ahhwdjewxnaxa5frvxo9p0.png\"\/><\/p>\n<p>  <\/p>\n<ul>\n<li><code>conftest.py<\/code> \u2014 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0444\u0438\u043a\u0441\u0442\u0443\u0440<\/li>\n<li><code>requirements.txt<\/code> \u2014 \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 \u0441 python<\/li>\n<li><code>test_dog_api.py<\/code> \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 tests \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0430\u043c\u0438\u0445 \u0442\u0435\u0441\u0442\u043e\u0432<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0442\u0435\u0441\u0442\u043e\u0432. \u0412 \u043f\u0430\u043f\u043a\u0435 \u0441 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0435\u0433\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b:<\/p>\n<p>  <\/p>\n<p><code>python -m venv venv<\/code><\/p>\n<p>  <\/p>\n<p>\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043f\u0430\u043f\u043a\u0443 \u0441 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u043c \u043a\u0430\u043a \u043f\u0440\u043e\u0435\u043a\u0442 \u0432 PyCharm<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/f_\/ge\/18\/f_ge18ciojtmgsbju4gp5htposu.png\"\/><\/p>\n<p>  <\/p>\n<p>\u0423\u0434\u043e\u0431\u043d\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0435 \u043d\u0430\u043c \u043f\u0430\u043a\u0435\u0442\u044b \u0447\u0435\u0440\u0435\u0437 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0432 PyCharm \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440, \u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b.<\/p>\n<p>  <\/p>\n<ol>\n<li>\u0416\u043c\u0435\u043c \u043d\u0430 <code>Add Interpreter<\/code> \u0438 \u0435\u0441\u043b\u0438 \u0432\u044b \u0440\u0430\u043d\u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0441 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435, \u0442\u043e PyCharm \u0441\u0440\u0430\u0437\u0443 \u043d\u0430\u0439\u0434\u0435\u0442 \u043d\u0443\u0436\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435<\/li>\n<li>\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b \u043f\u043e \u044d\u0442\u043e\u0439 \u043a\u043d\u043e\u043f\u043a\u0435<\/li>\n<\/ol>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/xd\/35\/yw\/xd35ywvtuzrtfatqpnigdlaxzo0.png\"\/><\/p>\n<p>  <\/p>\n<p><strong>\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043d\u0443\u0436\u043d\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u0434\u043b\u044f \u043d\u0430\u0448\u0438\u0445 \u0442\u0435\u0441\u0442\u043e\u0432 \u0432 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438:<\/strong><\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b.<\/p>\n<p>  <\/p>\n<ul>\n<li><code>pip install requests<\/code> \u2014 \u0434\u043b\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u043a \u0441\u0435\u0440\u0432\u0438\u0441\u0443 Dog Api<\/li>\n<li><code>pip install pytest<\/code> \u2014 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432, \u0441\u0430\u043c\u043e \u0441\u043e\u0431\u043e\u0439<\/li>\n<li><code>pip install pytest-xdist<\/code> \u2014 \u0434\u043b\u044f \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u0435\u0441\u0442\u043e\u0432<\/li>\n<li><code>pip install allure-pytest<\/code> \u2014 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u0442\u0447\u0435\u0442\u043e\u0432 \u0432 allure<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u043e \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435<br \/>  <code>pip freeze &gt; requirements.txt<\/code>. <\/p>\n<p>  <\/p>\n<blockquote><p>\u0424\u0430\u0439\u043b <code>requirements.txt<\/code> \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0442\u0435\u0441\u0442\u043e\u0432 \u0432\u043d\u0443\u0442\u0440\u0438 \u0434\u043e\u043a\u0435\u0440 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430.<\/p><\/blockquote>\n<p>  <\/p>\n<h3 id=\"napisanie-fikstury-i-nebolshogo-klienta-dlya-api-testov\">\u041d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u044b \u0438 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u0434\u043b\u044f API \u0442\u0435\u0441\u0442\u043e\u0432<\/h3>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u043d\u0430\u0448\u0438 \u0442\u0435\u0441\u0442\u044b \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043a\u043b\u0438\u0435\u043d\u0442 \u0434\u043b\u044f GET \u0438 POST \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432. \u0414\u0430\u043b\u0435\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430. \u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u044d\u0442\u043e \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0438\u043b\u0438 \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u043c, \u0442\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u044d\u0442\u0443 \u0447\u0430\u0441\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u0438 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u0435 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439. \u041d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0435\u0451 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u043d\u0435\u0442 \u044f\u0441\u043d\u043e \u043a\u0430\u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u043c.<\/p>\n<p>  <\/p>\n<p><strong>\u0421\u0430\u043c\u0430 \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u0430<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">@pytest.fixture def dog_api():     return ApiClient(base_address=&quot;https:\/\/dog.ceo\/api\/&quot;)<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0438\u0436\u0435 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 \u0434\u043b\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u0430. \u041f\u0440\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043a\u043b\u0430\u0441\u0441 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 base_address, \u043d\u0430 \u0435\u0433\u043e \u043c\u0435\u0441\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u0435 \u043e\u0431\u0449\u0438\u0439 \u0430\u0434\u0440\u0435\u0441 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d <code>https:\/\/dog.ceo\/api\/<\/code>. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u0441 \u0431\u0430\u0437\u043e\u0432\u044b\u043c \u0430\u0434\u0440\u0435\u0441\u043e\u043c \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0445 GET \u0438 POST \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">class ApiClient:     def __init__(self, base_address):         self.base_address = base_address<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u043a\u043b\u0430\u0441\u0441 \u043c\u0435\u0442\u043e\u0434 GET \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">    def get(self, path=&quot;\/&quot;, params=None, headers=None):         url = f&quot;{self.base_address}{path}&quot;         return requests.get(url=url, params=params, headers=headers)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043d\u0430\u0448 \u043a\u043b\u0438\u0435\u043d\u0442 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u0435\u0440\u0442\u043a\u043e\u0439 \u043d\u0430\u0434 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 requests. \u0412 \u043a\u043b\u0430\u0441\u0441\u0435 ApiClient \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b <code>path<\/code>, <code>params<\/code>, <code>headers<\/code> \u043c\u0435\u0442\u043e\u0434\u0430 <code>get<\/code> \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u044e\u0442 \u0432 \u0440\u043e\u043b\u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0432 <code>requests.get(url=url, params=params, headers=headers)<\/code>. \u0418\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u0430 \u0441\u0442\u0440\u043e\u0447\u043a\u0430 \u0438 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432. \u0418\u0437 \u0430\u0434\u0440\u0435\u0441\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438 \u043f\u0443\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0434\u0438\u043c \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u0432 \u0445\u043e\u0434\u0435 \u0442\u0435\u0441\u0442\u0430, \u0431\u0443\u0434\u0435\u0442 \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u043b\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 <code>requests.get<\/code>.<\/p>\n<p>  <\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u043a\u043b\u0430\u0441\u0441 \u043c\u0435\u0442\u043e\u0434 POST. \u0415\u0433\u043e \u043b\u043e\u0433\u0438\u043a\u0430 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u0430, \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u043c\u0438.<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">    def post(self, path=&quot;\/&quot;, params=None, data=None, json=None, headers=None):         url = f&quot;{self.base_address}{path}&quot;         return requests.post(url=url, params=params, data=data, json=json, headers=headers)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u0443 \u043d\u0430\u0441 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a\u043e\u0439 \u0444\u0430\u0439\u043b conftest.py:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">import pytest import requests  class ApiClient:     def __init__(self, base_address):         self.base_address = base_address      def post(self, path=&quot;\/&quot;, params=None, data=None, json=None, headers=None):         url = f&quot;{self.base_address}{path}&quot;         return requests.post(url=url, params=params, data=data, json=json, headers=headers)      def get(self, path=&quot;\/&quot;, params=None, headers=None):         url = f&quot;{self.base_address}{path}&quot;         return requests.get(url=url, params=params, headers=headers)  @pytest.fixture def dog_api():     return ApiClient(base_address=&quot;https:\/\/dog.ceo\/api\/&quot;) <\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"pishem-testy\">\u041f\u0438\u0448\u0435\u043c \u0442\u0435\u0441\u0442\u044b<\/h2>\n<p>  <\/p>\n<p>\u0412 \u0441\u0430\u043c\u043e\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u0435 Dog API \u0435\u0441\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432. \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u043e\u043f\u044b\u0442 \u0432 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0442\u0435\u0441\u0442\u043e\u0432, \u0442\u043e \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u0441\u0442\u043e\u0432. \u0422\u0430\u043a \u043a\u0430\u043a \u0430\u043a\u0446\u0435\u043d\u0442 \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u043e\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432, \u044f \u043d\u0435 \u0431\u0443\u0434\u0443 \u0432\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0442\u0435\u0441\u0442\u043e\u0432. \u0420\u0430\u043d\u0435\u0435 \u044f \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043b, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0439 \u043a\u043e\u0434 \u0431\u044b\u043b \u0431\u043e\u043b\u0435\u0435 \u043c\u0435\u043d\u0435\u0435 \u043f\u043e\u043d\u044f\u0442\u0435\u043d. \u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u043e\u0432 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0441\u043b\u043e\u043c\u0430\u043d\u044b, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u0430\u043a \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u044b \u0432 \u043e\u0442\u0447\u0435\u0442\u0435. \u0422\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043c\u043e\u0439 \u0444\u0430\u0439\u043b \u0441 \u0442\u0435\u0441\u0442\u0430\u043c\u0438 <code>test_dog_api.py<\/code><\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">import pytest  def test_get_random_dog(dog_api):     response = dog_api.get(&quot;breeds\/image\/random&quot;)      with allure.step(&quot;\u0417\u0430\u043f\u0440\u043e\u0441 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d, \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u043e\u0434 \u043e\u0442\u0432\u0435\u0442\u0430&quot;):         assert response.status_code == 200, f&quot;\u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u043a\u043e\u0434 \u043e\u0442\u0432\u0435\u0442\u0430, \u043f\u043e\u043b\u0443\u0447\u0435\u043d {response.status_code}&quot;      with allure.step(&quot;\u0417\u0430\u043f\u0440\u043e\u0441 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d. \u0414\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043e\u0442\u0432\u0435\u0442 \u0438\u0437 json \u0432 \u0441\u043b\u043e\u0432\u0430\u0440\u044c.&quot;):         response = response.json()         assert response[&quot;status&quot;] == &quot;success&quot;      with allure.step(f&quot;\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 {response}&quot;):         with allure.step(f&quot;\u0412\u043b\u043e\u0436\u0438\u043c \u0448\u0430\u0433\u0438 \u0434\u0440\u0443\u0433 \u0432 \u0434\u0440\u0443\u0433\u0430 \u043f\u043e \u043f\u0440\u0438\u043a\u043e\u043b\u0443&quot;):             with allure.step(f&quot;\u041d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0447\u0442\u043e-\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435&quot;):                 pass  @pytest.mark.parametrize(&quot;breed&quot;, [     &quot;afghan&quot;,     &quot;basset&quot;,     &quot;blood&quot;,     &quot;english&quot;,     &quot;ibizan&quot;,     &quot;plott&quot;,     &quot;walker&quot; ]) def test_get_random_breed_image(dog_api, breed):     response = dog_api.get(f&quot;breed\/hound\/{breed}\/images\/random&quot;)     response = response.json()     assert breed in response[&quot;message&quot;], f&quot;\u041d\u0435\u0442 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u043f\u043e\u0440\u043e\u0434\u043e\u0439, \u043e\u0442\u0432\u0435\u0442 {response}&quot;  @pytest.mark.parametrize(&quot;file&quot;, ['.md', '.MD', '.exe', '.txt']) def test_get_breed_images(dog_api, file):     response = dog_api.get(&quot;breed\/hound\/images&quot;)     response = response.json()     result = '\\n'.join(response[&quot;message&quot;])     assert file not in result, f&quot;\u0412 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0438 \u0435\u0441\u0442\u044c \u0444\u0430\u0439\u043b \u0441 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\u043c {file}&quot;  @pytest.mark.parametrize(&quot;breed&quot;, [     &quot;african&quot;,     &quot;boxer&quot;,     &quot;entlebucher&quot;,     &quot;elkhound&quot;,     &quot;shiba&quot;,     &quot;whippet&quot;,     &quot;spaniel&quot;,     &quot;dvornyaga&quot; ]) def test_get_random_breed_images(dog_api, breed):     response = dog_api.get(f&quot;breed\/{breed}\/images\/&quot;)     response = response.json()     assert response[&quot;status&quot;] == &quot;success&quot;, f&quot;\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u043f\u043e\u0440\u043e\u0434\u044b {breed}&quot;  @pytest.mark.parametrize(&quot;number_of_images&quot;, [i for i in range(1, 10)]) def test_get_few_sub_breed_random_images(dog_api, number_of_images):     response = dog_api.get(f&quot;breed\/hound\/afghan\/images\/random\/{number_of_images}&quot;)     response = response.json()     final_len = len(response[&quot;message&quot;])     assert final_len == number_of_images, f&quot;\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0444\u043e\u0442\u043e \u043d\u0435 {number_of_images}, \u0430 {final_len}&quot; <\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"dobavlyaem-allure-v-testy\">\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c allure \u0432 \u0442\u0435\u0441\u0442\u044b<\/h3>\n<p>  <\/p>\n<p>\u0415\u0441\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432 \u043a \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u0442\u0435\u0441\u0442\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e allure. \u0422\u0430\u043a \u043a\u0430\u043a \u0441\u0435\u0439\u0447\u0430\u0441 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430, \u0442\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0441\u043e\u0432\u0441\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0448\u0430\u0433\u0438. \u0414\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e \u043c\u043d\u043e\u044e \u043a\u043e\u0434\u0430, \u044f \u0432\u0441\u0435 \u0436\u0435 \u043f\u0440\u043e\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u044e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u0432. <\/p>\n<p>  <\/p>\n<p><code>with allure.step('step 1'):<\/code> \u2014 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u0433\u043e \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0430 \u0442\u0435\u043b\u043e \u0442\u0435\u0441\u0442\u0430 \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430 \u0448\u0430\u0433\u0438, \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0435 \u0432 \u043e\u0442\u0447\u0435\u0442\u0435.<br \/>  <code>@allure.feature('Dog Api') @allure.story('Send few requests')<\/code> \u2014 \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440\u044b, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u0430\u043c\u0438 \u0442\u0435\u0441\u0442\u044b \u0438\u043b\u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0435 \u043d\u0430\u0431\u043e\u0440\u044b \u0431\u0443\u0434\u0443\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0432 \u043e\u0442\u0447\u0435\u0442\u0435<\/p>\n<p>  <\/p>\n<blockquote><p>\u042d\u0442\u043e \u043b\u0438\u0448\u044c \u043c\u0430\u043b\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 allure, \u043d\u043e \u0434\u043b\u044f \u0432\u044b\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043d\u0438\u044f \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0438 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0442\u0435\u0441\u0442\u043e\u0432 \u044d\u0442\u043e\u0433\u043e \u0445\u0432\u0430\u0442\u0438\u0442. \u0415\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u043e \u0432\u0441\u0435\u0439 \u043f\u043e\u043b\u043d\u043e\u0442\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438 allure, \u0442\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 <a href=\"https:\/\/docs.qameta.io\/allure\/#_python\">\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439<\/a><\/p><\/blockquote>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u043d\u0430\u0448 API \u043a\u043b\u0438\u0435\u043d\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e allure \u0448\u0430\u0433\u043e\u0432.<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">class ApiClient:     def __init__(self, base_address):         self.base_address = base_address      def post(self, path=&quot;\/&quot;, params=None, data=None, json=None, headers=None):         url = f&quot;{self.base_address}{path}&quot;         with allure.step(f'POST request to: {url}'):             return requests.post(url=url, params=params, data=data, json=json, headers=headers)      def get(self, path=&quot;\/&quot;, params=None, headers=None):         url = f&quot;{self.base_address}{path}&quot;         with allure.step(f'GET request to: {url}'):             return requests.get(url=url, params=params, headers=headers)<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440\u044b \u0432 \u0442\u0435\u0441\u0442\u044b \u0438 \u0441\u043d\u0430\u0431\u0434\u0438\u043c \u0438\u0445 \u0448\u0430\u0433\u0430\u043c\u0438. \u0422\u0430\u043a \u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044e \u0438\u0437\u043b\u0438\u0448\u043d\u0438\u0435 \u0448\u0430\u0433\u0438, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u0442\u0447\u0435\u0442\u0430 \u043e\u0442 \u043a\u043e\u0434\u0430. \u0417\u0434\u0435\u0441\u044c \u043d\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u043b\u0443\u0447\u0448\u0438\u0435 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0438 \u043f\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u0442\u0435\u043a\u0441\u0442\u0430 \u0434\u043b\u044f \u0448\u0430\u0433\u043e\u0432. \u0422\u0435\u043a\u0441\u0442 \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e \u043d\u0435\u0444\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u0432\u043e\u0441\u043f\u0440\u0438\u044f\u0442\u0438\u044f \u043a\u043e\u0434\u0430 \u0438 \u043e\u0442\u0447\u0435\u0442\u0430. <\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">@allure.feature('Random dog') @allure.story('\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0444\u043e\u0442\u043e \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0439 \u0441\u043e\u0431\u0430\u043a\u0438 \u0438 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0434\u0440\u0443\u0433 \u0432 \u0434\u0440\u0443\u0433\u0430 \u0448\u0430\u0433\u0438') def test_get_random_dog(dog_api):     response = dog_api.get(&quot;breeds\/image\/random&quot;)      with allure.step(&quot;\u0417\u0430\u043f\u0440\u043e\u0441 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d, \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u043e\u0434 \u043e\u0442\u0432\u0435\u0442\u0430&quot;):         assert response.status_code == 200, f&quot;\u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u043a\u043e\u0434 \u043e\u0442\u0432\u0435\u0442\u0430, \u043f\u043e\u043b\u0443\u0447\u0435\u043d {response.status_code}&quot;      with allure.step(&quot;\u0417\u0430\u043f\u0440\u043e\u0441 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d. \u0414\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043e\u0442\u0432\u0435\u0442 \u0438\u0437 json \u0432 \u0441\u043b\u043e\u0432\u0430\u0440\u044c.&quot;):         response = response.json()         assert response[&quot;status&quot;] == &quot;success&quot;      with allure.step(f&quot;\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 {response}&quot;):         with allure.step(f&quot;\u0412\u043b\u043e\u0436\u0438\u043c \u0448\u0430\u0433\u0438 \u0434\u0440\u0443\u0433 \u0432 \u0434\u0440\u0443\u0433\u0430 \u043f\u043e \u043f\u0440\u0438\u043a\u043e\u043b\u0443&quot;):             with allure.step(f&quot;\u041d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0447\u0442\u043e-\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435&quot;):                 pass <\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u0445\u043e\u0434\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u043c \u0448\u0430\u0433\u0430\u043c\u0438 \u0438 \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440\u0430\u043c\u0438 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u044b. \u0424\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0444\u0430\u0439\u043b <code>test_dog_api.py<\/code><\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">import pytest import allure  @allure.feature('Random dog') @allure.story('\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0444\u043e\u0442\u043e \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0439 \u0441\u043e\u0431\u0430\u043a\u0438 \u0438 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0434\u0440\u0443\u0433 \u0432 \u0434\u0440\u0443\u0433\u0430 \u0448\u0430\u0433\u0438') def test_get_random_dog(dog_api):     response = dog_api.get(&quot;breeds\/image\/random&quot;)      with allure.step(&quot;\u0417\u0430\u043f\u0440\u043e\u0441 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d, \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u043e\u0434 \u043e\u0442\u0432\u0435\u0442\u0430&quot;):         assert response.status_code == 200, f&quot;\u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u043a\u043e\u0434 \u043e\u0442\u0432\u0435\u0442\u0430, \u043f\u043e\u043b\u0443\u0447\u0435\u043d {response.status_code}&quot;      with allure.step(&quot;\u0417\u0430\u043f\u0440\u043e\u0441 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d. \u0414\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043e\u0442\u0432\u0435\u0442 \u0438\u0437 json \u0432 \u0441\u043b\u043e\u0432\u0430\u0440\u044c.&quot;):         response = response.json()         assert response[&quot;status&quot;] == &quot;success&quot;      with allure.step(f&quot;\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 {response}&quot;):         with allure.step(f&quot;\u0412\u043b\u043e\u0436\u0438\u043c \u0448\u0430\u0433\u0438 \u0434\u0440\u0443\u0433 \u0432 \u0434\u0440\u0443\u0433\u0430 \u043f\u043e \u043f\u0440\u0438\u043a\u043e\u043b\u0443&quot;):             with allure.step(f&quot;\u041d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0447\u0442\u043e-\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435&quot;):                 pass  @allure.feature('Random dog') @allure.story('\u0424\u043e\u0442\u043e \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0439 \u0441\u043e\u0431\u0430\u043a\u0438 \u0438\u0437 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u043f\u043e\u0440\u043e\u0434\u044b') @pytest.mark.parametrize(&quot;breed&quot;, [     &quot;afghan&quot;,     &quot;basset&quot;,     &quot;blood&quot;,     &quot;english&quot;,     &quot;ibizan&quot;,     &quot;plott&quot;,     &quot;walker&quot; ]) def test_get_random_breed_image(dog_api, breed):     response = dog_api.get(f&quot;breed\/hound\/{breed}\/images\/random&quot;)      with allure.step(&quot;\u0417\u0430\u043f\u0440\u043e\u0441 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d. \u0414\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043e\u0442\u0432\u0435\u0442 \u0438\u0437 json \u0432 \u0441\u043b\u043e\u0432\u0430\u0440\u044c.&quot;):         response = response.json()      assert breed in response[&quot;message&quot;], f&quot;\u041d\u0435\u0442 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0444\u043e\u0442\u043e \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u043f\u043e\u0440\u043e\u0434\u043e\u0439, \u043e\u0442\u0432\u0435\u0442 {response}&quot;  @allure.feature('List of dog images') @allure.story('\u0421\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u0444\u043e\u0442\u043e \u0441\u043e\u0431\u0430\u043a \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f') @pytest.mark.parametrize(&quot;file&quot;, ['.md', '.MD', '.exe', '.txt']) def test_get_breed_images(dog_api, file):     response = dog_api.get(&quot;breed\/hound\/images&quot;)      with allure.step(&quot;\u0417\u0430\u043f\u0440\u043e\u0441 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d. \u0414\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043e\u0442\u0432\u0435\u0442 \u0438\u0437 json \u0432 \u0441\u043b\u043e\u0432\u0430\u0440\u044c.&quot;):         response = response.json()      with allure.step(&quot;\u0421\u043e\u0435\u0434\u0438\u043d\u0438\u043c \u0432\u0441\u0435 \u0441\u0441\u044b\u043b\u043a\u0438 \u0432 \u043e\u0442\u0432\u0435\u0442\u0435 \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0432 \u0441\u0442\u0440\u043e\u043a\u0443&quot;):         result = '\\n'.join(response[&quot;message&quot;])      assert file not in result, f&quot;\u0412 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0438 \u0435\u0441\u0442\u044c \u0444\u0430\u0439\u043b \u0441 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\u043c {file}&quot;  @allure.feature('List of dog images') @allure.story('\u0421\u043f\u0438\u0441\u043e\u043a \u0444\u043e\u0442\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u043f\u043e\u0440\u043e\u0434') @pytest.mark.parametrize(&quot;breed&quot;, [     &quot;african&quot;,     &quot;boxer&quot;,     &quot;entlebucher&quot;,     &quot;elkhound&quot;,     &quot;shiba&quot;,     &quot;whippet&quot;,     &quot;spaniel&quot;,     &quot;dvornyaga&quot; ]) def test_get_random_breed_images(dog_api, breed):     response = dog_api.get(f&quot;breed\/{breed}\/images\/&quot;)      with allure.step(&quot;\u0417\u0430\u043f\u0440\u043e\u0441 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d. \u0414\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043e\u0442\u0432\u0435\u0442 \u0438\u0437 json \u0432 \u0441\u043b\u043e\u0432\u0430\u0440\u044c.&quot;):         response = response.json()      assert response[&quot;status&quot;] == &quot;success&quot;, f&quot;\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u043f\u043e\u0440\u043e\u0434\u044b {breed}&quot;  @allure.feature('List of dog images') @allure.story('\u0421\u043f\u0438\u0441\u043e\u043a \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0444\u043e\u0442\u043e') @pytest.mark.parametrize(&quot;number_of_images&quot;, [i for i in range(1, 10)]) def test_get_few_sub_breed_random_images(dog_api, number_of_images):     response = dog_api.get(f&quot;breed\/hound\/afghan\/images\/random\/{number_of_images}&quot;)      with allure.step(&quot;\u0417\u0430\u043f\u0440\u043e\u0441 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d. \u0414\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043e\u0442\u0432\u0435\u0442 \u0438\u0437 json \u0432 \u0441\u043b\u043e\u0432\u0430\u0440\u044c.&quot;):         response = response.json()      with allure.step(&quot;\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0434\u043b\u0438\u043d\u0443 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043e \u0441\u0441\u044b\u043b\u043a\u0430\u043c\u0438 \u043d\u0430 \u0444\u043e\u0442\u043e&quot;):         final_len = len(response[&quot;message&quot;])      assert final_len == number_of_images, f&quot;\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0444\u043e\u0442\u043e \u043d\u0435 {number_of_images}, \u0430 {final_len}&quot; <\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"delaem-infrastrukturu-dlya-testov\">\u0414\u0435\u043b\u0430\u0435\u043c \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432<\/h2>\n<p>  <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u0432, \u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u0442\u043e\u0438\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c:<\/p>\n<p>  <\/p>\n<ul>\n<li><code>.gitlab-ci.yml<\/code> \u2014 \u0444\u0430\u0439\u043b, \u0433\u0434\u0435 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 \u0440\u0430\u0437\u043c\u0435\u0442\u043a\u0438 yaml \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c gitlab runner <\/li>\n<li><code>gitlab-runner<\/code> \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0435\u043a\u0442, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 Go. \u041e\u043d \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438. \u0415\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f. \u041c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e \u0434\u043b\u044f gitlab runner, \u0433\u0434\u0435 \u043e\u043d \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c docker \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0442\u0435\u0441\u0442\u043e\u0432 \u0438 \u0432\u0441\u0435\u0433\u043e \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e. \u0414\u0430\u043b\u0435\u0435 \u043f\u043e \u0442\u0435\u043a\u0441\u0442\u0443 \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e &quot;\u0440\u0430\u043d\u043d\u0435\u0440&quot;. <a href=\"https:\/\/docs.gitlab.com\/runner\/\">\u0427\u0442\u043e \u044d\u0442\u043e \u0437\u0430 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u0438 \u0441 \u0447\u0435\u043c \u0435\u0451 \u0435\u0434\u044f\u0442 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0437\u0434\u0435\u0441\u044c.<\/a><\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0443\u0436\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0438 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0441\u0432\u043e\u0435\u0433\u043e devops \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0432\u0430\u043c \u0440\u0430\u043d\u043d\u0435\u0440 \u0433\u0434\u0435-\u0442\u043e \u0432 \u043e\u0431\u043b\u0430\u043a\u0435, \u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0439\u0442\u0435 \u044d\u0442\u043e. \u0420\u0430\u043d\u043d\u0435\u0440 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u043d\u0430 \u0441\u0432\u043e\u0435\u043c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 docker desktop \u043d\u0430 windows. \u0412 \u044d\u0442\u043e\u043c \u0433\u0430\u0439\u0434\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u043d\u043d\u0435\u0440, \u043d\u043e \u0434\u043b\u044f \u043e\u0431\u043b\u0430\u0447\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0432 .gitlab-ci \u043d\u0443\u0436\u043d\u044b\u0439 \u0440\u0430\u043d\u043d\u0435\u0440.<\/p>\n<p>  <\/p>\n<blockquote><p><a href=\"https:\/\/docs.docker.com\/docker-for-windows\/install\/\">\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043d\u0435\u0442 docker desktop, \u0442\u043e \u0437\u0434\u0435\u0441\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043a\u0430\u043a \u0435\u0433\u043e \u0437\u0430\u0438\u043c\u0435\u0442\u044c.<\/a><\/p><\/blockquote>\n<p>  <\/p>\n<h3 id=\"nastroyka-repozitoriya\">\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f<\/h3>\n<p>  <\/p>\n<p>\u041d\u0443\u0436\u043d\u043e \u0437\u0430\u0439\u0442\u0438 \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f <code>Settings -&gt; General -&gt; Visibility, project features, permissions<\/code>, \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c <code>Pipelines<\/code> \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/jr\/vj\/ek\/jrvjekcvhzamxmvvm9dbugc9rmc.png\"\/><\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0440\u0430\u0437\u0434\u0435\u043b <code>CI \/ CD<\/code>. \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c <code>Settings -&gt; CI \/ CD -&gt; Runners<\/code><\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/rl\/h_\/pe\/rlh_pe1llpblcuduirtyhiaunjc.png\"\/><\/p>\n<p>  <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043f\u043e <a href=\"https:\/\/docs.gitlab.com\/runner\/install\/\">\u0441\u0441\u044b\u043b\u043a\u0435<\/a> \u0432 \u043f\u0443\u043d\u043a\u0442\u0435 1 \u0438 \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0441\u0442\u0430\u0432\u0438\u043c \u0441\u0435\u0431\u0435 \u043d\u0430 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440 Gitlab Runner. \u0414\u0430\u043b\u0435\u0435 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u0430\u0434\u0430\u043f\u0442\u0430\u0446\u0438\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c.<\/p>\n<p>  <\/p>\n<h3 id=\"ustanovka-i-nastroyka-gitlab-runner\">\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Gitlab Runner<\/h3>\n<p>  <\/p>\n<p>\u041d\u0438\u0436\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0439\u0442\u0438 <a href=\"https:\/\/docs.gitlab.com\/runner\/install\/\">\u0437\u0434\u0435\u0441\u044c<\/a>. \u041c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u043e\u0439\u0442\u0438\u0441\u044c \u043f\u043e \u043d\u0435\u0439 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e. \u0414\u0430\u043b\u0435\u0435 \u0432 \u0442\u0435\u043a\u0441\u0442\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0432\u0441\u0435 \u043f\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438.<\/p>\n<p>  <\/p>\n<ol>\n<li>\u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u043f\u0430\u043f\u043a\u0443 \u0433\u0434\u0435-\u043d\u0438\u0431\u0443\u0434\u044c \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: C:\\GitLab-Runner.<\/li>\n<li>\u0421\u043a\u0430\u0447\u0430\u0439\u0442\u0435 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a \u0434\u043b\u044f x86 \u0438\u043b\u0438 amd64 \u0438 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435 \u0435\u0433\u043e \u0432 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u0443\u044e \u043f\u0430\u043f\u043a\u0443. \u041f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u0443\u0439\u0442\u0435 \u0441\u043a\u0430\u0447\u0430\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0432 gitlab-runner.exe. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 <a href=\"https:\/\/docs.gitlab.com\/runner\/install\/bleeding-edge.html\">\u0437\u0434\u0435\u0441\u044c<\/a><\/li>\n<li>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 <a href=\"https:\/\/docs.microsoft.com\/en-us\/powershell\/scripting\/windows-powershell\/starting-windows-powershell?view=powershell-7#with-administrative-privileges-run-as-administrator\">\u0441 \u043f\u0440\u0430\u0432\u0430\u043c\u0438 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430<\/a>. (\u0421\u0430\u043c \u044f \u0431\u0443\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u044b\u0439 powershell \u0441 \u043f\u0440\u0430\u0432\u0430\u043c\u0438 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430)<\/li>\n<li><a href=\"https:\/\/docs.gitlab.com\/runner\/register\/index.html\">\u0417\u0430\u0440\u0435\u0433\u0435\u0441\u0442\u0440\u0438\u0440\u0443\u0439\u0442\u0435 \u0440\u0430\u043d\u043d\u0435\u0440<\/a><\/li>\n<li>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 \u0440\u0430\u043d\u043d\u0435\u0440 \u043a\u0430\u043a \u0441\u0435\u0440\u0432\u0438\u0441 \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u0435\u0433\u043e. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u043b\u0443\u0436\u0431\u0443, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u0443\u044e \u0443\u0447\u0435\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c (\u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f) \u0438\u043b\u0438 \u0443\u0447\u0435\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.<\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u0421 \u043f\u0435\u0440\u0432\u044b\u043c\u0438 \u0442\u0440\u0435\u043c\u044f \u043f\u0443\u043d\u043a\u0442\u0430\u043c\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0432\u0441\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u043e. \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0430\u043f\u043a\u0443, \u043a\u043b\u0430\u0434\u0435\u043c \u0432 \u043d\u0435\u0451 \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0440\u0430\u043d\u043d\u0435\u0440 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 powershell, \u0442\u043e \u0441 \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u044b\u043c \u0438 \u043f\u044f\u0442\u044b\u043c \u043f\u0443\u043d\u043a\u0442\u043e\u043c \u043c\u043e\u0433\u0443\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0438 \u043d\u0435\u0434\u043e\u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438. \u0414\u0430\u043b\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0448\u0430\u0433\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u043d\u043d\u0435\u0440 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b.<\/p>\n<p>  <\/p>\n<p>\u042f \u0441\u043e\u0437\u0434\u0430\u043b \u043f\u0430\u043f\u043a\u0443 C:\\gitlab_runners \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b \u0442\u0443\u0434\u0430 \u0441\u043a\u0430\u0447\u0430\u043d\u043d\u044b\u0439 \u0434\u043b\u044f \u043c\u043e\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0440\u0430\u043d\u043d\u0435\u0440, \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0432 \u0432 gitlab-runner.exe<\/p>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u044b \u0441\u043f\u0440\u0430\u0432\u0438\u043b\u0438\u0441\u044c \u0441 \u043f\u0435\u0440\u0432\u044b\u043c\u0438 \u0442\u0440\u0435\u043c\u044f \u043f\u0443\u043d\u043a\u0442\u0430\u043c\u0438, \u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<p>  <\/p>\n<ol>\n<li>\u0412\u0432\u0435\u0441\u0442\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0443:<br \/>  <code>.\/gitlab-runner.exe register<\/code><\/li>\n<li>\u0412\u0432\u0435\u0441\u0442\u0438 url, \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0440\u0430\u043d\u043d\u0435\u0440\u043e\u0432 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438 \u0432 \u043f\u0443\u043d\u043a\u0442\u0435 2. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443 \u043c\u0435\u043d\u044f \u0442\u0430\u043a:<br \/>  <code>https:\/\/gitlab.somesubdomain.com\/<\/code><\/li>\n<li>\u0412\u0432\u0435\u0441\u0442\u0438 \u0442\u043e\u043a\u0435\u043d \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0440\u0430\u043d\u043d\u0435\u0440\u043e\u0432 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438 \u0432 \u043f\u0443\u043d\u043a\u0442\u0435 3. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443 \u043c\u0435\u043d\u044f \u0442\u0430\u043a:<br \/>  <code>tJTUaJ7JxfL4yafEyF3k<\/code><\/li>\n<li>\u0412\u0432\u043e\u0434\u0438\u043c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0440\u0430\u043d\u043d\u0435\u0440\u0430. \u0415\u0433\u043e \u043f\u043e\u0442\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 UI \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u043a\u0430\u0445 \u0440\u0430\u043d\u043d\u0435\u0440\u0430 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u0430\u043a:<br \/>  <code>Runner on windows for autotests<\/code><\/li>\n<li>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u0435\u0433\u0438 \u0434\u043b\u044f \u0440\u0430\u043d\u043d\u0435\u0440\u0430, \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0439 \u0440\u0430\u043d\u043d\u0435\u0440 \u0432 .gitlab-ci.yml, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0442\u0435\u0433\u0438. \u042d\u0442\u043e \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043d\u0443\u0436\u043d\u043e, \u043a\u043e\u0433\u0434\u0430 \u0440\u0430\u043d\u043d\u0435\u0440\u043e\u0432 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u0434\u043d\u043e\u0433\u043e.<br \/>  <code>docker, windows<\/code><\/li>\n<li>\u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0442\u0438\u043f \u0440\u0430\u043d\u043d\u0435\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d. \u0417\u0434\u0435\u0441\u044c \u0432\u044b\u0431\u0435\u0440\u0435\u043c docker<br \/>  <code>docker<\/code><\/li>\n<li>\u0412\u0432\u043e\u0434\u0438\u043c \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0439 image, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0440\u0430\u043d\u043d\u0435\u0440\u043e\u043c. \u0415\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0435 \u0440\u0430\u043d\u043d\u0435\u0440\u0430 \u0438\u043b\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u044b\u0439 \u0432 <code>.gitlab-ci.yml<\/code><br \/>  <code>python:3.8-alpine<\/code><\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u0421\u043a\u0440\u043d\u0448\u043e\u0442 \u0441 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u044b\u043c\u0438 \u0448\u0430\u0433\u0430\u043c\u0438<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/5j\/uj\/wh\/5jujwhfs1e3ih7ylshp6_y4xb10.png\"\/><\/p>\n<p>  <\/p>\n<p>\u041d\u0430\u0448 \u0440\u0430\u043d\u043d\u0435\u0440 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d, \u0442\u0435\u043f\u0435\u0440\u044c \u0435\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c.<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0441\u0442\u0430\u0442\u0443\u0441 \u0440\u0430\u043d\u043d\u0435\u0440\u0430 \u043c\u043e\u0436\u043d\u043e \u0442\u0430\u043a:<br \/>  <code>.\\gitlab-runner.exe status<\/code><\/p>\n<p>  <\/p>\n<p>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u0440\u0430\u043d\u043d\u0435\u0440 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e:<br \/>  <code>.\\gitlab-runner.exe run<\/code><\/p>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u0435\u0441\u043b\u0438 \u0432\u044b \u0437\u0430\u0439\u0434\u0435\u0442\u0435 \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u043a\u0438 \u0440\u0430\u043d\u043d\u0435\u0440\u043e\u0432 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 <code>Settings -&gt; CI \/ CD -&gt; Runners<\/code>, \u0442\u043e \u0443\u0432\u0438\u0434\u0438\u0442\u0435 \u0447\u0442\u043e-\u0442\u043e \u0442\u0430\u043a\u043e\u0435:<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/wf\/wj\/zb\/wfwjzbbhtfimcny-fpli8zssxvu.png\"\/><\/p>\n<p>  <\/p>\n<p>\u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0443 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u0435\u0441\u0442\u044c \u043b\u0438\u043d\u043a \u0441 \u0440\u0430\u043d\u043d\u0435\u0440\u043e\u043c \u0438 \u043e\u043d \u0432\u0438\u0434\u0438\u0442 \u0435\u0433\u043e \u0441\u0442\u0430\u0442\u0443\u0441. \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0447\u0435\u043a\u0431\u043e\u043a\u0441 \u0432 \u0440\u0430\u043d\u043d\u0435\u0440\u0435. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0436\u0430\u0442\u044c \u043d\u0430 \u043a\u0430\u0440\u0430\u043d\u0434\u0430\u0448 \u0440\u044f\u0434\u043e\u043c \u0441 \u0438\u043c\u0435\u043d\u0435\u043c \u0440\u0430\u043d\u043d\u0435\u0440\u0430 \u0432 \u0433\u0438\u0442\u043b\u0430\u0431\u0435.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/pb\/wf\/1c\/pbwf1ceuoxqor1ljrhl1h_6mhuc.png\"\/><\/p>\n<p>  <\/p>\n<p>\u0412\u0441\u0435 \u0445\u043e\u0440\u043e\u0448\u043e, \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0443.<\/p>\n<p>  <\/p>\n<h3 id=\"nastroyka-payplayna-v-gitlab-ciyml\">\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430 \u0432 .gitlab-ci.yml<\/h3>\n<p>  <\/p>\n<p>\u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0440\u0430\u043d\u043d\u0435\u0440\u0430 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 <code>.gitlab-ci.yml<\/code>. \u041f\u043e\u043b\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0430 <a href=\"https:\/\/docs.gitlab.com\/ee\/ci\/yaml\/\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<p>  <\/p>\n<p>\u041f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c stages. \u0428\u0430\u0433\u0438 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430. \u0418\u0445 \u0431\u0443\u0434\u0435\u0442 4. \u041a\u0430\u0436\u0434\u044b\u0439 stage \u2014 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 job, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0440\u0430\u043d\u043d\u0435\u0440. <\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">stages:   - testing # \u0417\u0430\u043f\u0443\u0441\u043a \u0442\u0435\u0441\u0442\u043e\u0432   - history_copy # \u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0442\u0435\u0441\u0442\u043e\u0432 \u0438\u0437 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0442\u0435\u0441\u0442\u043e\u0432   - reports # \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043e\u0442\u0447\u0435\u0442\u0430   - deploy # \u041f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u043e\u0442\u0447\u0435\u0442\u0430 \u043d\u0430 gitlab pages<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0428\u0430\u0433 \u043f\u0435\u0440\u0432\u044b\u0439. Testing<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">docker_job: # \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 job   stage: testing # \u041f\u0435\u0440\u0432\u044b\u0439 stage, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c    tags:     - docker # \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u044d\u0442\u043e\u0433\u043e \u0442\u0435\u0433\u0430 gitlab \u043f\u043e\u0439\u043c\u0435\u0442, \u043a\u0430\u043a\u043e\u0439 \u0440\u0430\u043d\u043d\u0435\u0440 \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c. \u041e\u043d \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442 \u0434\u043e\u043a\u0435\u0440 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440, \u0438\u0437 \u043e\u0431\u0440\u0430\u0437\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0438 \u0432 6 \u0448\u0430\u0433\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0440\u0430\u043d\u043d\u0435\u0440\u0430.    before_script:     - pip install -r requirements.txt # \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043f\u0430\u043a\u0435\u0442\u044b \u0432 \u043f\u043e\u0434\u043d\u044f\u0442\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 \u043f\u0435\u0440\u0435\u0434 \u0437\u0430\u043f\u0443\u0441\u043a\u043e\u043c \u0441\u0430\u043c\u0438\u0445 \u0442\u0435\u0441\u0442\u043e\u0432    script:     - pytest -n=4 --alluredir=.\/allure-results tests\/test_dog_api.py # \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0442\u0435\u0441\u0442\u044b \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e(-n=4 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043d\u0430\u043c \u044d\u0442\u043e), \u0443\u043a\u0430\u0437\u0430\u0432 \u043f\u0430\u043f\u043a\u0443 \u0441 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c\u0438 \u0442\u0435\u0441\u0442\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 --alluredir=    allow_failure: true # \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043d\u0430\u043c \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u0442\u0435\u0441\u0442\u044b \u0443\u043f\u0430\u043b\u0438.    artifacts: # \u0421\u0443\u0449\u043d\u043e\u0441\u0442\u044c, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0439, \u043c\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.     when: always # \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0432\u0441\u0435\u0433\u0434\u0430     paths:       - .\/allure-results # \u0417\u0434\u0435\u0441\u044c \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d \u043e\u0442\u0447\u0435\u0442     expire_in: 1 day # \u0414\u0430, \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0443\u0434\u0430\u043b\u0435\u043d \u0447\u0435\u0440\u0435\u0437 \u0434\u0435\u043d\u044c. \u041d\u0435\u0442 \u0441\u043c\u044b\u0441\u043b\u0430 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0435\u0433\u043e \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0440\u043e\u043a\u0430.<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0428\u0430\u0433 \u0432\u0442\u043e\u0440\u043e\u0439. history_copy<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">history_job: # \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 job   stage: history_copy # \u042d\u0442\u043e \u0432\u0442\u043e\u0440\u043e\u0439 stage, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c    tags:     - docker # \u041f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0442\u0435\u043c \u0436\u0435 \u0441\u0430\u043c\u044b\u043c \u0440\u0430\u043d\u043d\u0435\u0440\u043e\u043c    image: storytel\/alpine-bash-curl # \u041d\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0443\u043a\u0430\u0436\u0435\u043c \u0440\u0430\u043d\u043d\u0435\u0440\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0439 \u043e\u0431\u0440\u0430\u0437, \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0442\u0435\u0441\u0442\u0430 \u0438\u0437 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430. \u041d\u0430\u043c \u0436\u0435 \u043d\u0443\u0436\u043d\u0430 \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432, \u0432\u0435\u0440\u043d\u043e?    script:     - 'curl --location --output artifacts.zip &quot;https:\/\/gitlab.smarthead.ru\/api\/v4\/projects\/(\u0410\u0419\u0414\u0418 \u0412\u0410\u0428\u0415\u0413\u041e \u0420\u0415\u041f\u041e\u0417\u0418\u0422\u041e\u0420\u0418\u042f)\/jobs\/artifacts\/master\/download?job=pages&amp;job_token=$CI_JOB_TOKEN&quot;'  # \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e api \u0433\u0438\u0442\u043b\u0430\u0431\u0430 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0444\u0430\u0439\u043b\u044b \u0438\u0437 job, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u043d \u043d\u0438\u0436\u0435. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u0435\u043a\u0441\u0442 \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c \u0432 \u0441\u0441\u044b\u043b\u043a\u0435. \u041e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u0435\u043a\u0441\u0442\u0430 \u0438 \u0441\u043a\u043e\u0431\u043e\u043a \u043d\u043e\u043c\u0435\u0440 \u0432\u0430\u0448\u0435\u0433\u043e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438\u044f     - unzip artifacts.zip # \u0420\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u0444\u0430\u0439\u043b\u044b     - chmod -R 777 public # \u0414\u0430\u0435\u043c \u043f\u0440\u0430\u0432\u0430 \u043b\u044e\u0431\u044b\u0435 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0438 \u0441 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c     - cp -r .\/public\/history .\/allure-results # \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0432 \u043f\u0430\u043f\u043a\u0443 \u0441 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c\u0438 \u0442\u0435\u0441\u0442\u0430    allow_failure: true # \u0422\u0430\u043a \u043a\u0430\u043a \u043f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u043d\u0435\u0442, \u044d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043d\u0430\u043c \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u0430\u0434\u0435\u043d\u0438\u044f \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430. \u0412 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u044d\u0442\u0443 \u0441\u0442\u0440\u043e\u0447\u043a\u0443 \u043c\u043e\u0436\u043d\u043e \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c.    artifacts:      paths:       - .\/allure-results # \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435     expire_in: 1 day   rules:     - when: always # \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0432\u0441\u0435\u0433\u0434\u0430 <\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0428\u0430\u0433 \u0442\u0440\u0435\u0442\u0438\u0439. reports<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">allure_job: # \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 job   stage: reports # \u0422\u0440\u0435\u0442\u0438\u0439 stage, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d    tags:     - docker # \u041f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0442\u0435\u043c \u0436\u0435 \u0441\u0430\u043c\u044b\u043c \u0440\u0430\u043d\u043d\u0435\u0440\u043e\u043c    image: frankescobar\/allure-docker-service # \u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0440\u0430\u043d\u043d\u0435\u0440\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0437 \u0441 allure. \u0412 \u043d\u0435\u043c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u0447\u0435\u0442.    script:      - allure generate -c .\/allure-results -o .\/allure-report # \u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u043e\u0442\u0447\u0435\u0442 \u0438\u0437 .\/allure-results \u0432\u043d\u0443\u0442\u0440\u044c \u043f\u0430\u043f\u043a\u0438 .\/allure-report    artifacts:     paths:       - .\/allure-results # \u041f\u0440\u0438\u043c\u043e\u043d\u0442\u0438\u0440\u0443\u0435\u043c \u0434\u0432\u0435 \u044d\u0442\u0438\u0445 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u0442\u0447\u0435\u0442\u043e\u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e       - .\/allure-report     expire_in: 1 day   rules:     - when: always <\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0428\u0430\u0433 \u0447\u0435\u0442\u0432\u0435\u0440\u0442\u044b\u0439. deploy<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">pages: # \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \u044d\u0442\u043e\u0439 job \u0433\u043e\u0432\u043e\u0440\u0438\u043c \u0433\u0438\u0442\u043b\u0430\u0431\u0443, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0445\u043e\u0441\u0442\u0438\u043b \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0443 \u0441\u0435\u0431\u044f \u0432 pages    stage: deploy # \u0427\u0435\u0442\u0432\u0435\u0440\u0442\u044b\u0439 stage, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d    script:     - mkdir public # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0430\u043f\u043a\u0443 public. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0433\u0438\u0442\u043b\u0430\u0431 \u0445\u043e\u0441\u0442\u0438\u0442 \u0432 gitlab pages \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437 \u043f\u0430\u043f\u043a\u0438 public     - mv .\/allure-report\/* public # \u041f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c \u0432 \u043f\u0430\u043f\u043a\u0443 public \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043e\u0442\u0447\u0435\u0442.    artifacts:     paths:       - public   rules:     - when: always <\/code><\/pre>\n<p>  <\/p>\n<p>\u0424\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 <code>.gitlab-ci.yml<\/code><\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">stages:   - testing # \u0417\u0430\u043f\u0443\u0441\u043a \u0442\u0435\u0441\u0442\u043e\u0432   - history_copy # \u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0442\u0435\u0441\u0442\u043e\u0432 \u0438\u0437 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0442\u0435\u0441\u0442\u043e\u0432   - reports # \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043e\u0442\u0447\u0435\u0442\u0430   - deploy # \u041f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044f \u043e\u0442\u0447\u0435\u0442\u0430 \u043d\u0430 gitlab pages  docker_job: # \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 job   stage: testing # \u041f\u0435\u0440\u0432\u044b\u0439 stage, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c   tags:     - docker # \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u044d\u0442\u043e\u0433\u043e \u0442\u0435\u0433\u0430 gitlab \u043f\u043e\u0439\u043c\u0435\u0442, \u043a\u0430\u043a\u043e\u0439 \u0440\u0430\u043d\u043d\u0435\u0440 \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c. \u041e\u043d \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442 \u0434\u043e\u043a\u0435\u0440 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440, \u0438\u0437 \u043e\u0431\u0440\u0430\u0437\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0438 \u0432 6 \u0448\u0430\u0433\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0440\u0430\u043d\u043d\u0435\u0440\u0430.   before_script:     - pip install -r requirements.txt # \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043f\u0430\u043a\u0435\u0442\u044b \u0432 \u043f\u043e\u0434\u043d\u044f\u0442\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 \u043f\u0435\u0440\u0435\u0434 \u0437\u0430\u043f\u0443\u0441\u043a\u043e\u043c \u0441\u0430\u043c\u0438\u0445 \u0442\u0435\u0441\u0442\u043e\u0432   script:     - pytest -n=4 --alluredir=.\/allure-results tests\/test_dog_api.py # \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0442\u0435\u0441\u0442\u044b \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e(-n=4 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043d\u0430\u043c \u044d\u0442\u043e), \u0443\u043a\u0430\u0437\u0430\u0432 \u043f\u0430\u043f\u043a\u0443 \u0441 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c\u0438 \u0442\u0435\u0441\u0442\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 --alluredir=   allow_failure: true # \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043d\u0430\u043c \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u0442\u0435\u0441\u0442\u044b \u0443\u043f\u0430\u043b\u0438.   artifacts: # \u0421\u0443\u0449\u043d\u043e\u0441\u0442\u044c, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0439, \u043c\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.     when: always # \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0432\u0441\u0435\u0433\u0434\u0430     paths:       - .\/allure-results # \u0417\u0434\u0435\u0441\u044c \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d \u043e\u0442\u0447\u0435\u0442     expire_in: 1 day # \u0414\u0430, \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0443\u0434\u0430\u043b\u0435\u043d \u0447\u0435\u0440\u0435\u0437 \u0434\u0435\u043d\u044c. \u041d\u0435\u0442 \u0441\u043c\u044b\u0441\u043b\u0430 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0435\u0433\u043e \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0440\u043e\u043a\u0430.  history_job: # \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 job   stage: history_copy # \u042d\u0442\u043e \u0432\u0442\u043e\u0440\u043e\u0439 stage, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c   tags:     - docker # \u041f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0442\u0435\u043c \u0436\u0435 \u0441\u0430\u043c\u044b\u043c \u0440\u0430\u043d\u043d\u0435\u0440\u043e\u043c   image: storytel\/alpine-bash-curl # \u041d\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0443\u043a\u0430\u0436\u0435\u043c \u0440\u0430\u043d\u043d\u0435\u0440\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0439 \u043e\u0431\u0440\u0430\u0437, \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0442\u0435\u0441\u0442\u0430 \u0438\u0437 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430. \u041d\u0430\u043c \u0436\u0435 \u043d\u0443\u0436\u043d\u0430 \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432, \u0432\u0435\u0440\u043d\u043e?   script:     - 'curl --location --output artifacts.zip &quot;https:\/\/gitlab.smarthead.ru\/api\/v4\/projects\/(\u0410\u0419\u0414\u0418 \u0412\u0410\u0428\u0415\u0413\u041e \u0420\u0415\u041f\u041e\u0417\u0418\u0422\u041e\u0420\u0418\u042f)\/jobs\/artifacts\/master\/download?job=pages&amp;job_token=$CI_JOB_TOKEN&quot;'  # \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e api \u0433\u0438\u0442\u043b\u0430\u0431\u0430 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0444\u0430\u0439\u043b\u044b \u0438\u0437 job, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u043d \u043d\u0438\u0436\u0435. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u0435\u043a\u0441\u0442 \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c \u0432 \u0441\u0441\u044b\u043b\u043a\u0435. \u041e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u0435\u043a\u0441\u0442\u0430 \u0438 \u0441\u043a\u043e\u0431\u043e\u043a \u043d\u043e\u043c\u0435\u0440 \u0432\u0430\u0448\u0435\u0433\u043e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438\u044f     - unzip artifacts.zip # \u0420\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u0444\u0430\u0439\u043b\u044b     - chmod -R 777 public # \u0414\u0430\u0435\u043c \u043f\u0440\u0430\u0432\u0430 \u043b\u044e\u0431\u044b\u0435 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0438 \u0441 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c     - cp -r .\/public\/history .\/allure-results # \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0432 \u043f\u0430\u043f\u043a\u0443 \u0441 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c\u0438 \u0442\u0435\u0441\u0442\u0430   allow_failure: true # \u0422\u0430\u043a \u043a\u0430\u043a \u043f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u043d\u0435\u0442, \u044d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043d\u0430\u043c \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043f\u0430\u0434\u0435\u043d\u0438\u044f \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430. \u0412 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u044d\u0442\u0443 \u0441\u0442\u0440\u043e\u0447\u043a\u0443 \u043c\u043e\u0436\u043d\u043e \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c.   artifacts:      paths:       - .\/allure-results # \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435     expire_in: 1 day   rules:     - when: always # \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0432\u0441\u0435\u0433\u0434\u0430  allure_job: # \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 job   stage: reports # \u0422\u0440\u0435\u0442\u0438\u0439 stage, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d   tags:     - docker # \u041f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0442\u0435\u043c \u0436\u0435 \u0441\u0430\u043c\u044b\u043c \u0440\u0430\u043d\u043d\u0435\u0440\u043e\u043c   image: frankescobar\/allure-docker-service # \u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0440\u0430\u043d\u043d\u0435\u0440\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0437 \u0441 allure. \u0412 \u043d\u0435\u043c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u0447\u0435\u0442.   script:      - allure generate -c .\/allure-results -o .\/allure-report # \u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u043e\u0442\u0447\u0435\u0442 \u0438\u0437 .\/allure-results \u0432\u043d\u0443\u0442\u0440\u044c \u043f\u0430\u043f\u043a\u0438 .\/allure-report   artifacts:     paths:       - .\/allure-results # \u041f\u0440\u0438\u043c\u043e\u043d\u0442\u0438\u0440\u0443\u0435\u043c \u0434\u0432\u0435 \u044d\u0442\u0438\u0445 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u0442\u0447\u0435\u0442\u043e\u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e       - .\/allure-report     expire_in: 1 day   rules:     - when: always  pages: # \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \u044d\u0442\u043e\u0439 job \u0433\u043e\u0432\u043e\u0440\u0438\u043c \u0433\u0438\u0442\u043b\u0430\u0431\u0443, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0445\u043e\u0441\u0442\u0438\u043b \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0443 \u0441\u0435\u0431\u044f \u0432 pages   stage: deploy # \u0427\u0435\u0442\u0432\u0435\u0440\u0442\u044b\u0439 stage, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d   script:     - mkdir public # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0430\u043f\u043a\u0443 public. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0433\u0438\u0442\u043b\u0430\u0431 \u0445\u043e\u0441\u0442\u0438\u0442 \u0432 gitlab pages \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437 \u043f\u0430\u043f\u043a\u0438 public     - mv .\/allure-report\/* public # \u041f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c \u0432 \u043f\u0430\u043f\u043a\u0443 public \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043e\u0442\u0447\u0435\u0442.   artifacts:     paths:       - public   rules:     - when: always <\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"zapusk-testov-i-prosmotr-otcheta\">\u0417\u0430\u043f\u0443\u0441\u043a \u0442\u0435\u0441\u0442\u043e\u0432 \u0438 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u043e\u0442\u0447\u0435\u0442\u0430<\/h3>\n<p>  <\/p>\n<p>\u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0444\u0430\u0439\u043b\u044b, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e:<\/p>\n<p>  <\/p>\n<ol>\n<li><code>conftest.py<\/code><\/li>\n<li>\u0414\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e <code>tests<\/code><\/li>\n<li><code>requirements.txt<\/code> (\u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0442\u0430\u043c \u0435\u0441\u0442\u044c \u0432\u0441\u0435 \u043d\u0443\u0436\u043d\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438)<\/li>\n<li><code>.gitlab-ci.yml<\/code><\/li>\n<\/ol>\n<p>  <\/p>\n<p>\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0438 \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c.<\/p>\n<p>  <\/p>\n<p>\u0412 \u043f\u0435\u0440\u0432\u044b\u0439 \u0440\u0430\u0437 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0434\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0440\u0430\u0437\u044b. \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0435\u043c\u0443 \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0435 \u043e\u0431\u0440\u0430\u0437\u044b, \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438\u0445 \u0438 \u0432\u0441\u0435 \u0442\u0430\u043a\u043e\u0435. \u0417\u0430\u0445\u043e\u0434\u0438\u043c \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0438 \u0447\u0435\u0440\u0435\u0437 \u0441\u0430\u0439\u0434\u0431\u0430\u0440 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 <code>CI \/ CD -&gt; Pipelines<\/code><\/p>\n<p>  <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0441\u0442\u0430\u0442\u0443\u0441 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a Ci \u043b\u0438\u043d\u0442\u0435\u0440\u0443, \u0433\u0434\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0441\u0432\u043e\u0439 .gitlab-ci.yml. <\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/l6\/rs\/j2\/l6rsj2gkdv2xwqx_vx0atk2bqsw.png\"\/><br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/aw\/ny\/wq\/awnywqzkslhswjnrm3yi1nwdqvq.png\"\/><\/p>\n<p>  <\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u043f\u0440\u043e\u0439\u0434\u0435\u0442, \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443 \u0438 \u0441\u0430\u043c \u043e\u0442\u0447\u0435\u0442 \u043c\u043e\u0436\u043d\u043e \u0447\u0435\u0440\u0435\u0437 <code>Settings -&gt; Pages<\/code>. \u041f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 pages \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u0434\u043e 30 \u043c\u0438\u043d\u0443\u0442. \u041f\u0440\u043e\u0445\u043e\u0434\u0438\u043c \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435 \u0438 \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043e\u0442\u0447\u0435\u0442.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/gl\/pu\/rh\/glpurhr5hc9jz1q-617tacf6yo8.png\"\/><\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u0421\u043e\u0432\u0435\u0442\u0443\u044e \u043f\u043e\u0431\u0440\u043e\u0434\u0438\u0442\u044c \u043f\u043e \u043e\u0442\u0447\u0435\u0442\u0443 \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b. <\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/se\/lm\/hu\/selmhu11p6ffjy94uq_zg5tee3q.png\"\/><\/p>\n<p>  <\/p>\n<p>\u0421\u043b\u043e\u043c\u0430\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u0441\u0442\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u043a\u0430\u043a \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432. \u0417\u0430\u0442\u0435\u043c \u043f\u043e\u0434\u043e\u0436\u0434\u0435\u043c \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/x9\/nd\/6y\/x9nd6yaohykifdn3y24lk3jw6yy.png\"\/><\/p>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u0442\u0435 \u0432\u0442\u043e\u0440\u043e\u0439 \u0448\u0430\u0433 \u0432 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b\u0441\u044f \u0431\u0435\u0437 \u043e\u0448\u0438\u0431\u043e\u043a. \u042d\u0442\u043e \u043f\u043e\u0442\u043e\u043c\u0443, \u043d\u0430 stage history_job \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u043e\u0432 \u043d\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u043e. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0442\u0435\u0441\u0442\u043e\u0432.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/vt\/ee\/xg\/vteexgzff_ty402ne1l0zn2dfsc.png\"\/><\/p>\n<p>  <\/p>\n<p>\u0412\u0438\u0434\u043d\u0430 \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0430, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0443\u043f\u0430\u0432\u0448\u0438\u0445 \u0442\u0435\u0441\u0442\u043e\u0432 \u0438 \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435. \u0414\u043b\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0435\u0439 \u043f\u043e \u0442\u0435\u0441\u0442\u0430\u043c \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043e\u0442\u0447\u0435\u0442 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e. <\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/fp\/gb\/ta\/fpgbtakuduvigxdm9zr82jveb1e.png\"\/><\/p>\n<p>  <\/p>\n<h2 id=\"nastroyka-payplayna-dlya-ui-testov\">\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430 \u0434\u043b\u044f UI \u0442\u0435\u0441\u0442\u043e\u0432<\/h2>\n<p>  <\/p>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0433\u0438\u0442\u043b\u0430\u0431\u0430 <code>[services](https:\/\/docs.gitlab.com\/ee\/ci\/services\/)<\/code>. \u042d\u0442\u043e \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043e\u043a\u0435\u0440 \u043e\u0431\u0440\u0430\u0437\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u044b \u0434\u043e \u0445\u043e\u0434\u0430 \u0448\u0430\u0433\u043e\u0432 \u0432 <code>script<\/code>. \u0414\u043b\u044f UI \u0442\u0435\u0441\u0442\u043e\u0432 \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 job \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">  services:     - selenium\/standalone-chrome:latest<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0443, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0434\u043d\u0438\u043c\u0435\u0442 \u0433\u0438\u0442\u043b\u0430\u0431 \u043f\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u043c\u0443 url, \u0442\u043e \u043e\u043d \u043a\u0430\u043a\u0438\u043c-\u0442\u043e \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043d\u0430\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u044d\u0442\u043e\u043c\u0443 \u0441\u0435\u0440\u0432\u0438\u0441\u0443 url, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0441\u043b\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b. <a href=\"https:\/\/docs.gitlab.com\/ee\/ci\/docker\/using_docker_images.html\">\u041b\u043e\u0433\u0438\u043a\u0430 \u0437\u0434\u0435\u0441\u044c \u0442\u0430\u043a\u0430\u044f:<\/a><\/p>\n<p>  <\/p>\n<ul>\n<li>\u0412\u0441\u0435 \u043f\u043e\u0441\u043b\u0435 <code>:<\/code> \u043e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f<\/li>\n<li>\u0421\u043b\u0435\u0448 <code>\/<\/code> \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0434\u0432\u043e\u0439\u043d\u044b\u043c \u043f\u043e\u0434\u0447\u0435\u0440\u043a\u0438\u0432\u0430\u043d\u0438\u0435\u043c <code>__<\/code> \u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0430\u043b\u0438\u0430\u0441<\/li>\n<li>\u0421\u043b\u0435\u0448 <code>\/<\/code> \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043e\u0434\u0438\u043d\u043e\u0447\u043d\u044b\u043c \u0434\u0435\u0444\u0438\u0441\u043e\u043c <code>-<\/code> \u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0430\u043b\u0438\u0430\u0441 (\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c Gitlab Runner v1.1.0 \u0438 \u0432\u044b\u0448\u0435)<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0418 \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0443\u0436\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0432 \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u0435 executor (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f chromedriver \u043d\u0430 \u0432\u0430\u0448\u0435\u0439 \u043c\u0430\u0448\u0438\u043d\u0435, \u043d\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u043c\u044b \u0432\u0441\u0435 \u044d\u0442\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u0445) \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 ui \u0442\u0435\u0441\u0442\u043e\u0432:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">browser = webdriver.Remote(command_executor=&quot;http:\/\/selenium__standalone-chrome:4444\/wd\/hub&quot;)<\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0431\u044b\u043b\u043e \u0432 .gitlab-ci.yml:<br \/>  <code>selenium\/standalone-chrome:latest<\/code><br \/>  \u0418 \u043f\u043e \u043a\u0430\u043a\u043e\u043c\u0443 \u0430\u0434\u0440\u0435\u0441\u0443 \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u0435 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0442\u0435\u0441\u0442\u043e\u0432:<br \/>  <code>selenium__standalone-chrome<\/code><\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043c\u043e\u0438\u0445 \u0442\u0435\u0441\u0442\u043e\u0432 \u0443 \u043c\u0435\u043d\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u0442\u0430\u043a\u043e\u0439 job. \u0415\u0441\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a \u043d\u0435\u043c\u0443 \u0442\u0440\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 job \u0438\u0437 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0441 api \u0442\u0435\u0441\u0442\u0430\u043c\u0438, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0433\u043d\u0430\u0442\u044c \u0432\u0441\u0435 \u0442\u0435\u0441\u0442\u044b \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u0442\u0447\u0435\u0442.<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">chrome_job:   stage: testing   services:     - selenium\/standalone-chrome   image: python:3.8   tags:     - docker   before_script:     - pip install -r requirements.txt   script:     - pytest --alluredir=.\/allure-results tests\/   allow_failure: true   artifacts:     when: always     paths:       - .\/allure-results     expire_in: 1 day <\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"poleznye-ssylki\">\u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438<\/h2>\n<p>  <\/p>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e \u0441\u0441\u044b\u043b\u043e\u043a \u0432 \u0441\u0442\u0430\u0442\u044c\u0435, \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0435\u0449\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u044a\u044f\u0441\u043d\u044f\u0442\u044c \u0432\u0430\u043c \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 allure \u0438 \u043a\u0430\u043a \u043f\u0438\u0441\u0430\u0442\u044c gitlab ci.<\/p>\n<p>  <\/p>\n<p><a href=\"https:\/\/habr.com\/ru\/company\/jugru\/blog\/337386\/\">\u0421\u0442\u0430\u0442\u044c\u044f \u043e\u0431 allure \u043d\u0430 \u0445\u0430\u0431\u0440\u0435<\/a><br \/>  <a href=\"https:\/\/habr.com\/ru\/company\/softmart\/blog\/309380\/\">\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 gitlab ci<\/a><\/p>\n<\/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\/post\/513432\/\"> https:\/\/habr.com\/ru\/post\/513432\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/513432\/\">\n<p>\u042d\u0442\u043e\u0442 \u0442\u0435\u043a\u0441\u0442 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0434\u043b\u044f \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0445 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u043e\u0432, \u0436\u0435\u043b\u0430\u044e\u0449\u0438\u0445 \u043f\u043e\u043d\u044f\u0442\u044c \u043a\u0430\u043a \u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0442\u0447\u0435\u0442\u044b \u043d\u0430 allure \u0441 \u0438\u0441\u0442\u043e\u0440\u0438\u0435\u0439 \u0442\u0435\u0441\u0442\u043e\u0432, \u0442\u0430\u043a\u0436\u0435 \u0440\u0430\u0437\u044a\u044f\u0441\u043d\u0438\u0442\u044c \u0433\u0434\u0435 \u0438\u0445 \u0445\u0440\u0430\u043d\u0438\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u0432 \u043e\u0442\u0447\u0435\u0442 \u043c\u043e\u0433 \u0437\u0430\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a \u0432\u0430\u0448\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/bb\/xd\/ws\/bbxdwsvdjcdawfrthmdipnxju8i.png\" alt=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u043e\u0442\u0447\u0435\u0442\u0430, \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0449\u0438\u0439\u0441\u044f \u0432 allure\"\/><\/p>\n<p>  <\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u044f \u0445\u043e\u0442\u0435\u043b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 gitlab \u0430\u0432\u0442\u043e\u0442\u0435\u0441\u0442\u044b \u0432 \u0441\u0442\u0435\u043a\u0435 python, allure, docker, \u0442\u043e \u044f \u0432\u044b\u044f\u0441\u043d\u0438\u043b, \u0447\u0442\u043e \u0442\u043e\u043b\u043a\u043e\u0432\u044b\u0445 \u0441\u0442\u0430\u0442\u0435\u0439 \u043d\u0430 \u044d\u0442\u0443 \u0442\u0435\u043c\u0443 \u043d\u0435\u0442. \u041f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0438 \u043a\u0430\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0440\u043e\u0431 \u0438 \u043e\u0448\u0438\u0431\u043e\u043a \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043a\u043e\u0440\u0435\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0433\u0430\u0439\u0434\u043e\u043c, \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e \u0437\u0430\u0442\u0440\u0430\u0433\u0438\u0432\u0430\u044e\u0449\u0438\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u0435\u0441\u0442\u043e\u0432, \u043d\u043e \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0438\u0439 \u0444\u043e\u043a\u0443\u0441 \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430 \u0432\u044b\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043d\u0438\u0438 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b. \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0443\u0436\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u0442\u0435\u0441\u0442\u044b \u043d\u0430 allure, \u0442\u043e \u0432\u044b \u0441\u0440\u0430\u0437\u0443 \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043a \u0440\u0430\u0437\u0434\u0435\u043b\u0443 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b. \u041e\u0442\u043c\u0435\u0447\u0443, \u0447\u0442\u043e \u0442\u0435\u043a\u0441\u0442 \u041d\u0415 \u0437\u0430\u0442\u0440\u0430\u0433\u0438\u0432\u0430\u0435\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 UI \u0442\u0435\u0441\u0442\u043e\u0432, \u043d\u043e \u044f \u0437\u0430\u0442\u0440\u043e\u043d\u0443 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0434\u043b\u044f \u043d\u0438\u0445 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u0431\u043b\u043e\u043a\u0435.<\/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-307847","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/307847","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=307847"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/307847\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=307847"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=307847"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=307847"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}