{"id":384885,"date":"2024-06-29T05:46:57","date_gmt":"2024-06-29T05:46:57","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=384885"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=384885","title":{"rendered":"<span>\u0423\u0441\u043a\u043e\u0440\u044f\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439. \u042d\u043a\u0441\u043f\u043e\u0440\u0442 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 Allure-\u043e\u0442\u0447\u0435\u0442\u0430 \u0432 Confluence<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u0440\u0443\u043f\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0441\u043e\u0447\u0435\u0442\u0430\u044e\u0442 \u0441 \u0430\u0432\u0442\u043e\u0442\u0435\u0441\u0442\u0430\u043c\u0438. \u041f\u043e\u0441\u043b\u0435 \u0438\u0445 \u043f\u0440\u043e\u0433\u043e\u043d\u0430 QA \u0438\u043b\u0438 SDET-\u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u044b \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u044e\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u0435 \u0438 \u00ab\u0443\u043f\u0430\u0432\u0448\u0438\u0435\u00bb \u0442\u0435\u0441\u0442\u044b \u2013 \u0438\u0445 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0438 \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 Confluence.<\/p>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u044d\u043a\u0441\u043f\u043e\u0440\u0442 \u044d\u0442\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u0435\u0441\u043b\u0438 \u0432\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\u0435 \u0441 \u043d\u0435\u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 <a href=\"https:\/\/github.com\/allure-framework\"><u>Allure Framework<\/u><\/a>. \u041f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 Allure-EE \u0442\u0430\u043a\u0438\u0435 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u0435 \u043d\u0443\u0436\u043d\u044b \u2013 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043f\u043e \u0440\u0443\u0447\u043d\u043e\u043c\u0443 \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044e \u043a\u0435\u0439\u0441\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c <a href=\"https:\/\/qameta.io\/\"><u>\u0432 \u0441\u0430\u043c\u0438\u0445 \u043e\u0442\u0447\u0435\u0442\u0430\u0445<\/u><\/a>. <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/515\/0e3\/e68\/5150e3e6894b7cf7c9bbfbe00cf17ca2.png\" width=\"780\" height=\"440\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/515\/0e3\/e68\/5150e3e6894b7cf7c9bbfbe00cf17ca2.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0412 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u043c \u043d\u0438\u0436\u0435 \u043a\u0435\u0439\u0441\u0435 \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0441 Allure, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u044d\u0442\u043e\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u0438 \u043d\u0430 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u043e\u0434\u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0448\u0430\u043f\u043a\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0430\u0441\u044c \u0438\u0437 \u0448\u0430\u0431\u043b\u043e\u043d\u0430, \u0430 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u0442\u0435\u0441\u0442\u0430 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0437 Allure-\u043e\u0442\u0447\u0435\u0442\u0430. \u041f\u0440\u0438 \u0431\u043e\u043b\u044c\u0448\u043e\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435 \u0443\u043f\u0430\u0432\u0448\u0438\u0445 \u0430\u0432\u0442\u043e\u0442\u0435\u0441\u0442\u043e\u0432 \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0441\u044f \u0442\u0440\u0443\u0434\u043e\u0435\u043c\u043a\u0438\u043c \u0438 \u0437\u0430\u043d\u0438\u043c\u0430\u043b \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u041c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0443\u0442\u0438\u043b\u0438\u0442\u0443, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0430\u0441\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0430, \u0443\u0436\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u0430\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u0437 Allure-\u043e\u0442\u0447\u0435\u0442\u0430.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/a65\/e54\/88e\/a65e5488eaa90b9b02d36f42f9c593f5.jpg\" width=\"1754\" height=\"483\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a65\/e54\/88e\/a65e5488eaa90b9b02d36f42f9c593f5.jpg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0417\u0430\u0434\u0430\u0447\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0440\u0435\u0448\u0438\u0442\u044c:<\/p>\n<ul>\n<li>\n<p>\u041d\u0430\u0439\u0442\u0438 \u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 json-\u0444\u0430\u0439\u043b\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 Allure.<\/p>\n<\/li>\n<li>\n<p>\u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c html-\u043a\u043e\u0434 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0440\u0430\u043d\u0435\u0435 \u0434\u0430\u043d\u043d\u044b\u0435.<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0432 Confluence \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e POST-\u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u0432 \u0442\u0435\u043b\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c html-\u043a\u043e\u0434 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.<\/p>\n<\/li>\n<\/ul>\n<h3>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 json-\u0444\u0430\u0439\u043b\u043e\u0432<\/h3>\n<p>Json-\u0444\u0430\u0439\u043b\u044b \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 allure-report\\data\\test-cases<\/p>\n<p>\u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u0442\u0435\u0441\u0442\u0430 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 json-\u0444\u0430\u0439\u043b \u0441 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u043f\u043e \u0435\u0433\u043e \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044e. \u042d\u0442\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0444\u0430\u0439\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432\u0441\u0435 \u0448\u0430\u0433\u0438 \u0430\u0432\u0442\u043e\u0442\u0435\u0441\u0442\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u0435\u0433\u043e \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e. \u041d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0442 \u0442\u0430\u043a\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b:<\/p>\n<pre><code class=\"json\">\"status\" : \"failed\u201d, \"name\" : \"Test_0001\",  {     \"name\" : \"epic\",     \"value\" : \"iOS\" },  {     \"name\" : \"feature\",     \"value\" : \"\u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f\" },  {     \"name\" : \"story\",     \"value\" : \"\u041f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0435 \u043f\u043e\u043f\u044b\u0442\u043e\u043a\" }<\/code><\/pre>\n<p>\u042d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0442\u044c \u0432\u043e 2 &#8212; 5 \u043a\u043e\u043b\u043e\u043d\u043a\u0430\u0445 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0446\u0432\u0435\u0442\u0430 \u0434\u043b\u044f \u0437\u0430\u043b\u0438\u0432\u043a\u0438 \u0444\u043e\u043d\u0430 \u044f\u0447\u0435\u0435\u043a. \u0421\u0442\u0430\u0442\u0443\u0441 \u0430\u0432\u0442\u043e\u0442\u0435\u0441\u0442\u0430 \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439: &#171;failed&#187; (\u0432\u044b\u0434\u0435\u043b\u044f\u0435\u043c \u043a\u0440\u0430\u0441\u043d\u044b\u043c), &#171;unknown&#187; (\u0444\u0438\u043e\u043b\u0435\u0442\u043e\u0432\u044b\u0439), &#171;broken&#187; (\u0436\u0435\u043b\u0442\u044b\u0439), &#171;skipped&#187; (\u0441\u0435\u0440\u044b\u0439).<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0434\u0432\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 \u0441 \u043c\u043e\u0434\u0435\u043b\u044f\u043c\u0438. \u0414\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0443\u0434\u043e\u0431\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c IntelliJ IDEA \u043f\u043b\u0430\u0433\u0438\u043d <a href=\"https:\/\/plugins.jetbrains.com\/plugin\/8634-robopojogenerator\"><u>RoboPOJOGenerator<\/u><\/a>. \u0422\u0430\u043a\u0436\u0435 \u043e\u0431\u0440\u0430\u0442\u0438\u043c\u0441\u044f \u043a <a href=\"https:\/\/projectlombok.org\/\"><u>Lombok<\/u><\/a>, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u044b \u0433\u0435\u0442\u0442\u0435\u0440\u044b.<\/p>\n<pre><code class=\"java\">import com.google.gson.annotations.SerializedName; import lombok.Getter;  import java.util.List;  @Getter public class TestCase {    private String epic;    private String feature;    private String story;     @SerializedName(\"name\")    private String name;     @SerializedName(\"status\")    private String status;     @SerializedName(\"labels\")    private List&lt;LabelsItem> labels;     public void initLabels() {        if (labels != null) {            for (LabelsItem labelsItem : labels) {                switch (labelsItem.getName()) {                    case \"epic\" : epic = labelsItem.getValue();                        break;                    case \"feature\" : feature = labelsItem.getValue();                        break;                    case \"story\" : story = labelsItem.getValue();                }            }        }    } }   import com.google.gson.annotations.SerializedName; import lombok.Getter;  @Getter public class LabelsItem {    @SerializedName(\"name\")   private String name;    @SerializedName(\"value\")   private String value; }<\/code><\/pre>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u044d\u0442\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0438\u0437 json-\u0444\u0430\u0439\u043b\u0430. \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c json \u0432 \u043a\u043b\u0430\u0441\u0441 \u043c\u043e\u0434\u0435\u043b\u0438 \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 <a href=\"https:\/\/github.com\/google\/gson\"><u>Gson<\/u><\/a>.<\/p>\n<pre><code class=\"java\">\/** * \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 json \u0444\u0430\u0439\u043b\u0430 * * @param path \u043f\u0443\u0442\u044c \u043a \u043f\u0430\u043f\u043a\u0435 \u0441 \u0444\u0430\u0439\u043b\u0430\u043c\u0438 * @return \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 json \u0444\u0430\u0439\u043b\u0430 *\/ public static TestCase readTestCasesJson(String path) {    try (Stream&lt;String> stream = Files.lines(Paths.get(path))) {        String text = stream.reduce(\"\", String::concat);        return new Gson().fromJson(text, TestCase.class);    } catch (IOException e) {        throw new RuntimeException(e.getMessage());    } }<\/code><\/pre>\n<p>\u0414\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u0432\u0441\u0435\u0445 json-\u0444\u0430\u0439\u043b\u043e\u0432 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043c\u0435\u0442\u043e\u0434\u043e\u043c:<\/p>\n<pre><code class=\"java\">\/** * \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0439 \u0444\u0430\u0439\u043b\u043e\u0432 \u0432 \u043f\u0430\u043f\u043a\u0435 * * @param path \u043f\u0443\u0442\u044c \u043a \u043f\u0430\u043f\u043a\u0435 \u0441 \u0444\u0430\u0439\u043b\u0430\u043c\u0438 * @return \u0441\u043f\u0438\u0441\u043e\u043a \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0439 \u0444\u0430\u0439\u043b\u043e\u0432 * @throws IOException \u043e\u0448\u0438\u0431\u043a\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0434\u0430\u043d\u043d\u044b\u043c *\/ public static List&lt;Path> getFilesInFolder(String path) throws IOException {    return Files.walk(Paths.get(path))            .filter(Files::isRegularFile)            .collect(Collectors.toList()); }<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e \u0432\u0441\u0435\u043c \u0443\u043f\u0430\u0432\u0448\u0438\u043c \u0442\u0435\u0441\u0442\u0430\u043c.<\/p>\n<pre><code class=\"java\">\/** * \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e \u0432\u0441\u0435\u043c \u0443\u043f\u0430\u0432\u0448\u0438\u043c * * @param paths \u043f\u0443\u0442\u044c \u043a \u043f\u0430\u043f\u043a\u0435 \u0441 \u0444\u0430\u0439\u043b\u0430\u043c\u0438 * @return \u0441\u043f\u0438\u0441\u043e\u043a \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u043e \u0443\u043f\u0430\u0432\u0448\u0438\u043c \u0442\u0435\u0441\u0442\u0430\u043c *\/ public static List&lt;TestCase> getTestCasesDataInFolder(List&lt;Path> paths) {    List&lt;TestCase> testCases = new ArrayList&lt;>();    TestCase testCase;     for (Path path : paths) {        testCase = readTestCasesJson(path.toString());         if (!testCase.getStatus().equals(\"passed\") ) {            testCase.initLabels();            testCases.add(testCase);        }    }     return testCases; }<\/code><\/pre>\n<h3>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b<\/h3>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043f\u043e \u0430\u0432\u0442\u043e\u0442\u0435\u0441\u0442\u0430\u043c \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0441\u0442\u0430\u0442\u0443\u0441\u043e\u0432, \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0438 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 html. <\/p>\n<pre><code class=\"java\">\/**      * \u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 html \u043a\u043e\u0434 \u0442\u0430\u0431\u043b\u0438\u0446\u044b      *      * @param testCasesPath \u043f\u0443\u0442\u044c \u043a \u043f\u0430\u043f\u043a\u0435 \u0441 json \u0444\u0430\u0439\u043b\u0430\u043c\u0438 \u043e\u0442\u0447\u0435\u0442\u0430      * @param link \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043f\u0440\u043e\u0433\u043e\u043d \u0432 CI      * @param name \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0433\u043e\u043d\u0430      * @return \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 html \u043a\u043e\u0434\u043e\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u044b      * @throws IOException \u043e\u0448\u0438\u0431\u043a\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0434\u0430\u043d\u043d\u044b\u043c      *\/     public static String createTableBody(String testCasesPath, String link, String name) throws IOException {          List&lt;Path> filesPath = getFilesInFolder(testCasesPath);         List&lt;TestCase> tests = getTestCasesDataInFolder(filesPath);          List&lt;TestCase> notPassed = tests.stream()                 .sorted(Comparator.comparing(TestCase::getStatus)                         .thenComparing(TestCase::getEpic, nullsFirst(naturalOrder()))                         .thenComparing(TestCase::getFeature, nullsFirst(naturalOrder()))                         .thenComparing(TestCase::getStory, nullsFirst(naturalOrder()))                         .thenComparing(TestCase::getName, nullsFirst(naturalOrder())))                 .collect(Collectors.toList());          String lines = createTableLines(notPassed);          return (format(TABLE_HEADER, name, link, link) + lines + TABLE_TAIL).replace(\"\\\"\", \"\\\\\\\"\");     }<\/code><\/pre>\n<p>\u0414\u043b\u044f \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043c\u0435\u0442\u043e\u0434:<\/p>\n<pre><code class=\"java\">\/** * \u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 Confluence * * @param testsCases \u0441\u043f\u0438\u0441\u043e\u043a \u0443\u043f\u0430\u0432\u0448\u0438\u0445 \u0442\u0435\u0441\u0442\u043e\u0432 * @return html \u043a\u043e\u0434 \u0441\u0442\u0440\u043e\u043a \u0442\u0430\u0431\u043b\u0438\u0446\u044b *\/ private static String createTableLines(List&lt;TestCase> testsCases) {    StringBuilder result = new StringBuilder();    String colorValue = \"\";     for (TestCase test : testsCases) {        colorValue = getColorValue(test.getStatus());         result.append(                    format(                            TABLE_LINE,                            ++testNumber,                            Strings.isNotNullAndNotEmpty(test.getEpic()) ? test.getEpic() : \" \",                            Strings.isNotNullAndNotEmpty(test.getFeature()) ? test.getFeature() : \" \",                            Strings.isNotNullAndNotEmpty(test.getStory()) ? test.getStory() : \" \",                            colorValue,                            getColorName(test.getStatus()),                            colorValue,                            test.getName()                    )        );    }     return result.toString(); }<\/code><\/pre>\n<p>\u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f html-\u043a\u043e\u0434\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u0440\u043e\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0438\u0437 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0432 Confluence \u0438 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u043c\u0435\u0441\u0442\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 format().<\/p>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0445\u0435\u0434\u0435\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b. \u041f\u043e\u0441\u043b\u0435 \u043f\u043e\u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0438. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0443 \u0441 \u0442\u0435\u0433\u0430\u043c\u0438, \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0438\u043c\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0443. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043c\u044b \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c html-\u043a\u043e\u0434 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0434\u0438\u043c \u0432 \u0442\u0435\u043b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430.<\/p>\n<h3>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e POST-\u0437\u0430\u043f\u0440\u043e\u0441\u0430<\/h3>\n<p>\u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e <a href=\"https:\/\/docs.atlassian.com\/ConfluenceServer\/rest\/7.14.0\/#api\/content-createContent\"><u>Confluence REST API<\/u><\/a>.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0432 Confluence \u043f\u0443\u0441\u0442\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0442\u0430\u0431\u043b\u0438\u0446. \u0422\u0430\u043a \u043d\u0430\u043c \u0431\u0443\u0434\u0435\u0442 \u0443\u0434\u043e\u0431\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043a \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c id (\u043f\u0443\u0441\u0442\u044c \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 123456789), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u0430\u0434\u0440\u0435\u0441\u0435 \u0441\u0430\u043c\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b <u>https:\/\/***.ru\/pages\/viewpage.action?pageId=123456789<\/u><\/p>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0443\u0437\u043d\u0430\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c GET \u0437\u0430\u043f\u0440\u043e\u0441 <u>https:\/\/***.ru\/rest\/api\/content\/123456789?expand=version<\/u><\/p>\n<p>\u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 api \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c RestAssured <a href=\"https:\/\/rest-assured.io\/\"><u>https:\/\/rest-assured.io\/<\/u><\/a><\/p>\n<p>\u0418 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u043e\u043c\u0435\u0440\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b<\/p>\n<pre><code class=\"java\">\/** * \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0432\u0435\u0440\u0441\u0438\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 Confluence * * @param url \u0430\u0434\u0440\u0435\u0441 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b * @param login \u043b\u043e\u0433\u0438\u043d \u043e\u0442 \u0443\u0447\u0435\u0442\u043a\u0438 Confluence * @param password \u043f\u0430\u0440\u043e\u043b\u044c \u043e\u0442 \u0443\u0447\u0435\u0442\u043a\u0438 Confluence * @return \u043d\u043e\u043c\u0435\u0440 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b *\/ public static int getNextPageVersion(String url, String login, String password) {    int result = RestAssured            .given()            .auth()            .preemptive()            .basic(login, password)            .get(url)            .jsonPath().get(\"version.number\");     return result + 1; }<\/code><\/pre>\n<p>\u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c POST-\u0437\u0430\u043f\u0440\u043e\u0441 <u>https:\/\/***.ru\/rest\/api\/content\/123456789\/<\/u> \u0441 \u0442\u0435\u043b\u043e\u043c:<\/p>\n<pre><code class=\"java\">{     \"body\": {         \"storage\": {                         \"value\": \"\u043d\u0430\u0448 html \u043a\u043e\u0434 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\",             \"representation\": \"storage\"         }     },      \"type\": \"page\",     \"title\": \"\u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\",      \"version\": {         \"number\": \"100\"         } }<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b, html-\u043a\u043e\u0434 \u0441\u0430\u043c\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0438 \u043d\u043e\u043c\u0435\u0440 \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b. \u0422\u0430\u043a \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043c\u0435\u0442\u043e\u0434:<\/p>\n<pre><code class=\"java\">\/** * \u0421\u043e\u0437\u0434\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0432 Confluence * * @param url \u0430\u0434\u0440\u0435\u0441 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b * @param login \u043b\u043e\u0433\u0438\u043d \u043e\u0442 \u0443\u0447\u0435\u0442\u043a\u0438 Confluence * @param password \u043f\u0430\u0440\u043e\u043b\u044c \u043e\u0442 \u0443\u0447\u0435\u0442\u043a\u0438 Confluence * @param table html \u043a\u043e\u0434 \u0442\u0430\u0431\u043b\u0438\u0446\u044b * @param title \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b * @param pageVersion \u0412\u0435\u0440\u0441\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b *\/ public static void createConfluenceTable(String url, String login, String password, String table, String title, int pageVersion) {    String TABLE_BODY = \"{\\n\" +            \"    \\\"body\\\": {\\n\" +            \"        \\\"storage\\\": {\\n\" +            \"                        \\\"value\\\": \\\"%s\\\",\\n\" +            \"            \\\"representation\\\": \\\"storage\\\"\\n\" +            \"        }\\n\" +            \"    },\\n\" +            \"\\n\" +            \"    \\\"type\\\": \\\"page\\\",\\n\" +            \"    \\\"title\\\": \\\"%s\\\",\\n\" +            \"\\n\" +            \"    \\\"version\\\": {\\n\" +            \"        \\\"number\\\": \\\"%s\\\"\\n\" +            \"        }\\n\" +            \"}\";     RestAssured            .given()            .auth()            .preemptive()            .basic(login, password)            .header(\"Content-Type\", \"application\/json\")            .header(\"Connection\", \"keep-alive\")            .body(format(TABLE_BODY, table, title, pageVersion))            .when()            .put(url)            .then()            .statusCode(200); }<\/code><\/pre>\n<p>\u0418 \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b:<\/p>\n<pre><code class=\"java\">import utils.RequestExecutor; import java.io.IOException; import java.util.Scanner;  import static utils.TableGenerator.createTableBody;  public class App {      public static void main(String[] args) throws IOException {          \/\/\u041f\u0443\u0442\u044c \u0434\u043e \u043f\u0430\u043f\u043a\u0438 \u0441 \u043e\u0442\u0447\u0435\u0442\u043e\u043c         String PATH = \"C:\\\\Users\\\\User\\\\Desktop\\\\allure-report\\\\data\\\\test-cases\";         \/\/\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0432 Confluence         String TITLE = \"\u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446 iOS\";         \/\/\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b         String NAME = \": \\\"\u21161 \u0421\u043c\u043e\u0443\u043a 1.01\\\"\";         \/\/\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0442\u0447\u0435\u0442 \u0432 CI         String LINK = \"\u041e\u0442\u0447\u0435\u0442 \u0432 CI\";         \/\/\u0417\u0430\u043f\u0440\u043e\u0441 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u043e\u043c\u0435\u0440\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0432 Confluence         String URL_GET = \"https:\/\/***.ru\/rest\/api\/content\/123456789?expand=version\";         \/\/\u0417\u0430\u043f\u0440\u043e\u0441 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 Confluence         String URL_POST = \"https:\/\/***.ru\/rest\/api\/content\/123456789\/\";          System.out.println(\"\u0414\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0443\u0447\u0435\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 Confluence\");         Scanner in = new Scanner(System.in);          System.out.print(\"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043b\u043e\u0433\u0438\u043d: \");         String login = in.nextLine();          System.out.print(\"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043f\u0430\u0440\u043e\u043b\u044c: \");         String password = in.nextLine();          RequestExecutor.createConfluenceTable(                 URL_POST,                 login,                 password,                 createTableBody(PATH, LINK, NAME),                 TITLE,                 RequestExecutor.getNextPageVersion(URL_GET, login, password)         );     } }<\/code><\/pre>\n<h3>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u00a0<\/h3>\n<p>\u0417\u0430 \u0441\u0447\u0435\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043c\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u043e\u0442\u0447\u0435\u0442\u0430\u043c\u0438, \u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0438 \u043f\u0440\u043e\u0449\u0435:<\/p>\n<ul>\n<li>\n<p>QA-\u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u044b \u0441\u043c\u043e\u0433\u043b\u0438 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0430\u0442\u044c \u043a \u0440\u0430\u0437\u0431\u043e\u0440\u0443 \u043e\u0442\u0447\u0435\u0442\u043e\u0432, \u043d\u0435 \u0437\u0430\u0442\u0440\u0430\u0447\u0438\u0432\u0430\u044f \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u0440\u0443\u0447\u043d\u043e\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446 \u0438 \u043f\u0435\u0440\u0435\u043d\u043e\u0441 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 Allure-\u043e\u0442\u0447\u0435\u0442\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0421\u043d\u0438\u0437\u0438\u043b\u0430\u0441\u044c \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u043e\u0448\u0438\u0431\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u043b\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c \u043f\u0440\u0438 \u0440\u0443\u0447\u043d\u043e\u043c \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 Allure-\u043e\u0442\u0447\u0435\u0442\u0430 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443.<\/p>\n<\/li>\n<li>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0441\u0442\u0430\u043b\u043e \u0443\u0434\u043e\u0431\u043d\u0435\u0435.\u00a0<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u0440\u0430\u043c\u043a\u0430\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043b\u0438 \u043d\u0430 \u0442\u0440\u0435\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u0445: web, Android \u0438 iOS. \u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u043c \u0442\u0430\u0431\u043b\u0438\u0446 \u043f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432\u0435\u0431-\u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0443\u0436\u0435 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0443 \u043e\u0446\u0435\u043d\u0438\u043b\u0430 \u0438\u0445 \u043e\u043f\u044b\u0442 \u0438 \u0442\u043e\u0436\u0435 \u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u043c \u043c\u0435\u0442\u043e\u0434\u043e\u043c.<\/p>\n<p>\u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u043a \u0441\u0442\u0430\u0442\u044c\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d <a href=\"https:\/\/github.com\/articles-simbirsoft\/table-generator\"><u>\u043d\u0430 GitHub<\/u><\/a>.<\/p>\n<p><strong>\u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435! \u041d\u0430\u0434\u0435\u0435\u043c\u0441\u044f, \u0447\u0442\u043e \u043d\u0430\u0448 \u043e\u043f\u044b\u0442 \u0431\u044b\u043b \u0432\u0430\u043c \u043f\u043e\u043b\u0435\u0437\u0435\u043d.<\/strong><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \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\/articles\/585530\/\"> https:\/\/habr.com\/ru\/articles\/585530\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u0440\u0443\u043f\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0441\u043e\u0447\u0435\u0442\u0430\u044e\u0442 \u0441 \u0430\u0432\u0442\u043e\u0442\u0435\u0441\u0442\u0430\u043c\u0438. \u041f\u043e\u0441\u043b\u0435 \u0438\u0445 \u043f\u0440\u043e\u0433\u043e\u043d\u0430 QA \u0438\u043b\u0438 SDET-\u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u044b \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u044e\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u0435 \u0438 \u00ab\u0443\u043f\u0430\u0432\u0448\u0438\u0435\u00bb \u0442\u0435\u0441\u0442\u044b \u2013 \u0438\u0445 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0438 \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 Confluence.<\/p>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u044d\u043a\u0441\u043f\u043e\u0440\u0442 \u044d\u0442\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u0435\u0441\u043b\u0438 \u0432\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\u0435 \u0441 \u043d\u0435\u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 <a href=\"https:\/\/github.com\/allure-framework\"><u>Allure Framework<\/u><\/a>. \u041f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 Allure-EE \u0442\u0430\u043a\u0438\u0435 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u0435 \u043d\u0443\u0436\u043d\u044b \u2013 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043f\u043e \u0440\u0443\u0447\u043d\u043e\u043c\u0443 \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044e \u043a\u0435\u0439\u0441\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c <a href=\"https:\/\/qameta.io\/\"><u>\u0432 \u0441\u0430\u043c\u0438\u0445 \u043e\u0442\u0447\u0435\u0442\u0430\u0445<\/u><\/a>. <\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0412 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u043c \u043d\u0438\u0436\u0435 \u043a\u0435\u0439\u0441\u0435 \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0441 Allure, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u044d\u0442\u043e\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u0438 \u043d\u0430 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u043e\u0434\u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0448\u0430\u043f\u043a\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0430\u0441\u044c \u0438\u0437 \u0448\u0430\u0431\u043b\u043e\u043d\u0430, \u0430 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u0442\u0435\u0441\u0442\u0430 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0437 Allure-\u043e\u0442\u0447\u0435\u0442\u0430. \u041f\u0440\u0438 \u0431\u043e\u043b\u044c\u0448\u043e\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435 \u0443\u043f\u0430\u0432\u0448\u0438\u0445 \u0430\u0432\u0442\u043e\u0442\u0435\u0441\u0442\u043e\u0432 \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0441\u044f \u0442\u0440\u0443\u0434\u043e\u0435\u043c\u043a\u0438\u043c \u0438 \u0437\u0430\u043d\u0438\u043c\u0430\u043b \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u041c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0443\u0442\u0438\u043b\u0438\u0442\u0443, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0430\u0441\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0430, \u0443\u0436\u0435 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u0430\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u0437 Allure-\u043e\u0442\u0447\u0435\u0442\u0430.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0417\u0430\u0434\u0430\u0447\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0440\u0435\u0448\u0438\u0442\u044c:<\/p>\n<ul>\n<li>\n<p>\u041d\u0430\u0439\u0442\u0438 \u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 json-\u0444\u0430\u0439\u043b\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 Allure.<\/p>\n<\/li>\n<li>\n<p>\u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c html-\u043a\u043e\u0434 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0440\u0430\u043d\u0435\u0435 \u0434\u0430\u043d\u043d\u044b\u0435.<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0432 Confluence \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e POST-\u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u0432 \u0442\u0435\u043b\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c html-\u043a\u043e\u0434 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.<\/p>\n<\/li>\n<\/ul>\n<h3>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 json-\u0444\u0430\u0439\u043b\u043e\u0432<\/h3>\n<p>Json-\u0444\u0430\u0439\u043b\u044b \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 allure-report\\data\\test-cases<\/p>\n<p>\u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u0442\u0435\u0441\u0442\u0430 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 json-\u0444\u0430\u0439\u043b \u0441 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u043f\u043e \u0435\u0433\u043e \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044e. \u042d\u0442\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0444\u0430\u0439\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432\u0441\u0435 \u0448\u0430\u0433\u0438 \u0430\u0432\u0442\u043e\u0442\u0435\u0441\u0442\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u0435\u0433\u043e \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e. \u041d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0442 \u0442\u0430\u043a\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b:<\/p>\n<pre><code class=\"json\">\"status\" : \"failed\u201d, \"name\" : \"Test_0001\",  {     \"name\" : \"epic\",     \"value\" : \"iOS\" },  {     \"name\" : \"feature\",     \"value\" : \"\u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f\" },  {     \"name\" : \"story\",     \"value\" : \"\u041f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0435 \u043f\u043e\u043f\u044b\u0442\u043e\u043a\" }<\/code><\/pre>\n<p>\u042d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0442\u044c \u0432\u043e 2 &#8212; 5 \u043a\u043e\u043b\u043e\u043d\u043a\u0430\u0445 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0446\u0432\u0435\u0442\u0430 \u0434\u043b\u044f \u0437\u0430\u043b\u0438\u0432\u043a\u0438 \u0444\u043e\u043d\u0430 \u044f\u0447\u0435\u0435\u043a. \u0421\u0442\u0430\u0442\u0443\u0441 \u0430\u0432\u0442\u043e\u0442\u0435\u0441\u0442\u0430 \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439: &#171;failed&#187; (\u0432\u044b\u0434\u0435\u043b\u044f\u0435\u043c \u043a\u0440\u0430\u0441\u043d\u044b\u043c), &#171;unknown&#187; (\u0444\u0438\u043e\u043b\u0435\u0442\u043e\u0432\u044b\u0439), &#171;broken&#187; (\u0436\u0435\u043b\u0442\u044b\u0439), &#171;skipped&#187; (\u0441\u0435\u0440\u044b\u0439).<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0434\u0432\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 \u0441 \u043c\u043e\u0434\u0435\u043b\u044f\u043c\u0438. \u0414\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u0443\u0434\u043e\u0431\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c IntelliJ IDEA \u043f\u043b\u0430\u0433\u0438\u043d <a href=\"https:\/\/plugins.jetbrains.com\/plugin\/8634-robopojogenerator\"><u>RoboPOJOGenerator<\/u><\/a>. \u0422\u0430\u043a\u0436\u0435 \u043e\u0431\u0440\u0430\u0442\u0438\u043c\u0441\u044f \u043a <a href=\"https:\/\/projectlombok.org\/\"><u>Lombok<\/u><\/a>, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u044b \u0433\u0435\u0442\u0442\u0435\u0440\u044b.<\/p>\n<pre><code class=\"java\">import com.google.gson.annotations.SerializedName; import lombok.Getter;  import java.util.List;  @Getter public class TestCase {    private String epic;    private String feature;    private String story;     @SerializedName(\"name\")    private String name;     @SerializedName(\"status\")    private String status;     @SerializedName(\"labels\")    private List&lt;LabelsItem> labels;     public void initLabels() {        if (labels != null) {            for (LabelsItem labelsItem : labels) {                switch (labelsItem.getName()) {                    case \"epic\" : epic = labelsItem.getValue();                        break;                    case \"feature\" : feature = labelsItem.getValue();                        break;                    case \"story\" : story = labelsItem.getValue();                }            }        }    } }   import com.google.gson.annotations.SerializedName; import lombok.Getter;  @Getter public class LabelsItem {    @SerializedName(\"name\")   private String name;    @SerializedName(\"value\")   private String value; }<\/code><\/pre>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u044d\u0442\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0438\u0437 json-\u0444\u0430\u0439\u043b\u0430. \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c json \u0432 \u043a\u043b\u0430\u0441\u0441 \u043c\u043e\u0434\u0435\u043b\u0438 \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 <a href=\"https:\/\/github.com\/google\/gson\"><u>Gson<\/u><\/a>.<\/p>\n<pre><code class=\"java\">\/** * \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 json \u0444\u0430\u0439\u043b\u0430 * * @param path \u043f\u0443\u0442\u044c \u043a \u043f\u0430\u043f\u043a\u0435 \u0441 \u0444\u0430\u0439\u043b\u0430\u043c\u0438 * @return \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 json \u0444\u0430\u0439\u043b\u0430 *\/ public static TestCase readTestCasesJson(String path) {    try (Stream&lt;String> stream = Files.lines(Paths.get(path))) {        String text = stream.reduce(\"\", String::concat);        return new Gson().fromJson(text, TestCase.class);    } catch (IOException e) {        throw new RuntimeException(e.getMessage());    } }<\/code><\/pre>\n<p>\u0414\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u0432\u0441\u0435\u0445 json-\u0444\u0430\u0439\u043b\u043e\u0432 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043c\u0435\u0442\u043e\u0434\u043e\u043c:<\/p>\n<pre><code class=\"java\">\/** * \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0439 \u0444\u0430\u0439\u043b\u043e\u0432 \u0432 \u043f\u0430\u043f\u043a\u0435 * * @param path \u043f\u0443\u0442\u044c \u043a \u043f\u0430\u043f\u043a\u0435 \u0441 \u0444\u0430\u0439\u043b\u0430\u043c\u0438 * @return \u0441\u043f\u0438\u0441\u043e\u043a \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0439 \u0444\u0430\u0439\u043b\u043e\u0432 * @throws IOException \u043e\u0448\u0438\u0431\u043a\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0434\u0430\u043d\u043d\u044b\u043c *\/ public static List&lt;Path> getFilesInFolder(String path) throws IOException {    return Files.walk(Paths.get(path))            .filter(Files::isRegularFile)            .collect(Collectors.toList()); }<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e \u0432\u0441\u0435\u043c \u0443\u043f\u0430\u0432\u0448\u0438\u043c \u0442\u0435\u0441\u0442\u0430\u043c.<\/p>\n<pre><code class=\"java\">\/** * \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e \u0432\u0441\u0435\u043c \u0443\u043f\u0430\u0432\u0448\u0438\u043c * * @param paths \u043f\u0443\u0442\u044c \u043a \u043f\u0430\u043f\u043a\u0435 \u0441 \u0444\u0430\u0439\u043b\u0430\u043c\u0438 * @return \u0441\u043f\u0438\u0441\u043e\u043a \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u043e \u0443\u043f\u0430\u0432\u0448\u0438\u043c \u0442\u0435\u0441\u0442\u0430\u043c *\/ public static List&lt;TestCase> getTestCasesDataInFolder(List&lt;Path> paths) {    List&lt;TestCase> testCases = new ArrayList&lt;>();    TestCase testCase;     for (Path path : paths) {        testCase = readTestCasesJson(path.toString());         if (!testCase.getStatus().equals(\"passed\") ) {            testCase.initLabels();            testCases.add(testCase);        }    }     return testCases; }<\/code><\/pre>\n<h3>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b<\/h3>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043f\u043e \u0430\u0432\u0442\u043e\u0442\u0435\u0441\u0442\u0430\u043c \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0441\u0442\u0430\u0442\u0443\u0441\u043e\u0432, \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0438 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 html. <\/p>\n<pre><code class=\"java\">\/**      * \u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 html \u043a\u043e\u0434 \u0442\u0430\u0431\u043b\u0438\u0446\u044b      *      * @param testCasesPath \u043f\u0443\u0442\u044c \u043a \u043f\u0430\u043f\u043a\u0435 \u0441 json \u0444\u0430\u0439\u043b\u0430\u043c\u0438 \u043e\u0442\u0447\u0435\u0442\u0430      * @param link \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043f\u0440\u043e\u0433\u043e\u043d \u0432 CI      * @param name \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0433\u043e\u043d\u0430      * @return \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 html \u043a\u043e\u0434\u043e\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u044b      * @throws IOException \u043e\u0448\u0438\u0431\u043a\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0434\u0430\u043d\u043d\u044b\u043c      *\/     public static String createTableBody(String testCasesPath, String link, String name) throws IOException {          List&lt;Path> filesPath = getFilesInFolder(testCasesPath);         List&lt;TestCase> tests = getTestCasesDataInFolder(filesPath);          List&lt;TestCase> notPassed = tests.stream()                 .sorted(Comparator.comparing(TestCase::getStatus)                         .thenComparing(TestCase::getEpic, nullsFirst(naturalOrder()))                         .thenComparing(TestCase::getFeature, nullsFirst(naturalOrder()))                         .thenComparing(TestCase::getStory, nullsFirst(naturalOrder()))                         .thenComparing(TestCase::getName, nullsFirst(naturalOrder())))                 .collect(Collectors.toList());          String lines = createTableLines(notPassed);          return (format(TABLE_HEADER, name, link, link) + lines + TABLE_TAIL).replace(\"\\\"\", \"\\\\\\\"\");     }<\/code><\/pre>\n<p>\u0414\u043b\u044f \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043c\u0435\u0442\u043e\u0434:<\/p>\n<pre><code class=\"java\">\/** * \u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 Confluence * * @param testsCases \u0441\u043f\u0438\u0441\u043e\u043a \u0443\u043f\u0430\u0432\u0448\u0438\u0445 \u0442\u0435\u0441\u0442\u043e\u0432 * @return html \u043a\u043e\u0434 \u0441\u0442\u0440\u043e\u043a \u0442\u0430\u0431\u043b\u0438\u0446\u044b *\/ private static String createTableLines(List&lt;TestCase> testsCases) {    StringBuilder result = new StringBuilder();    String colorValue = \"\";     for (TestCase test : testsCases) {        colorValue = getColorValue(test.getStatus());         result.append(                    format(                            TABLE_LINE,                            ++testNumber,                            Strings.isNotNullAndNotEmpty(test.getEpic()) ? test.getEpic() : \" \",                            Strings.isNotNullAndNotEmpty(test.getFeature()) ? test.getFeature() : \" \",                            Strings.isNotNullAndNotEmpty(test.getStory()) ? test.getStory() : \" \",                            colorValue,                            getColorName(test.getStatus()),                            colorValue,                            test.getName()                    )        );    }     return result.toString(); }<\/code><\/pre>\n<p>\u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f html-\u043a\u043e\u0434\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u0440\u043e\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0438\u0437 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0432 Confluence \u0438 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u043c\u0435\u0441\u0442\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 format().<\/p>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0445\u0435\u0434\u0435\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b. \u041f\u043e\u0441\u043b\u0435 \u043f\u043e\u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0438. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0443 \u0441 \u0442\u0435\u0433\u0430\u043c\u0438, \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0438\u043c\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0443. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043c\u044b \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c html-\u043a\u043e\u0434 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0434\u0438\u043c \u0432 \u0442\u0435\u043b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430.<\/p>\n<h3>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e POST-\u0437\u0430\u043f\u0440\u043e\u0441\u0430<\/h3>\n<p>\u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e <a href=\"https:\/\/docs.atlassian.com\/ConfluenceServer\/rest\/7.14.0\/#api\/content-createContent\"><u>Confluence REST API<\/u><\/a>.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0432 Confluence \u043f\u0443\u0441\u0442\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0442\u0430\u0431\u043b\u0438\u0446. \u0422\u0430\u043a \u043d\u0430\u043c \u0431\u0443\u0434\u0435\u0442 \u0443\u0434\u043e\u0431\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043a \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c id (\u043f\u0443\u0441\u0442\u044c \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 123456789), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u0430\u0434\u0440\u0435\u0441\u0435 \u0441\u0430\u043c\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b <u>https:\/\/***.ru\/pages\/viewpage.action?pageId=123456789<\/u><\/p>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0443\u0437\u043d\u0430\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c GET \u0437\u0430\u043f\u0440\u043e\u0441 <u>https:\/\/***.ru\/rest\/api\/content\/123456789?expand=version<\/u><\/p>\n<p>\u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 api \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c RestAssured <a href=\"https:\/\/rest-assured.io\/\"><u>https:\/\/rest-assured.io\/<\/u><\/a><\/p>\n<p>\u0418 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u043e\u043c\u0435\u0440\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b<\/p>\n<pre><code class=\"java\">\/** * \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0432\u0435\u0440\u0441\u0438\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 Confluence * * @param url \u0430\u0434\u0440\u0435\u0441 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b * @param login \u043b\u043e\u0433\u0438\u043d \u043e\u0442 \u0443\u0447\u0435\u0442\u043a\u0438 Confluence * @param password \u043f\u0430\u0440\u043e\u043b\u044c \u043e\u0442 \u0443\u0447\u0435\u0442\u043a\u0438 Confluence * @return \u043d\u043e\u043c\u0435\u0440 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b *\/ public static int getNextPageVersion(String url, String login, String password) {    int result = RestAssured            .given()            .auth()            .preemptive()            .basic(login, password)            .get(url)            .jsonPath().get(\"version.number\");     return result + 1; }<\/code><\/pre>\n<p>\u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c POST-\u0437\u0430\u043f\u0440\u043e\u0441 <u>https:\/\/***.ru\/rest\/api\/content\/123456789\/<\/u> \u0441 \u0442\u0435\u043b\u043e\u043c:<\/p>\n<pre><code class=\"java\">{     \"body\": {         \"storage\": {                         \"value\": \"\u043d\u0430\u0448 html \u043a\u043e\u0434 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\",             \"representation\": \"storage\"         }     },      \"type\": \"page\",     \"title\": \"\u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\",      \"version\": {         \"number\": \"100\"         } }<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b, html-\u043a\u043e\u0434 \u0441\u0430\u043c\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0438 \u043d\u043e\u043c\u0435\u0440 \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b. \u0422\u0430\u043a \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043c\u0435\u0442\u043e\u0434:<\/p>\n<pre><code class=\"java\">\/** * \u0421\u043e\u0437\u0434\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0432 Confluence * * @param url \u0430\u0434\u0440\u0435\u0441 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b * @param login \u043b\u043e\u0433\u0438\u043d \u043e\u0442 \u0443\u0447\u0435\u0442\u043a\u0438 Confluence * @param password \u043f\u0430\u0440\u043e\u043b\u044c \u043e\u0442 \u0443\u0447\u0435\u0442\u043a\u0438 Confluence * @param table html \u043a\u043e\u0434 \u0442\u0430\u0431\u043b\u0438\u0446\u044b * @param title \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b * @param pageVersion \u0412\u0435\u0440\u0441\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b *\/ public static void createConfluenceTable(String url, String login, String password, String table, String title, int pageVersion) {    String TABLE_BODY = \"{\\n\" +            \"<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\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-384885","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/384885","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=384885"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/384885\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=384885"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=384885"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=384885"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}