{"id":91642,"date":"2020-11-03T07:55:03","date_gmt":"2020-11-03T06:55:03","guid":{"rendered":"https:\/\/blog.jetbrains.com\/?post_type=youtrack&#038;p=91642"},"modified":"2021-04-16T09:19:23","modified_gmt":"2021-04-16T08:19:23","slug":"make-it-workflow-part-13-supporting-test-management-scenarios","status":"publish","type":"youtrack","link":"https:\/\/blog.jetbrains.com\/ko\/youtrack\/2020\/11\/make-it-workflow-part-13-supporting-test-management-scenarios\/","title":{"rendered":"\uc6cc\ud06c\ud50c\ub85c\ub97c \uc6d0\ud65c\ud558\uac8c \ud30c\ud2b8 13: \ud14c\uc2a4\ud2b8 \uad00\ub9ac \uc2dc\ub098\ub9ac\uc624 \uc9c0\uc6d0"},"content":{"rendered":"<p><a href=\"https:\/\/blog.jetbrains.com\/ko\/youtrack\/2020\/11\/make-it-workflow-part-13-supporting-test-management-scenarios\/\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2020\/11\/YT_workflow_kor.png\" alt=\"\" \/><\/a><\/p>\n<\/p>\n<p>&#8216;\uc6cc\ud06c\ud50c\ub85c\ub97c \uc6d0\ud65c\ud558\uac8c&#8217; \uc2dc\ub9ac\uc988\uc5d0 \ub2e4\uc2dc \uc624\uc2e0 \uac83\uc744 \ud658\uc601\ud569\ub2c8\ub2e4! QA \ud300\uc5d0\uc11c \ud65c\uc6a9\ud560 \uc218 \uc788\ub294 YouTrack \uae30\ub2a5\uc5d0 \ub300\ud574 \ucee4\ubba4\ub2c8\ud2f0\ub85c\ubd80\ud130 \uba87 \uac00\uc9c0 \ub17c\uc758 \uc694\uccad\uc744 \ubc1b\uc558\uc2b5\ub2c8\ub2e4. \uc624\ub298\uc740 YouTrack\uc5d0\uc11c \ud14c\uc2a4\ud2b8 \uad00\ub9ac \uc2dc\ub098\ub9ac\uc624(TMS)\ub97c \uad00\ub9ac\ud558\ub294 \ubc29\ubc95\uc744 \uc0b4\ud3b4\ubcf4\uaca0\uc2b5\ub2c8\ub2e4. \uc774 \ubb38\uc11c\uc5d0\uc11c\ub294 YouTrack \uc790\uccb4 \ub0b4\uc5d0\uc11c \ud14c\uc2a4\ud2b8 \uad00\ub9ac \uae30\ub2a5\uc744 \uad00\ub9ac\ud558\uc5ec \ud0c0\uc0ac \uc194\ub8e8\uc158\uc744 \uc0ac\uc6a9\ud558\uc9c0 \uc54a\uc544\ub3c4 \ub418\ub3c4\ub85d YouTrack\uc744 \uc124\uc815\ud558\ub294 \ubc29\ubc95\uc744 \ubcf4\uc5ec\ub4dc\ub9b4 \uac83\uc785\ub2c8\ub2e4. \uc774\ub7ec\ud55c \uc811\uadfc \ubc29\uc2dd\uc740 \ub77c\uc774\uc120\uc2a4 \ube44\uc6a9\uc744 \uc808\uac10\ud558\uace0 \ud14c\uc2a4\ud2b8 \uad00\ub9ac \ud504\ub85c\uc138\uc2a4 \ud750\ub984\uc744 \ubcf4\ub2e4 \uc6d0\ud65c\ud558\uac8c \ub9cc\ub4dc\ub294 \ub370 \ub3c4\uc6c0\uc774 \ub429\ub2c8\ub2e4.<\/p>\n<p>\uc774 \ubb38\uc11c\ub294 \ud14c\uc2a4\ud2b8 \uad00\ub9ac\uc790 \ubc0f YouTrack \uc6cc\ud06c\ud50c\ub85c\uc5d0 \uad00\uc2ec\uc774 \uc788\ub294 \ubaa8\ub4e0 \uc0ac\uc6a9\uc790\ub97c \ub300\uc0c1\uc73c\ub85c \ud569\ub2c8\ub2e4. \ud504\ub85c\uc81d\ud2b8 \ubc0f \uc774\uc288 \uc124\uc815\uc5d0 \ub300\ud55c \uad8c\uc7a5 \uc0ac\ud56d, \ud14c\uc2a4\ud2b8 \uad00\ub9ac \uc2dc\ub098\ub9ac\uc624\ub97c \uad6c\ud604 \ubc29\ubc95\uc5d0 \ub300\ud55c \uc124\uba85 \ub4f1 YouTrack\uc5d0\uc11c \ud14c\uc2a4\ud2b8 \ud504\ub85c\uc138\uc2a4\ub97c \uad6c\ucd95\ud558\ub294 \ubc29\ubc95\uc5d0 \ub300\ud55c \uc2e4\uc6a9\uc801\uc778 \uc608\ub97c \ucc3e\uc744 \uc218 \uc788\uc744 \uac83\uc785\ub2c8\ub2e4.<\/p>\n<p><span id=\"more-77371\"><\/span><\/p>\n<p>\ub610\ud55c \ud14c\uc2a4\ud2b8 \uad00\ub9ac \ud504\ub85c\uc138\uc2a4\ub97c \uc790\ub3d9\ud654\ud558\ub294 \ub370 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \uc989\uc2dc \uc774\uc6a9 \uac00\ub2a5\ud55c \uc6cc\ud06c\ud50c\ub85c \ucf54\ub4dc \ube14\ub85d \ubaa9\ub85d\ub3c4 \uc900\ube44\ud588\uc2b5\ub2c8\ub2e4. \uc774\ub7ec\ud55c \ucf54\ub4dc \ube14\ub85d\uc744 \uc0ac\uc6a9\ud558\uba74 \ud14c\uc2a4\ud2b8 \ucf00\uc774\uc2a4\ub97c \ud2b9\uc815 \ud14c\uc2a4\ud2b8 \uc2e4\ud589\uc5d0 \uc5f0\uacb0\ud558\uace0, \ud14c\uc2a4\ud2b8 \uc2e4\ud589\uc744 \ubcf5\uc81c\ud558\uace0, \ub2e4\uc74c \ud14c\uc2a4\ud2b8\uc5d0 \ub300\ud55c \uc2dc\uc2a4\ud15c \uc81c\uc548\uc744 \ud45c\uc2dc\ud558\ub294 \ub4f1\uc758 \uc791\uc5c5\uc744 \uc27d\uac8c \uc218\ud589\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<br \/>\n<a name=\"ref1\"><\/a><\/p>\n<h2>YouTrack\uc758 \ud14c\uc2a4\ud2b8 \uad00\ub9ac \ud504\ub85c\uc81d\ud2b8 \uc124\uc815<\/h2>\n<p>Test Case, Test Suite(\ud14c\uc2a4\ud2b8 \ucf00\uc774\uc2a4 \uc138\ud2b8), Test Run(\ud2b9\uc815 \ud14c\uc2a4\ud2b8 \uc8fc\uae30\uc5d0 \ud560\ub2f9\ub41c \ud14c\uc2a4\ud2b8 \ucf00\uc774\uc2a4 \ub610\ub294 \ud14c\uc2a4\ud2b8 \uc2a4\uc704\ud2b8 \uc138\ud2b8) \ubc0f \ud2b9\uc815 \ud14c\uc2a4\ud2b8 \uc2e4\ud589\uc5d0 \uc9c0\uc815\ub41c Test Case Executions\uc640 \uac19\uc774 \ud14c\uc2a4\ud2b8 \uad00\ub9ac \ud504\ub85c\uc81d\ud2b8\uc5d0 \ud14c\uc2a4\ud2b8 \uad00\ub9ac\ubcc4 \uc774\uc288 \uc720\ud615\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud574\ub2f9 TMS \ud504\ub85c\uc81d\ud2b8\uc5d0 \ud544\uc694\ud55c \uc774\uc288 \uc720\ud615\uc744 <a href=\"https:\/\/www.jetbrains.com\/help\/youtrack\/standalone\/Manage-Custom-Fields-Per-Project.html#add-custom-field-to-project\" target=\"_blank\" rel=\"noopener\">\uad6c\uc131<\/a>\ud574\uc57c \ud569\ub2c8\ub2e4. \ud14c\uc2a4\ud2b8 \uad00\ub9ac \uc791\uc5c5 \uac04\uc758 \uc5f0\uacb0 \ubc0f \uad00\ub828\uc131\uc744 \uc218\ub9bd\ud558\uae30 \uc704\ud55c \uc138 \uac00\uc9c0 \uc720\ud615\uc758 <a href=\"https:\/\/www.jetbrains.com\/help\/youtrack\/standalone\/Link-Types.html\" target=\"_blank\" rel=\"noopener\">\uc774\uc288 \ub9c1\ud06c<\/a>\uac00 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<ul>\n<li>\ud45c\uc900 &#8216;parent-subtasks&#8217;\ub294 Test Run \ubc0f Test Case Executions\ub294 \ubb3c\ub860 Test Suite \ubc0f Test Case \uad00\uacc4\ub97c \uad00\ub9ac\ud569\ub2c8\ub2e4. <\/li>\n<li>\uc0ac\uc6a9\uc790 \uc815\uc758 \u2018Execution(\uc2e4\ud589)\u2019\uc740 \ud14c\uc2a4\ud2b8 \ucf00\uc774\uc2a4 \ubc0f \ud14c\uc2a4\ud2b8 \ucf00\uc774\uc2a4 \uc2e4\ud589 \uad00\uacc4\ub97c \uad00\ub9ac\ud569\ub2c8\ub2e4. <\/li>\n<li>\uc0ac\uc6a9\uc790 \uc815\uc758 &#8216;\uad00\ub828 \ubc84\uadf8&#8217;\ub294 \uc2e4\ud328\ud55c \ud14c\uc2a4\ud2b8 \ubc0f \ud560\ub2f9\ub41c \ubc84\uadf8 \uad00\uacc4\ub97c \uad00\ub9ac\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<p>\ud14c\uc2a4\ud2b8 \uc694\uad6c \uc0ac\ud56d\uc740 \ud14d\uc2a4\ud2b8 \ud544\ub4dc\uc758 \uc774\uc288\uc5d0 \uc5f0\uacb0\ub41c <a href=\"https:\/\/www.jetbrains.com\/help\/youtrack\/standalone\/create-articles.html\" target=\"_blank\" rel=\"noopener\">\uc790\ub8cc<\/a>\ub85c \uad00\ub9ac\ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4. <br \/>\n\ub610\ud55c \ud14c\uc2a4\ud2b8 \uad00\ub9ac \uc791\uc5c5\uc744 \uc704\ud574 <em>\ud14c\uc2a4\ud2b8 \ubaa8\ub4dc<\/em>, <em>\uce74\ud14c\uace0\ub9ac<\/em>, <em>\ud14c\uc2a4\ud2b8 \ud50c\ub85c<\/em> \ubc0f <em>\uc560\ud50c\ub9ac\ucf00\uc774\uc158<\/em> \ub4f1\uc758 <a href=\"https:\/\/www.jetbrains.com\/help\/youtrack\/standalone\/Manage-Custom-Fields-Per-Project.html#add-custom-field-to-project\" target=\"_blank\" rel=\"noopener\">\uc0ac\uc6a9\uc790 \uc815\uc758 \ud544\ub4dc<\/a>\uc640 \uc0ac\uc804 \uc815\uc758\ub41c \uac12(\uc608: \uc0ac\uc804 \uc815\uc758\ub41c \ud14c\uc2a4\ud2b8 \uc0c1\ud0dc)\uc744 \uc124\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud558\ub098\uc758 \uc774\uc288 \uc720\ud615\uc5d0 \ub300\ud574 \ud2b9\uc815\ud558\uac8c \uc815\ubcf4\ub97c \ud45c\uc2dc\ud574\uc57c \ud558\ub294 \uacbd\uc6b0, <a href=\"https:\/\/www.jetbrains.com\/help\/youtrack\/standalone\/conditional-custom-fields.html\" target=\"_blank\" rel=\"noopener\">\uc870\uac74\ubd80 \ud544\ub4dc<\/a>\ub97c \uc0ac\uc6a9\ud560 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2020\/09\/TMS0_1.png\" alt=\"\" \/><\/p>\n<p>&#8216;Test Case&#8217; \ubc0f &#8216;Test Run&#8217; \uc774\uc288 \uc720\ud615\uc5d0 \ub300\ud55c \uc0ac\uc804 \uc815\uc758\ub41c \ud544\ub4dc \ubaa8\uc74c\uc740 \ube44\uc988\ub2c8\uc2a4 \uc694\uad6c\uc5d0 \ub9de\uac8c \uc870\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<h2>Test Run \ubc0f Test Execution \uc124\uc815<\/h2>\n<p>\uc608\ub97c \ub4e4\uc5b4, \ud2b9\uc815 \uc81c\ud488 \ubc84\uc804\uc744 \ud14c\uc2a4\ud2b8\ud558\ub824\ub294 \uacbd\uc6b0, Test run\uc744 \ub9cc\ub4e4\uace0 \uad00\ub828 Test Suite\uc640 Test Case\ub97c \uc5ec\uae30\uc5d0 \ud560\ub2f9\ud574\uc57c \ud569\ub2c8\ub2e4. \uc774\ub97c \uc704\ud574 \ub530\ub77c\uc57c \ud560 \ub2e8\uacc4\ub294 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.<\/p>\n<ul>\n<li>&#8216;Test Run&#8217; \uc774\uc288 \uc720\ud615\uc73c\ub85c \uc774\uc288\ub97c \uc0dd\uc131\ud569\ub2c8\ub2e4. <\/li>\n<li> \u2018Assigned test case and test suite\u2019 \uc0ac\uc6a9\uc790 \uc815\uc758 \ub9c1\ud06c \uc720\ud615\uc744 \uc0ac\uc6a9\ud558\uc5ec \uc774\uc288\uc5d0 \uc5f0\uacb0\ud569\ub2c8\ub2e4.<\/li>\n<li>\ud31d\uc5c5 \ucc3d\uc5d0\uc11c Test run\uc5d0 \ud3ec\ud568\ud560 Test Case\ub97c \uc9c0\uc815\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<p>&#8216;Populate Test Run&#8217; \uc6cc\ud06c\ud50c\ub85c\uc758 \ub2e8\uacc4\ub97c \ud1b5\ud574 QA \ud300\uc758 \uc2dc\uac04\uacfc \ub178\ub825\uc744 \uc808\uc57d\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<ul>\n<li>\uc120\ud0dd\ud55c \ubaa8\ub4e0 Test Suite \ubc0f Test case\uc758 \uc0ac\ubcf8\uc774 \uc2dc\uc2a4\ud15c\uc5d0 \uc0dd\uc131\ub429\ub2c8\ub2e4. \ubaa8\ub4e0 \uc774\uc288\uc5d0\ub294 &#8216;Test Case Execution&#8217; \uc774\uc288 \uc720\ud615\uc774 \uc788\uc2b5\ub2c8\ub2e4. <\/li>\n<li>&#8216;Execution&#8217; \ub9c1\ud06c \uc720\ud615\uc740 Test Case Executions\ub97c \uc120\ud0dd\ud55c Test Case\uc5d0 \uc5f0\uacb0\ud569\ub2c8\ub2e4.<\/li>\n<li>\uc0c8\ub85c \uc0dd\uc131\ub41c \uc774\uc288\ub294 \uc0c1\uc704 \uc774\uc288 \ubc0f \uad00\ub828 \ud558\uc704 \uc791\uc5c5\uc73c\ub85c Test Run\uacfc \uc5f0\uacb0\ub429\ub2c8\ub2e4.<\/li>\n<\/ul>\n<p>\uc791\ub3d9 \ubc29\uc2dd\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/resources.jetbrains.com\/storage\/products\/blog\/wp-content\/uploads\/done1s720cut.gif\" alt=\"\" \/><\/p>\n<details>\n<summary>\n        \ucf54\ub4dc \ube14\ub85d \ud655\uc7a5\ud558\uae30<br \/>\n    <\/summary>\n<p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\" data-enlighter-title=\"\">\nvar entities = require(&#039;@jetbrains\/youtrack-scripting-api\/entities&#039;);\nvar workflow = require(&#039;@jetbrains\/youtrack-scripting-api\/workflow&#039;);\n\nexports.rule = entities.Issue.onChange({\n  title: &#039;Populate-test-run&#039;,\n  guard: function(ctx) {\n    var issue = ctx.issue;\n    return !issue.isChanged(&#039;project&#039;) &amp;&amp; issue.Type &amp;&amp; (issue.Type.name == ctx.Type.TestRun.name) &amp;&amp; issue.links[ctx.Execution.outward].added.isNotEmpty() &amp;&amp; issue.isReported;\n  },\n  action: function(ctx) {\n    var issue = ctx.issue;\n    var totalTestRuns = issue.links[ctx.Execution.outward].added.size;\n    issue.links[ctx.Execution.outward].added.forEach(function(TestCase) {\n      TestCase.links[ctx.Execution.inward].delete(issue);\n\n      var TestCaseRun = TestCase.copy();\n      TestCaseRun.Type = ctx.Type.TestExecution.name;\n      TestCaseRun.Status = ctx.Status.NoRun.name;\n      Object.keys(TestCaseRun.links).forEach(function(linkType) {\n       if (!TestCaseRun.links[linkType])\n        return;\n         TestCaseRun.links[linkType].clear();\n      });\n      TestCaseRun.summary = \"[TEST_CASE_EXECUTION\" + \"] [\" + TestCaseRun.summary + \"]\";\n\n      TestCaseRun.links[ctx.Subtask.inward].add(issue);\n      issue.links[ctx.Subtask.outward].add(TestCaseRun);\n      TestCaseRun.links[ctx.Execution.outward].add(TestCase);\n    });\n    issue.fields[&#039;Total number of test cases&#039;] = totalTestRuns;\n  },\n  requirements: {\n    Execution: {\n      type: entities.IssueLinkPrototype,\n      name: &#039;Execution&#039;,\n      inward: &#039;Execution&#039;,\n      outward: &#039;Assigned test case or test suite&#039;\n    },\n    Subtask: {\n      type: entities.IssueLinkPrototype,\n      name: &#039;Subtask&#039;,\n      inward: &#039;parent for&#039;,\n      outward: &#039;subtask of&#039;\n    },\n    Type: {\n      type: entities.EnumField.fieldType,\n      TestExecution: {\n        name: \"Test Case Execution\"\n      },\n      TestRun: {\n        name: \"Test Run\"\n      },\n      TestCase: {\n        name: \"Test Case\"\n      },\n      TestSuite: {\n        name: \"Test Suite\"\n      }\n    },\n    Total: {\n      type: entities.Field.integerType,\n      name: &#039;Total number of test cases&#039;\n    },\n    TotalFailed: {\n      type: entities.Field.integerType,\n      name: &#039;Number of failed test cases&#039;\n    },\n    TotalPassed: {\n      type: entities.Field.integerType,\n      name: &#039;Number of passed test cases&#039;\n    },\n    Status: {\n      type: entities.EnumField.fieldType,\n      InProgress: {\n        name: &#039;In Progress&#039;\n      },\n      Passed: {\n        name: &#039;Passed&#039;\n      },\n      Failed: {\n        name: &#039;Failed&#039;\n      },\n      NoRun: {\n        name: &#039;No Run&#039;\n      },\n    },\n  }\n});\n<\/pre>\n<p>\n<\/details>\n<h2>\ud14c\uc2a4\ud2b8 \ud65c\ub3d9 \uad00\ub9ac<\/h2>\n<p>Test Run\uc774 \uc644\uc804\ud788 \uc124\uc815\ub418\uba74 \ud14c\uc2a4\ud2b8 \uc5d4\uc9c0\ub2c8\uc5b4\uac00 \ud14c\uc2a4\ud2b8\ub97c \uc2dc\uc791\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uae30\ubcf8\uc801\uc73c\ub85c, &#8216;\ud14c\uc2a4\ud2b8 \ucf00\uc774\uc2a4 \uc218\ud589&#8217; \ubc0f &#8216;\ud14c\uc2a4\ud2b8 \uc2e4\ud589&#8217; \uc720\ud615\uc758 \ubaa8\ub4e0 \uc774\uc288\ub294 &#8216;\uc2e4\ud589 \uc5c6\uc74c&#8217; \uc0c1\ud0dc\uc785\ub2c8\ub2e4.<\/p>\n<h3>\ud14c\uc2a4\ud2b8 \uc0ac\uc774\ub97c \uc804\ud658\ud558\ub294 \ubc29\ubc95<\/h3>\n<p>\ud14c\uc2a4\ud2b8 \uc138\ud2b8\ub85c \uc791\uc5c5\ud560 \ub54c \ud55c \ud14c\uc2a4\ud2b8\uc5d0\uc11c \ub2e4\ub978 \ud14c\uc2a4\ud2b8\ub85c \uc804\ud658\ud558\ub294 \ubc29\ubc95\uc5d0\ub294 \ub450 \uac00\uc9c0\uac00 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<ol>\n<li>\uc774\uc288 \ubaa9\ub85d \ud398\uc774\uc9c0\uc5d0\uc11c \ud14c\uc2a4\ud2b8 \uc0c1\ud0dc\ub97c \uc218\ub3d9\uc73c\ub85c \ubcc0\uacbd\ud569\ub2c8\ub2e4. <\/li>\n<li>\ud14c\uc2a4\ud2b8\ub97c \uc5f4\uace0 \uc644\ub8cc\ub418\uc9c0 \uc54a\uc740 \ub2e4\uc74c \ud14c\uc2a4\ud2b8\ub85c \uc804\ud658\ud569\ub2c8\ub2e4. \uc774 \ubc29\uc2dd\uc73c\ub85c \ud14c\uc2a4\ud2b8\ub97c \uc804\ud658\ud558\uace0\uc790 \ud560 \ub54c\ub294, \ub2e4\uc74c \ud14c\uc2a4\ud2b8\ub97c \uc2e4\ud589\ud558\ub3c4\ub85d \uc81c\uc548\ud558\ub294 \uc720\uc6a9\ud55c \ud31d\uc5c5\uc774 \ub098\ud0c0\ub0a9\ub2c8\ub2e4.<br \/>\n    \ub2e4\uc74c\uc758 \uc561\uc158\uc740 \uc790\ub3d9\ud654\ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4. <\/p>\n<ul>\n<li> &#8216;No Run&#8217; \uc0c1\ud0dc\uc774\uace0 \ub3d9\uc77c\ud55c \ud14c\uc2a4\ud2b8 \uc2e4\ud589\uc5d0 \uc18d\ud558\ub294 \ud14c\uc2a4\ud2b8\uac00 \uc788\ub294\uc9c0 \ud655\uc778\ud569\ub2c8\ub2e4.<\/li>\n<li> \uc0ac\uc6a9 \uac00\ub2a5\ud55c \ub2e4\uc74c \ud14c\uc2a4\ud2b8\uc758 URL\uc774 \uc788\ub294 \uba54\uc2dc\uc9c0\ub97c \ud45c\uc2dc\ud569\ub2c8\ub2e4(\uc788\ub294 \uacbd\uc6b0).\n<p>    <a href=\"https:\/\/resources.jetbrains.com\/storage\/products\/blog\/wp-content\/uploads\/done3s720.gif\" rel=\"attachment wp-att-6366 noopener\" target=\"_blank\"><img decoding=\"async\" src=\"https:\/\/resources.jetbrains.com\/storage\/products\/blog\/wp-content\/uploads\/done3s720.gif\" alt=\"ApplyingCommandForSubsystem\"  \/><\/a><\/li>\n<\/ul>\n<p> \uc774\ub97c \uad6c\ud604\ud558\ub294 \ub370 \uc544\ub798 \ucf54\ub4dc\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<details>\n<summary>\n        \ucf54\ub4dc \ube14\ub85d \ud655\uc7a5\ud558\uae30<br \/>\n    <\/summary>\n<p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\" data-enlighter-title=\"\">\n action: function(ctx) {\n  var issue = ctx.issue;\n  if (!issue.links[&#039;subtask of&#039;].isEmpty) {\n              var parent = issue.links[&#039;subtask of&#039;].first();\n              var TestRunList = parent.links[ctx.Subtask.outward];\n              var resultSet = null;\n              var isPassing = true;\n              TestRunList.forEach(function(v) {\n                if (v.Status.name == ctx.Status.Failed.name) {\n                  isPassing = false;\n                } else if ((v.Status.name == ctx.Status.InProgress.name) &amp;&amp; (v.id !== issue.id)) {\n                  resultSet = v;\n                }\n              });\n              if (resultSet) {\n                var otherIssueLink = &#039;<a href=\"&#039; + resultSet.url + &#039;\"> &#039; + resultSet.id + &#039;<\/a>&#039;;\n                var message = &#039;Switch to next open test in current Test Run&#039; + otherIssueLink + &#039;.&#039;;\n                workflow.message(message);\n    }\n}\n}\n<\/pre>\n<p>\n<\/details>\n<\/ol>\n<h2>\ud14c\uc2a4\ud2b8 \uc0c1\ud0dc <\/h2>\n<p><a name=\"ref2\"><\/a><\/p>\n<p>\ud55c \ud14c\uc2a4\ud2b8\uc5d0\uc11c \ub2e4\ub978 \ud14c\uc2a4\ud2b8\ub85c \uc804\ud658\ud560 \ub54c \ud14c\uc2a4\ud2b8 \uc5d4\uc9c0\ub2c8\uc5b4\ub294 \ud14c\uc2a4\ud2b8\uac00 &#8216;Passed(\ud1b5\uacfc)&#8217;\ub41c \uac83\uc73c\ub85c \ub098\ud0c0\ub0b4\uac70\ub098, \ud14c\uc2a4\ud2b8 \uc0c1\ud0dc\ub97c \u2018Failed(\uc2e4\ud328)'(Test case \uc218\ud589 \uc911\uc5d0 \ubc84\uadf8\uac00 \ud655\uc778\ub41c \uacbd\uc6b0)\ub85c \ubcc0\uacbd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \ud504\ub85c\uc81d\ud2b8\uc5d0 \ub300\ud574 \ucc98\uc74c\uc5d0 \uad6c\uc131\ud55c <a href=\"#ref1\">YouTrack \uc124\uc815<\/a>\uc5d0 \ub530\ub77c \uc0ac\uc804 \uc815\uc758\ub41c \uba87 \uac00\uc9c0 \ud14c\uc2a4\ud2b8 \uc2e4\ud589 \uc0c1\ud0dc\uac00 \uc874\uc7ac\ud569\ub2c8\ub2e4.<\/p>\n<ul>\n<li>Failing(\uc2e4\ud328): \uc5f0\uacb0\ub41c \ud14c\uc2a4\ud2b8 \uc911 \ud558\ub098 \uc774\uc0c1\uc774 &#8216;No run&#8217; \uc0c1\ud0dc\uc774\uace0, \uc5f0\uacb0\ub41c \ud14c\uc2a4\ud2b8 \uc911 \ud558\ub098 \uc774\uc0c1\uc774 &#8216;Failed&#8217; \uc0c1\ud0dc\uc784.<\/li>\n<li>Passing(\ud1b5\uacfc): \uc5f0\uacb0\ub41c \ud14c\uc2a4\ud2b8 \uc911 \ud558\ub098 \uc774\uc0c1\uc774 &#8216;No run&#8217; \uc0c1\ud0dc\uc774\uace0, \uc0c1\ud0dc\uac00 &#8216;Failed&#8217;\uc778 \uc5f0\uacb0\ub41c \ud14c\uc2a4\ud2b8\uac00 \uc5c6\uc74c.<\/li>\n<li>Failed(\uc2e4\ud328): &#8216;No Run&#8217; \uc0c1\ud0dc\uc778 \uc5f0\uacb0\ub41c \ud14c\uc2a4\ud2b8\uac00 \uc5c6\uace0, \ud558\ub098 \uc774\uc0c1\uc758 \uc5f0\uacb0\ub41c \ud14c\uc2a4\ud2b8\uac00 &#8216;Failed&#8217; \uc0c1\ud0dc\uc784.<\/li>\n<li>Passed(\ud1b5\uacfc\ud568): \uc5f0\uacb0\ub41c \ud14c\uc2a4\ud2b8\uc5d0 &#8216;No Run&#8217; \ub610\ub294 &#8216;Failed&#8217; \uc0c1\ud0dc\uac00 \uc5c6\uc74c.<\/li>\n<\/ul>\n<p><img decoding=\"async\" src=\"https:\/\/resources.jetbrains.com\/storage\/products\/blog\/wp-content\/uploads\/done2s720.gif\" alt=\"\" \/><\/p>\n<p>\uc704\uc5d0 \ub098\uc5f4\ub41c \uc0c1\ud0dc\ub294 QA \ud300\uc774 \uc804\uccb4 \ud14c\uc2a4\ud2b8 \uc8fc\uae30 \ub3d9\uc548 \ud14c\uc2a4\ud2b8 \uc9c4\ud589 \uc0c1\ud669\uc744 \ubaa8\ub2c8\ud130\ub9c1\ud558\ub294 \ub370 \ub3c4\uc6c0\uc774 \ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4. Test Run \uc0c1\ud0dc\ub294 \uc5f0\uacb0\ub41c \ud14c\uc2a4\ud2b8\uc5d0 \ub530\ub77c\uc11c\ub9cc \uacb0\uc815\ub418\uba70 \uc218\ub3d9\uc73c\ub85c \ubcc0\uacbd\ud574\uc11c\ub294 \uc548\ub41c\ub2e4\ub294 \uc810\uc5d0 \uc720\uc758\ud574\uc57c \ud569\ub2c8\ub2e4. Test Run \uc0c1\ud0dc\ub97c \uacb0\uc815\ud558\ub294 \ud504\ub85c\uc138\uc2a4\ub294 <a href=\"https:\/\/www.jetbrains.com\/help\/youtrack\/standalone\/state-machine-per-issue-type.html#state-machine-per-issue-type2\" target=\"_blank\" rel=\"noopener\">state-machines per issue type(\uc774\uc288 \uc720\ud615\ubcc4 \uc0c1\ud0dc \uc2dc\uc2a4\ud15c)<\/a> \uc6cc\ud06c\ud50c\ub85c\ub97c \uc0ac\uc6a9\ud558\uc5ec \uad6c\ud604\ub429\ub2c8\ub2e4. \ud14c\uc2a4\ud2b8 \uac04 \uc804\ud658\uc744 \uc704\ud55c \ucf54\ub4dc\ub3c4 \uc6cc\ud06c\ud50c\ub85c\uc5d0 \ud1b5\ud569\ub429\ub2c8\ub2e4.<\/p>\n<details>\n<summary>\n        \ucf54\ub4dc \ube14\ub85d \ud655\uc7a5\ud558\uae30<br \/>\n    <\/summary>\n<p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\" data-enlighter-title=\"\">\n\nvar entities = require(&#039;@jetbrains\/youtrack-scripting-api\/entities&#039;);\nvar workflow = require(&#039;@jetbrains\/youtrack-scripting-api\/workflow&#039;);\n\nexports.rule = entities.Issue.stateMachine({\n  title: &#039;status-management&#039;,\n  stateFieldName: &#039;Status&#039;,\n  typeFieldName: &#039;Type&#039;,\n  defaultMachine: {\n    &#039;No Run&#039;: {\n      initial: true,\n      transitions: {\n        &#039;Failed&#039;: {\n          targetState: &#039;Failed&#039;,\n          action: function(ctx) {\n            var issue = ctx.issue;\n            if (!issue.links[&#039;subtask of&#039;].isEmpty) {\n              var parent = issue.links[&#039;subtask of&#039;].first();\n              var TestRunList = parent.links[ctx.Subtask.outward];\n              var resultSet = null;\n              var isPassing = true;\n              TestRunList.forEach(function(v) {\n                if (v.Status.name == ctx.Status.Failed.name) {\n                  isPassing = false;\n                } else if ((v.Status.name == ctx.Status.InProgress.name) &amp;&amp; (v.id !== issue.id)) {\n                  resultSet = v;\n                }\n              });\n              if (resultSet) {\n                var otherIssueLink = &#039;<a href=\"&#039; + resultSet.url + &#039;\"> &#039; + resultSet.id + &#039;<\/a>&#039;;\n                var message = &#039;Switch to next open test in current Test Run&#039; + otherIssueLink + &#039;.&#039;;\n                workflow.message(message);\n                \/\/ Updating Test Run Status \n                parent.fields[\"Status\"] = ctx.Status.Failing;\n              } else {\n                parent.fields[\"Status\"] = ctx.Status.Failed;\n              }\n            }\n          }\n        },\n        &#039;Passed&#039;: {\n          guard: function(ctx) {\n            var issue = ctx.issue;\n            return !issue.isChanged(&#039;project&#039;) &amp;&amp; !issue.becomesReported &amp;&amp; issue.isReported &amp;&amp; (issue.Type.name == ctx.Type.TestExecution.name);\n          },\n          targetState: &#039;Passed&#039;,\n          action: function(ctx) {\n            var issue = ctx.issue;\n            if (!issue.links[&#039;subtask of&#039;].isEmpty) {\n              var parent = issue.links[&#039;subtask of&#039;].first();\n              var TestRunList = parent.links[ctx.Subtask.outward];\n              var resultSet = null;\n              var isPassing = true;\n              TestRunList.forEach(function(v) {\n                if (v.Status.name == ctx.Status.Failed.name) {\n                  isPassing = false;\n                } else if ((v.Status.name == ctx.Status.InProgress.name) &amp;&amp; (v.id !== issue.id)) {\n                  resultSet = v;\n                }\n              });\n              if (resultSet) {\n                var otherIssueLink = &#039;<a href=\"&#039; + resultSet.url + &#039;\"> &#039; + resultSet.id + &#039;<\/a>&#039;;\n                var message = &#039;Switch to next open test in current Test Run&#039; + otherIssueLink + &#039;.&#039;;\n                workflow.message(message);\n                parent.fields[\"Status\"] = (isPassing) ? ctx.Status.Passing : ctx.Status.Failing;\n              } else {\n                parent.fields[\"Status\"] = (isPassing) ? ctx.Status.Passed : ctx.Status.Failed;\n              }\n            }\n          }\n        }\n      }\n    },\n    Passed: {\n      transitions: {\n        &#039;Failed&#039;: {\n          guard: function(ctx) {\n            var issue = ctx.issue;\n            return !issue.isChanged(&#039;project&#039;) &amp;&amp; !issue.becomesReported &amp;&amp; issue.isReported &amp;&amp; (issue.Type.name == ctx.Type.TestExecution.name);\n          },\n          targetState: &#039;Failed&#039;,\n          action: function(ctx) {\n            var issue = ctx.issue;\n            if (!issue.links[&#039;subtask of&#039;].isEmpty) {\n             var parent = issue.links[&#039;subtask of&#039;].first();\n              var TestRunList = parent.links[ctx.Subtask.outward];\n              var resultSet = null;\n              TestRunList.forEach(function(v) {\n                if (v.Status.name == ctx.Status.Failed.name) {\n                } else if ((v.Status.name == ctx.Status.InProgress.name) &amp;&amp; (v.id !== issue.id)) {\n                  resultSet = v;\n                }\n              });\n              if (resultSet) {\n                var otherIssueLink = &#039;<a href=\"&#039; + resultSet.url + &#039;\"> &#039; + resultSet.id + &#039;<\/a>&#039;;\n                var message = &#039;Switch to next open test in current Test Run&#039; + otherIssueLink + &#039;.&#039;;\n                workflow.message(message);\n                parent.fields[\"Status\"] = ctx.Status.Failing;\n              } else {\n                parent.Status = ctx.Status.Failed;\n              }\n            }\n          }\n        },\n        &#039;No Run&#039;: {\n          guard: function(ctx) {\n            var issue = ctx.issue;\n            return !issue.isChanged(&#039;project&#039;) &amp;&amp; !issue.becomesReported &amp;&amp; issue.isReported &amp;&amp; (issue.Type.name == ctx.Type.TestExecution.name);\n          },\n          targetState: &#039;No Run&#039;,\n          action: function(ctx) {\n            var issue = ctx.issue;\n            if (!issue.links[&#039;subtask of&#039;].isEmpty) {\n              var parent = issue.links[&#039;subtask of&#039;].first();\n              var TestRunList = parent.links[ctx.Subtask.outward];\n              var ActiveTestRun = false;\n              var isPassing = true;\n              TestRunList.forEach(function(v) {\n                if (v.Status.name == ctx.Status.Failed.name) {\n                  isPassing = false;\n                  ActiveTestRun = true;\n                } else if ((v.Status.name == ctx.Status.Passed.name) &amp;&amp; (v.id !== issue.id)) {\n                  ActiveTestRun = true;\n                }\n              });\n              if (ActiveTestRun) {\n                parent.fields[\"Status\"] = (isPassing) ? ctx.Status.Passing : ctx.Status.Failing;\n              } else parent.fields[\"Status\"] = ctx.Status.InProgress;\n            }\n          }\n        }\n      }\n    },\n    Failed: {\n      transitions: {\n        &#039;Passed&#039;: {\n          guard: function(ctx) {\n            var issue = ctx.issue;\n            return !issue.isChanged(&#039;project&#039;) &amp;&amp; !issue.becomesReported &amp;&amp; issue.isReported &amp;&amp; (issue.Type.name == ctx.Type.TestExecution.name);\n          },\n          targetState: &#039;Passed&#039;,\n          action: function(ctx) {\n            var issue = ctx.issue;\n            if (!issue.links[&#039;subtask of&#039;].isEmpty) {\n              var parent = issue.links[&#039;subtask of&#039;].first();\n              var TestRunList = parent.links[ctx.Subtask.outward];\n              var resultSet = null;\n              var isPassing = true;\n              TestRunList.forEach(function(v) {\n                if ((v.Status.name == ctx.Status.Failed.name) &amp;&amp; (v.id !== issue.id)) {\n                  isPassing = false;\n                } else if ((v.Status.name == ctx.Status.InProgress.name) &amp;&amp; (v.id !== issue.id)) {\n                  resultSet = v;\n                }\n              });\n              if (resultSet) {\n                var otherIssueLink = &#039;<a href=\"&#039; + resultSet.url + &#039;\"> &#039; + resultSet.id + &#039;<\/a>&#039;;\n                var message = &#039;Switch to next open test in current Test Run&#039; + otherIssueLink + &#039;.&#039;;\n                workflow.message(message);\n\n                parent.fields[\"Status\"] = (isPassing) ? ctx.Status.Passing : ctx.Status.Failing;\n              } else {\n                parent.fields[\"Status\"] = (isPassing) ? ctx.Status.Passed : ctx.Status.Failed;\n              }\n            }\n          }\n        },\n        &#039;No Run&#039;: {\n          guard: function(ctx) {\n            var issue = ctx.issue;\n            return !issue.isChanged(&#039;project&#039;) &amp;&amp; !issue.becomesReported &amp;&amp; issue.isReported &amp;&amp; (issue.Type.name == ctx.Type.TestExecution.name);\n          },\n          targetState: &#039;No Run&#039;,\n          action: function(ctx) {\n            var issue = ctx.issue;\n            if (!issue.links[&#039;subtask of&#039;].isEmpty) {\n              var parent = issue.links[&#039;subtask of&#039;].first();\n              var TestRunList = parent.links[ctx.Subtask.outward];\n              var ActiveTestRun = false;\n              var isPassing = true;\n              TestRunList.forEach(function(v) {\n                if ((v.Status.name == ctx.Status.Failed.name) &amp;&amp; (v.id !== issue.id)) {\n                  isPassing = false;\n                  ActiveTestRun = true;\n                } else if ((v.Status.name == ctx.Status.Passed.name) &amp;&amp; (v.id !== issue.id)) {\n                  ActiveTestRun = true;\n                }\n              });\n              if (ActiveTestRun) {\n                parent.fields[\"Status\"] = (isPassing) ? ctx.Status.Passing : ctx.Status.Failing;\n              } else parent.fields[\"Status\"] = ctx.Status.InProgress;\n            }\n          }\n        }\n      }\n    }\n  },\n  alternativeMachines: {\n    &#039;Test Run&#039;: {\n      &#039;No Run&#039;: {\n        initial: true,\n        transitions: {\n          &#039;Failing&#039;: {\n            targetState: &#039;Failing&#039;,\n            action: function(ctx) {\n           \/* Add actions. *\/\n            }\n          },\n          &#039;Failed&#039;: {\n            targetState: &#039;Failed&#039;,\n            action: function(ctx) {\n         \/* Add actions. *\/\n            }\n          },\n          &#039;Passing&#039;: {\n            targetState: &#039;Passing&#039;,\n            action: function(ctx) {\n          \/* Add actions. *\/\n            }\n          },\n          &#039;Passed&#039;: {\n            targetState: &#039;Passed&#039;,\n            action: function(ctx) {\n           \/* Add actions. *\/\n            }\n          }\n        }\n      },\n      Failing: {\n        transitions: {\n          &#039;Passing&#039;: {\n            targetState: &#039;Passing&#039;,\n            action: function(ctx) {\n           \/* Add actions . *\/\n            }\n          },\n          &#039;Passed&#039;: {\n            targetState: &#039;Passed&#039;,\n            action: function(ctx) {\n          \/* Add actions. *\/\n            }\n          },\n          &#039;Failed&#039;: {\n            targetState: &#039;Failed&#039;,\n            action: function(ctx) {\n           \/* Add actions. *\/\n            }\n          }\n        }\n      },\n      Passing: {\n        transitions: {\n          &#039;Failing&#039;: {\n            targetState: &#039;Passing&#039;,\n            action: function(ctx) {\n              workflow.check(false, workflow.i18n(&#039;Test Run has-read-only status which is defined based on assigned tests statuses&#039;));\n            }\n          },\n          &#039;Passed&#039;: {\n            targetState: &#039;Passed&#039;,\n            action: function(ctx) {\n           \/* Add actions. *\/\n            }\n          },\n          &#039;Failed&#039;: {\n            targetState: &#039;Failed&#039;,\n            action: function(ctx) {\n           \/* Add actions. *\/\n            }\n          }\n        }\n      },\n      Failed: {\n        transitions: {\n          &#039;Passing&#039;: {\n            targetState: &#039;Passing&#039;,\n            action: function(ctx) {\n           \/* Add actions. *\/\n            }\n          },\n          &#039;Passed&#039;: {\n            targetState: &#039;Passed&#039;,\n            action: function(ctx) {\n           \/* Add actions. *\/\n            }\n          },\n          &#039;Failing&#039;: {\n            targetState: &#039;Failed&#039;,\n            action: function(ctx) {\n           \/* Add actions. *\/\n            }\n          }\n        }\n      },\n      Passed: {\n        transitions: {\n          &#039;Passing&#039;: {\n            targetState: &#039;Passing&#039;,\n            action: function(ctx) {\n           \/* Add actions. *\/\n            }\n          },\n          &#039;Failed&#039;: {\n            targetState: &#039;Passed&#039;,\n            action: function(ctx) {\n          \/* Add actions. *\/\n            },\n          },\n          &#039;Failing&#039;: {\n            targetState: &#039;Failed&#039;,\n            action: function(ctx) {\n           \/* Add actions. *\/\n            }\n          }\n        }\n      }\n    }\n  },\n  requirements: {\n    Assignee: {\n      type: entities.User.fieldType\n    },\n    Status: {\n      type: entities.EnumField.fieldType,\n      InProgress: {\n        name: &#039;No Run&#039;\n      },\n      Failing: {\n        name: &#039;Failing&#039;\n      },\n      Passing: {\n        name: &#039;Passing&#039;\n      },\n      Passed: {\n        name: &#039;Passed&#039;\n      },\n      Failed: {\n        name: &#039;Failed&#039;\n      },\n    },\n    Type: {\n      type: entities.EnumField.fieldType,\n      TestRun: {\n        name: \"Test Run\"\n      },\n      TestExecution: {\n        name: \"Test Case Execution\"\n      }\n    },\n    Subtask: {\n      type: entities.IssueLinkPrototype,\n      name: &#039;Subtask&#039;,\n      inward: &#039;subtask of&#039;,\n      outward: &#039;parent for&#039;\n    },\n  }\n});\n <\/pre>\n<p>\n <\/details>\n<h1>\ud14c\uc2a4\ud2b8 \ud1b5\uacc4<\/h1>\n<p>\uc8fc\uc694 \ud14c\uc2a4\ud2b8 \uc8fc\uae30 \ud1b5\uacc4\uc5d0 \uad00\uc2ec\uc774 \uc788\uc744 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4. \uc544\ub798\uc758 \ub370\ubaa8\uc5d0\uc11c\ub294 \ub2e4\uc74c\uacfc \uac19\uc740 \uba54\ud2b8\ub9ad\uc2a4\ub97c \ud1b5\ud569\ud558\uc600\uc2b5\ub2c8\ub2e4.<\/p>\n<ul>\n<li>\ud2b9\uc815 Test Run\uc5d0 \ud560\ub2f9\ub41c \ucd1d \ud14c\uc2a4\ud2b8 \uc218.<\/li>\n<li>&#8216;Passed(\ud1b5\uacfc\ub428)&#8217; \uc0c1\ud0dc\uc758 \ud14c\uc2a4\ud2b8 \uc218.<\/li>\n<li>&#8216;Failed(\uc2e4\ud328\ud568)&#8217; \uc0c1\ud0dc\uc758 \ud14c\uc2a4\ud2b8 \uc218.<\/li>\n<\/ul>\n<p><img decoding=\"async\" src=\"https:\/\/resources.jetbrains.com\/storage\/products\/blog\/wp-content\/uploads\/done5s720.gif\" alt=\"\" \/><br \/>\n\uc544\ub798 \ucf54\ub4dc \ub355\ubd84\uc5d0 \ud14c\uc2a4\ud2b8 \uc0c1\ud0dc \ubcc0\uacbd, Test Run\uc5d0 \uc0c8 \ud14c\uc2a4\ud2b8 \ud560\ub2f9 \ubc0f Test Run\uc5d0\uc11c \ud14c\uc2a4\ud2b8 \uc81c\uac70\uc640 \uac19\uc740 \ubcc0\uacbd\uc774 \ubc1c\uc0dd\ud558\uba74 \ubaa8\ub4e0 \uba54\ud2b8\ub9ad\uc774 \uc5c5\ub370\uc774\ud2b8\ub429\ub2c8\ub2e4.<\/p>\n<details>\n<summary>\n        \ucf54\ub4dc \ube14\ub85d \ud655\uc7a5\ud558\uae30<br \/>\n    <\/summary>\n<p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\" data-enlighter-title=\"\">\n  exports.calculateStatuses = function(parent) {\n  var totalTR = 0;\n  var totalFailed = 0;\n  var totalPassed = 0;\n  if (!parent.links[&#039;parent for&#039;]) {\n    return;\n  } else {\n    parent.links[&#039;parent for&#039;].forEach(function(tr) {\n      totalTR++;\n      if (tr.Status.name == &#039;Passed&#039;) {\n        totalFailed++;\n      }\n      if (tr.Status.name == &#039;Failed&#039;) {\n        totalPassed++;\n      }\n    });\n    parent.fields[&#039;Total number of test cases&#039;] = totalTR;\n    parent.fields[&#039;Number of passed test cases&#039;] = totalPassed;\n    parent.fields[&#039;Number of failed test cases&#039;] = totalFailed;\n    return true;\n  }\n};\nexports.resetStatuses = function(testRun, testRunCopy) {\n   testRunCopy.fields[&#039;Total number of test cases&#039;] = testRun.fields[&#039;Total number of test cases&#039;];\n   testRunCopy.fields[&#039;Number of passed test cases&#039;] = 0;\n   testRunCopy.fields[&#039;Number of failed test cases&#039;] = 0;\n  return true;\n};\n<\/pre>\n<p>\n<\/details>\n<p>\uc774 \uacbd\uc6b0\uc5d0 \uc774 \ucf54\ub4dc\ub294 &#8216;Update stats when links are adjusted\u2019(\ub9c1\ud06c\uac00 \uc870\uc815\ub418\uba74 \ud1b5\uacc4 \uc5c5\ub370\uc774\ud2b8)&#8217;, &#8216;Switch to the next test case(\ub2e4\uc74c \ud14c\uc2a4\ud2b8 \ucf00\uc774\uc2a4\ub85c \uc804\ud658)&#8217; \ub4f1\uacfc \uac19\uc740 \uc5ec\ub7ec \uc6cc\ud06c\ud50c\ub85c \uaddc\uce59\uc5d0 \ub530\ub77c \ud2b8\ub9ac\uac70\ub429\ub2c8\ub2e4. \ud2b9\uc815 \uc694\uad6c \uc0ac\ud56d\uc5d0 \ub9de\ub294 \uba54\ud2b8\ub9ad \uc138\ud2b8\ub97c \uc0ac\uc6a9\ud558\ub824\ub294 \uacbd\uc6b0, \ud544\uc694\ud55c \uc0ac\uc6a9\uc790 \uc815\uc758 \ud544\ub4dc\ub97c \ucd94\uac00\ud558\uace0 \uc6cc\ud06c\ud50c\ub85c \ub17c\ub9ac\ub97c \uc870\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<h2>\uc774\uc288 \ud2b8\ub798\ucee4 \uae30\ub2a5<\/h2>\n<p>\uc2e4\ud328\ud55c \ud14c\uc2a4\ud2b8\uc5d0\uc11c \ubc1c\uacac\ub41c \ubc84\uadf8\ub97c \ud574\uacb0\ud558\ub294 \ubcc4\ub3c4\uc758 \uc791\uc5c5\uc744 \ub9cc\ub4e4\uace0, \uc774 \uc791\uc5c5\uc744 \uad00\ub828 Test Case Execution\uc744 \uc2dd\ubcc4\ud558\ub294 \uc774\uc288\uc5d0 \uc5f0\uacb0\ud560 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4. \uc0ac\uc6a9\uc790 \uc815\uc758 \uc774\uc288 \ub9c1\ud06c \uc720\ud615\uc744 \uc0ac\uc6a9\ud558\uc5ec \uc2e4\ud328\ud55c \ud14c\uc2a4\ud2b8\ub97c \uad00\ub828 \ubc84\uadf8\uc640 \uc5f0\uacb0\ud558\uac70\ub098, \ubc84\uadf8\uc5d0 \ub300\ud55c \ucc38\uc870\uac00 \ud3ec\ud568\ub41c \uc0ac\uc6a9\uc790 \uc815\uc758 \ud14d\uc2a4\ud2b8 \ud544\ub4dc\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ubc84\uadf8\ub97c \ucd94\uc801\ud558\uae30 \uc704\ud574 \ubcc4\ub3c4\uc758 YouTrack \ud504\ub85c\uc81d\ud2b8\ub97c \uad6c\uc131\ud558\ub294 \uac83\uc774 \ub354 \uc26c\uc6b8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2020\/09\/TMS7.png\" alt=\"\" \/><\/p>\n<h2>\uac00\ub2a5\ud55c \uae30\ub2a5 \uac1c\uc120<\/h2>\n<p>\ucd94\uac00\uc801\uc778 \ube44\uc988\ub2c8\uc2a4 \uc694\uad6c \uc0ac\ud56d\uc744 \ucda9\uc871\ud558\ub3c4\ub85d YouTrack\uc758 \uae30\ub2a5\uc744 \ud655\uc7a5\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uace0\ub824\ud560 \uc218 \uc788\ub294 \uba87 \uac00\uc9c0 \uc635\uc158\uc774 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<h3>\uae30\uc874 Test Run \ubcf5\uc81c<\/h3>\n<p>\ub54c\ub85c\ub294 \uae30\uc874 \ud14c\uc2a4\ud2b8\uc640 \uc720\uc0ac\ud558\uc9c0\ub9cc \uc57d\uac04\uc758 \ubcc0\uacbd \uc0ac\ud56d(\uc608: \ud560\ub2f9\ub41c \ubc84\uc804 \ubcc0\uacbd)\uc744 \ud3ec\ud568\ud55c \uc0c8\ub85c\uc6b4 Test Run\uc744 \ub9cc\ub4dc\ub294 \uac83\uc774 \ub9e4\uc6b0 \uc720\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. &#8216;Create Test Run copy(\ud14c\uc2a4\ud2b8 \uc2e4\ud589 \ubcf5\uc0ac\ubcf8 \ub9cc\ub4e4\uae30)&#8217; \uba54\ub274 \ud56d\ubaa9\uc740 \uc815\ud655\ud788 \uc774\ub7ec\ud55c \uacbd\uc6b0\ub97c \uc704\ud574 \ub9cc\ub4e4\uc5b4\uc84c\uc2b5\ub2c8\ub2e4. \uc774 \uba54\ub274 \ud56d\ubaa9\uc740 &#8216;Test Run&#8217; \uc774\uc288 \uc720\ud615\uc744 \uac00\uc9c4 \uc774\uc288\uc5d0\ub9cc \uc0ac\uc6a9\ud560 \uc218 \uc788\uc73c\uba70 \ub2e4\uc74c \ub3d9\uc791\uc744 \ud2b8\ub9ac\uac70\ud569\ub2c8\ub2e4.<\/p>\n<ul>\n<li>Test Run\uc758 \ubcf5\uc0ac\ubcf8\uacfc \uc5ec\uae30\uc5d0 \ud560\ub2f9\ub41c Test Case Executions\uc758 \ubcf5\uc0ac\ubcf8\uc744 \ub9cc\ub4ed\ub2c8\ub2e4.<\/li>\n<li>\uc0c8\ub85c \ub9cc\ub4e4\uc5b4\uc9c4 \ubaa8\ub4e0 Test Case Execution \ubcf5\uc0ac\ubcf8\uc740 &#8216;\uc0c1\uc704-\ud558\uc704&#8217; \uc774\uc288 \ub9c1\ud06c \uc720\ud615\uc744 \uc0ac\uc6a9\ud558\uc5ec \uc0c8 Test Run\uc5d0 \ud560\ub2f9\ub429\ub2c8\ub2e4. \ub610\ud55c, \uc774\ub7ec\ud55c \ubcf5\uc0ac\ubcf8\uc740 \ucd94\uc801\uc131\uc744 \uc720\uc9c0\ud558\uae30 \uc704\ud574 &#8216;Execution&#8217; \uc774\uc288 \ub9c1\ud06c \uc720\ud615\uc73c\ub85c \uc6d0\ub798 \ud14c\uc2a4\ud2b8 \ucf00\uc774\uc2a4\uc5d0 \ud560\ub2f9\ub429\ub2c8\ub2e4.<\/li>\n<li>\uc0c8\ub85c \uc0dd\uc131\ub41c \uc774\uc288\uc5d0 \ub300\ud574 \ubaa8\ub4e0 \uc0c1\ud0dc\uc640 \ud1b5\uacc4\ub294 \ud3ec\ud568\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. <\/li>\n<\/ul>\n<p><img decoding=\"async\" src=\"https:\/\/resources.jetbrains.com\/storage\/products\/blog\/wp-content\/uploads\/done8s720.gif\" alt=\"\" \/><\/p>\n<p>\uc704\uc758 \ub17c\ub9ac\ub294 &#8216;Create Test Run copy(\ud14c\uc2a4\ud2b8 \uc2e4\ud589 \ubcf5\uc0ac\ubcf8 \ub9cc\ub4e4\uae30)&#8217; \uc791\uc5c5 \uaddc\uce59\uc744 \uc0ac\uc6a9\ud558\uc5ec \uad6c\ud604\ub429\ub2c8\ub2e4.<\/p>\n<details>\n<summary>\n        \ucf54\ub4dc \ube14\ub85d \ud655\uc7a5\ud558\uae30<br \/>\n    <\/summary>\n<p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\" data-enlighter-title=\"\">\nvar workflow = require(&#039;@jetbrains\/youtrack-scripting-api\/workflow&#039;);\nvar entities = require(&#039;@jetbrains\/youtrack-scripting-api\/entities&#039;);\nvar utils = require(&#039;..\/calculate-tms-stats\/utils&#039;);\n\nexports.rule = entities.Issue.action({\n  title: &#039;Create Test Run copy&#039;,\n  command: &#039;Test Run Creation&#039;,\n  guard: function(ctx) {\n    return ctx.issue.isReported &amp;&amp; (ctx.issue.Type.name == ctx.Type.TestRun.name);\n  },\n  action: function(ctx) {\n    var issue = ctx.issue;\n    var TestRunCopy = issue.copy(issue.project);\n    TestRunCopy.Status = ctx.Status.InProgress; \n    var oldTestList = issue.links[ctx.Subtask.outward];\n    oldTestList.forEach(function(v) {\n      var newTest = v.copy(v.project);\n      newTest.Status = ctx.Status.InProgress;\n      newTest.links[ctx.Subtask.inward].delete(issue);\n      newTest.links[ctx.Subtask.inward].add(TestRunCopy);\n    });\n    utils.resetStatuses(issue, TestRunCopy); \n    var newTestRunLink = &#039;<a href=\"&#039; + TestRunCopy.url + &#039;\"> &#039; + TestRunCopy.id + &#039;<\/a>&#039;;\n    var message = &#039;New Test Run has been created &#039; + newTestRunLink + &#039;.&#039;;\n    workflow.message(message);\n  },\n  requirements: {\n    Execution: {\n      type: entities.IssueLinkPrototype,\n      name: &#039;Execution&#039;,\n      inward: &#039;Execution&#039;,\n      outward: &#039;Assigned Test case or test suite&#039;\n    },\n    Subtask: {\n      type: entities.IssueLinkPrototype,\n      name: &#039;Subtask&#039;,\n      inward: &#039;subtask of&#039;,\n      outward: &#039;parent for&#039;\n    },\n    Type: {\n      type: entities.EnumField.fieldType,\n      TestRun: {\n        name: \"Test Run\"\n      },\n    },\n    Status: {\n      type: entities.EnumField.fieldType,\n      InProgress: {\n        name: &#039;No Run&#039;\n      },\n    }\n  }\n});\n <\/pre>\n<p>\n <\/details>\n<h2>\uc0ac\uc6a9\uc790\uc758 \ub3d9\uc791 \uc81c\ud55c<\/h2>\n<p>\ud14c\uc2a4\ud2b8 \uc2dc\ub098\ub9ac\uc624\ub85c \uc791\uc5c5\ud558\ub294 \ub3d9\uc548 \uc7a0\uc7ac\uc801\uc778 \uc2e4\uc218(\uc608: \uc798\ubabb\ub41c \uc774\uc288 \uc720\ud615 \uc0ac\uc6a9)\ub97c \ubc29\uc9c0\ud558\uae30 \uc704\ud574 \uc0ac\uc6a9\uc790\uc758 \uac00\ub2a5\ud55c \ub3d9\uc791\uc744 \uc81c\ud55c\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uc5b4, \uc0ac\uc6a9\uc790\uac00 Test Case\ub97c Test Run\uc5d0 \uc5f0\uacb0\ud558\ub3c4\ub85d \ud558\ub294 \ub3d9\uc791\uc744 \uad6c\ud604\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc0ac\uc6a9\uc790\uac00 Test Run\uc744 \uc774\uc288\uc5d0 \uc5f0\uacb0\ud558\uba74 \uc774 \ub3d9\uc791\uc740 \uc5f0\uacb0\ub41c \uc774\uc288 \uc720\ud615\uc774 &#8216;Test Case&#8217;\uc778\uc9c0 &#8216;Test Suite&#8217;\uc778\uc9c0 \ud655\uc778\ud569\ub2c8\ub2e4. \ub458 \ubaa8\ub450 \uc544\ub2c8\uba74 \uc774 \ub3d9\uc791\uc740 \uc0ac\uc6a9\uc790\uac00 \ub354 \uc774\uc0c1 \uc9c4\ud589\ud558\uc9c0 \ubabb\ud558\ub3c4\ub85d \uacbd\uace0\ub97c \ubcf4\ub0c5\ub2c8\ub2e4.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/resources.jetbrains.com\/storage\/products\/blog\/wp-content\/uploads\/done9.720.gif\" alt=\"\" \/><\/p>\n<p>\ub2e4\uc74c \ucf54\ub4dc \ube14\ub85d\uc744 &#8216;populate test run&#8217; \uc6cc\ud06c\ud50c\ub85c\uc5d0 \ucd94\uac00\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<details>\n<summary>\n        \ucf54\ub4dc \ube14\ub85d \ud655\uc7a5\ud558\uae30<br \/>\n    <\/summary>\n<p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\" data-enlighter-title=\"\">\n var message = &#039;<a href=\"&#039; + TestCase.url + &#039;\"> &#039; + TestCase.id + &#039;<\/a>&#039;;\n      workflow.check((TestCase.Type.name == ctx.Type.TestCase.name) || (TestCase.Type.name == ctx.Type.TestSuite.name), workflow.i18n(&#039;\\&#039;Test Run\\&#039; can be linked to \\&#039;Test Case\\&#039; and \\&#039;Test Suite\\&#039; only, but {0} has \\&#039;{1}\\&#039; type!&#039;, message, TestCase.Type.name));\n    <\/pre>\n<p>\n    <\/details>\n<p><a href=\"#ref2\">\uc704\uc5d0\uc11c<\/a> \uc5b8\uae09\ud55c \ubc14\uc640 \uac19\uc774, Test Run \uc0c1\ud0dc\ub294 Test Executions\uc758 \uc9c4\ud589 \uc0c1\ud669\uc5d0 \ub530\ub77c \ub2ec\ub77c\uc9c0\ubbc0\ub85c \uc77d\uae30 \uc804\uc6a9\uc774\uc5b4\uc57c \ud569\ub2c8\ub2e4. \uc774\ub294 &#8216;Test Run&#8217; \uc774\uc288 \uc720\ud615\uc744 \uac00\uc9c4 \uc774\uc288\uc5d0 \ub300\ud574 \uc218\ub3d9\uc73c\ub85c \uc0c1\ud0dc \ubcc0\uacbd\uc744 \ud558\ub294 \uac83\uc744 \uc81c\ud55c\ud558\ub294 \ucf54\ub4dc \ube14\ub85d\uc744 \ud3ec\ud568\uc2dc\ucf1c \uac04\ub2e8\ud558\uac8c \ucc98\ub9ac\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2020\/09\/done10s720.gif\" alt=\"\" \/><br \/>\n\uc608\ub97c \ub4e4\uc5b4, &#8216;status-management(\uc0c1\ud0dc \uad00\ub9ac)&#8217; \uc6cc\ud06c\ud50c\ub85c\uc5d0\uc11c &#8216;Test Run&#8217; \uc774\uc288 \uc720\ud615\uc5d0 \ub300\ud55c &#8216;\uc804\ud658&#8217; \uc139\uc158\uc744 \ub2e4\uc74c\uacfc \uac19\uc774 \uc870\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<details>\n<summary>\n        \ucf54\ub4dc \ube14\ub85d \ud655\uc7a5\ud558\uae30<br \/>\n    <\/summary>\n<p><pre class=\"EnlighterJSRAW\" data-enlighter-language=\"js\" data-enlighter-title=\"\">\n   &#039;Failing&#039;: {\n            targetState: &#039;Failing&#039;,\n            action: function(ctx) {\n              workflow.check(false, workflow.i18n(&#039;Test run has read-only status which is defined based on assigned tests statuses&#039;));\n            }\n          },\n          ...\n        }\n<\/pre>\n<p>\n<\/details>\n<h2>\ubcf4\uace0 \ubc0f \ucd94\uc801 \uae30\ub2a5<\/h2>\n<h3>\ubcf4\uace0<\/h3>\n<p>\ud558\ub8e8\uac00 \ub9c8\ubb34\ub9ac\ub418\uace0 \ud14c\uc2a4\ud2b8 \uc8fc\uae30\uac00 \uc644\ub8cc\ub418\uba74 \uacb0\uacfc\ub97c \ubd84\uc11d\ud574\uc57c \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub97c \uc704\ud574 YouTrack \ubcf4\uace0 \uae30\ub2a5\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud14c\uc2a4\ud2b8 \uad00\ub9ac \uc808\ucc28\uc640 \uad00\ub828\ub41c \uc8fc\uc694 \uc815\ubcf4\ub97c \ud45c\uc2dc\ud558\ub294 \ubcf4\uace0\uc11c \uc720\ud615\uc744 \uc120\ud0dd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc5ec\uae30\uc11c\ub294 \ub370\ubaa8 \ubaa9\uc801\uc73c\ub85c \ub300\uc2dc\ubcf4\ub4dc\uc5d0 2\uac1c\uc758 \ubcf4\uace0\uc11c\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4.<\/p>\n<ul>\n<li>\n<em><b>&#8216;\ubc84\uc804&#8217; \ud544\ub4dc\ub85c \ud544\ud130\ub9c1\ub41c \ub204\uc801 \ud750\ub984 \ubcf4\uace0\uc11c.<\/b><\/em> \uc774\ub7ec\ud55c \uc885\ub958\uc758 \uc0c1\ud0dc \ubcf4\uace0\uc11c\ub294 \ud2b9\uc815 \uc81c\ud488 \ubc84\uc804\uc744 \ub098\ud0c0\ub0c5\ub2c8\ub2e4. \uc774 \ubcf4\uace0\uc11c\ub294 \ud0c0\uc784\ub77c\uc778\uc5d0 \ub9e4\ud551\ub41c &#8216;Passed&#8217;, &#8216;Failed&#8217; \ubc0f &#8216;No Run&#8217; \uc0c1\ud0dc\uc758 \ud14c\uc2a4\ud2b8 \uc218\uc640 \uac19\uc740 \uc8fc\uc694 \uba54\ud2b8\ub9ad\uc744 \ubcf4\uc5ec\uc90d\ub2c8\ub2e4. \uad50\ucc28 \ubc84\uc804 \ub370\uc774\ud130\ub97c \ud45c\uc2dc\ud558\ub824\uba74 \uac01 \ubc84\uc804\uc5d0 \ub300\ud55c \ubcf4\uace0\uc11c\ub97c \uc791\uc131\ud574\uc57c \ud569\ub2c8\ub2e4. \ubaa8\ub4e0 \ub370\uc774\ud130\ub97c \ud55c \uacf3\uc5d0\uc11c \uc791\uc5c5\ud560 \uc218 \uc788\ub3c4\ub85d \ubaa8\ub4e0 \ubcf4\uace0\uc11c\ub97c \ub300\uc2dc\ubcf4\ub4dc\uc5d0 \ucd94\uac00\ud558\ub294 \uac83\uc774 \ud3b8\ub9ac\ud560 \uc218 \u200b\u200b\uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<h3>\ubcf4\uace0\uc11c \uc124\uc815:<\/h3>\n<p><a href=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2020\/09\/TMS11.png\" rel=\"attachment wp-att-6366\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2020\/09\/TMS11.png\" alt=\"ApplyingCommandForSubsystem\" \/><\/a><\/p>\n<h3>\ubcf4\uace0\uc11c \uacb0\uacfc:<\/h3>\n<p><a href=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2020\/09\/TMS12.png\" rel=\"attachment wp-att-6366\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2020\/09\/TMS12.png\" alt=\"ApplyingCommandForSubsystem\" \/><\/a><\/p>\n<\/li>\n<li><em> <b>\uc774\uc288 \ubd84\ud3ec \ubcf4\uace0\uc11c.<\/b><\/em> \uc774 \ubcf4\uace0\uc11c\ub294 \uc5ec\ub7ec \uc81c\ud488 \ubc84\uc804\uc5d0 \ub300\ud55c \uc8fc\uc694 \uba54\ud2b8\ub9ad(\uc608: \uac01 \uc0c1\ud0dc\uc5d0 \ub300\ud55c Test Run \uc218)\uc744 \ud3ec\ud568\ud55c \uc2a4\ub0c5\uc0f7\uc785\ub2c8\ub2e4. \ud2b9\ud788, \uc774 \ub370\ubaa8\uc5d0\ub294 \ubc84\uc804\uc744 \uc11c\ub85c \ube44\uad50\ud558\uace0 \ubc84\uc804 \uc548\uc815\uc131\uc744 \ubd84\uc11d\ud558\ub294 \ub370 \ub3c4\uc6c0\uc774 \ub418\ub294 \ubcf4\uace0\uc11c \uacb0\uacfc\uac00 \ud3ec\ud568\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4.<br \/>\n<h3>\ubcf4\uace0\uc11c \uc124\uc815:<\/h3>\n<p><a href=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2020\/09\/TMS13.png\" rel=\"attachment wp-att-6366\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2020\/09\/TMS13.png\" alt=\"ApplyingCommandForSubsystem\" \/><\/a><\/p>\n<h3>\ubcf4\uace0\uc11c \uacb0\uacfc:<\/h3>\n<p><a href=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2020\/09\/re_res_cut.png\" rel=\"attachment wp-att-6366\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2020\/09\/re_res_cut.png\" alt=\"ApplyingCommandForSubsystem\" \/><\/a>\n <\/li>\n<\/ul>\n<h2>\ucd94\uc801 \uae30\ub2a5 <\/h2>\n<p>YouTrack\uc740 &#8216;Test Execution&#8217; \uc720\ud615\uc758 \uac01 \uc774\uc288\uc5d0 \ub300\ud574 \uc8fc\uc694 \ud14c\uc2a4\ud2b8 \uc8fc\uae30 \uad00\ub828 \uc815\ubcf4\ub97c \uc800\uc7a5\ud558\ubbc0\ub85c \uc5b8\uc81c\ub4e0\uc9c0 \ud14c\uc2a4\ud2b8 \uae30\ub85d\uc5d0 \uc561\uc138\uc2a4\ud558\uc5ec \uad00\ub828 \ubc84\uadf8\ub97c \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<br \/>Test Case\uac00 \uc788\ub294 \uacbd\uc6b0, \uc774 \ucf00\uc774\uc2a4\uac00 \uad00\ub828\ub41c \ubaa8\ub4e0 Test Executions\ub97c \ucc38\uc870\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2020\/09\/TMS15.png\" alt=\"\" \/><\/p>\n<p>Test Case Execution\uc744 \ud1b5\ud574 Test Run\uc744 \ucc38\uc870\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2020\/09\/TMS16.png\" alt=\"\" \/><\/p>\n<p>\uc2e4\ud328\ud55c Test Case Execution\uc758 \uacbd\uc6b0, \ud56d\uc0c1 \uad00\ub828 \ubc84\uadf8 \ubaa9\ub85d\uc744 \ucc38\uc870\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2020\/09\/TMS17.png\" alt=\"\" \/><\/p>\n<p>\n\uc774 \ubb38\uc11c\uc5d0 \uc124\uba85\ub41c \uc6cc\ud06c\ud50c\ub85c\uc5d0 \ub300\ud55c \uc18c\uc2a4\ub294 <a href=\"https:\/\/github.com\/JetBrains\/youtrack-workflows\/tree\/master\/js\/test-management-scenarios\" target=\"_blank\" rel=\"noopener\">\uc800\uc7a5\uc18c<\/a>\uc5d0\uc11c \ub2e4\uc6b4\ub85c\ub4dc \ubc1b\uc73c\uc2e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc6cc\ud06c\ud50c\ub85c \uad00\ub828 \uc8fc\uc81c\uc5d0 \ub300\ud574 \ub17c\uc758\ud558\ub824\uba74 Slack\uc5d0\uc11c <a href=\"http:\/\/youtrack-community.herokuapp.com\/\" target=\"_blank\" rel=\"noopener\"> YouTrack \uc6cc\ud06c\ud50c\ub85c \ucee4\ubba4\ub2c8\ud2f0<\/a>\uc5d0 \ucc38\uc5ec\ud558\uc138\uc694.<\/p>\n<p>\n<em>\uc774 \uac8c\uc2dc\ubb3c\uc740 <a href=\"https:\/\/blog.jetbrains.com\/author\/leonid-zalog-jetbrains-com\/\">Leonid Zalog<\/a>\uac00 \uc791\uc131\ud55c <a href=\"https:\/\/blog.jetbrains.com\/youtrack\/2020\/10\/make-it-workflow-part-13-supporting-test-management-scenarios\/\">Make It Workflow \u2014 Part 13: Supporting Test Management Scenarios<\/a>\ub97c \ubc88\uc5ed\ud55c \uae00\uc785\ub2c8\ub2e4.<\/em><\/p>\n","protected":false},"author":964,"featured_media":91643,"comment_status":"closed","ping_status":"closed","template":"","categories":[],"tags":[],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/youtrack\/91642"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/youtrack"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/types\/youtrack"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/users\/964"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/comments?post=91642"}],"version-history":[{"count":3,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/youtrack\/91642\/revisions"}],"predecessor-version":[{"id":136801,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/youtrack\/91642\/revisions\/136801"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/media\/91643"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/media?parent=91642"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/categories?post=91642"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/tags?post=91642"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/ko\/wp-json\/wp\/v2\/cross-post-tag?post=91642"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}