在UI和休息Api之间创建缺陷的差异

时间:2014-03-20 23:49:39

标签: java rally defects

当我在UI上创建缺陷时,我无法仅将其分配给测试用例,用户故事会自动分配。如果我尝试删除用户故事,测试用例也会消失。

但是通过restApi,我只能与Test Case联系,而不提及用户故事。

我认为这是一个错误,因为无论你如何创建一个缺陷,行为应该是相似的。

我没有提及它,但我们总是有与用户故事相关的测试用例。

1 个答案:

答案 0 :(得分:0)

可以通过API和UI将缺陷与用户素材和测试用例相关联。但是,当您首先将故事与测试用例相关联,然后将缺陷与此故事相关联,然后单击缺陷详细信息页面上的TestCase字段时,就会出现这种情况。选择器中的选项 - 已经与故事相关联的测试用例。

以下是令人困惑的。

有两种方法可以将测试用例与Rally UI中的缺陷相关联:

使用"测试用例"详细信息页面上的字段

使用"测试用例"详细信息页面左侧的链接

不仅这会在UI中允许不一致的做法,而且当用户检查WS API请求的结果时也会引起混淆。

让我们说现有的TestCase使用"测试用例"与缺陷相关联。在缺陷的详细信息页面中输入字段,然后使用"测试用例"将新的测试用例与相同的缺陷相关联。链接在左侧。

此时我们有两个独立的TestCase与相同的缺陷:TC7和TC59相关联。

然而,当我们查询这个缺陷及其TestCases集合时,它只显示一个TestCase(在我的例子中为TC59),它是通过"测试用例"链接在左边。

这是第一个获取TestCases集合的查询:

https://rally1.rallydev.com/slm/webservice/v2.0/defect?workspace=https://rally1.rallydev.com/slm/webservice/v2.0/workspace/1111&query=(FormattedID%20%3D%20DE19)&fetch=TestCases

第一个查询返回的结果:

{ 
QueryResult: { 
_rallyAPIMajor: "2", 
_rallyAPIMinor: "0", 
Errors: [ ], 
Warnings: [ ], 
TotalResultCount: 1, 
StartIndex: 1, 
PageSize: 20, 
Results: [ 
{ 
_rallyAPIMajor: "2", 
_rallyAPIMinor: "0", 
_ref: "https://rally1.rallydev.com/slm/webservice/v2.0/defect/12655123753", 
_refObjectUUID: "91f66a35-d860-41e0-a10d-db6dad460f28", 
_objectVersion: "7", 
_refObjectName: "Error found in US20: story C2", 
TestCases: { 
_rallyAPIMajor: "2", 
_rallyAPIMinor: "0", 
_ref: "https://rally1.rallydev.com/slm/webservice/v2.0/Defect/12655123753/TestCases", 
_type: "TestCase", 
Count: 1 
}, 
_type: "Defect" 
} 
] 
} 
}

使用我们从第一个查询的结果获得的TestCases集合的URI,我们运行另一个查询来检查集合本身,为了简洁起见,仅获取FormattedID和WorkProduct:

https://rally1.rallydev.com/slm/webservice/v2.0/Defect/12655123753/TestCases?fetch=FormattedID,WorkProduct 

结果仅包括TC59:

https://rally1.rallydev.com/slm/webservice/v2.0/Defect/12655123753/TestCases?fetch=FormattedID,WorkProduct 

{ 
QueryResult: { 
_rallyAPIMajor: "2", 
_rallyAPIMinor: "0", 
Errors: [ ], 
Warnings: [ ], 
TotalResultCount: 1, 
StartIndex: 1, 
PageSize: 20, 
Results: [ 
{ 
_rallyAPIMajor: "2", 
_rallyAPIMinor: "0", 
_ref: "https://rally1.rallydev.com/slm/webservice/v2.0/testcase/17593081118", 
_refObjectUUID: "dbdbd621-97f7-4c27-b24a-f0ca92be73ff", 
_objectVersion: "1", 
_refObjectName: "Error found in US20: story C2", 
FormattedID: "TC59", 
WorkProduct: { 
_rallyAPIMajor: "2", 
_rallyAPIMinor: "0", 
_ref: "https://rally1.rallydev.com/slm/webservice/v2.0/defect/12655123753", 
_refObjectUUID: "91f66a35-d860-41e0-a10d-db6dad460f28", 
_objectVersion: "7", 
_refObjectName: "Error found in US20: story C2", 
FormattedID: "DE19", 
_type: "Defect" 
}, 
_type: "TestCase" 
} 
] 
} 
} 

接下来,我们要通过Web Services API创建一个新的TestCase,并将其与相同的Defect DE19相关联。 重要:通过"测试用例"将新TestCase与缺陷相关联的UI方法左侧的链接相当于WS API中的以下POST请求。

在此示例中," WorkProduct":" / defect / 12655123753"引用相同缺陷的ObjectID。

请求网址:

https://rally1.rallydev.com/slm/webservice/v2.0/testcase/create?key=7b193d4b....

有效负载:

{ 
"TestCase":{ 
"Name": "some tc", 
"WorkProduct":"/defect/12655123753" 
} 
}

我们在UI中验证WS API创建请求是否成功。 接下来,我们查询相同的TestCases集合,并按预期查看两个结果。这次只有FormattedID是为了简洁而获取的。返回TC59和TC60。

https://rally1.rallydev.com/slm/webservice/v2.0/Defect/12655123753/TestCases?fetch=FormattedID 

正如我们所见,通过"测试用例"在UI中创建的TC7此查询未返回缺陷详细信息页面上的字段。在Web Services API中,Defect对象有两个与此讨论相关的属性:TestCase和TestCases。

此查询:

https://rally1.rallydev.com/slm/webservice/v2.0/defect?workspace=https://rally1.rallydev.com/slm/webservice/v2.0/workspace/1111&query=(FormattedID%20%3D%20DE19)&fetch=TestCase,FormattedID

返回TC7:

{ 
QueryResult: { 
_rallyAPIMajor: "2", 
_rallyAPIMinor: "0", 
Errors: [ ], 
Warnings: [ ], 
TotalResultCount: 1, 
StartIndex: 1, 
PageSize: 20, 
Results: [ 
{ 
_rallyAPIMajor: "2", 
_rallyAPIMinor: "0", 
_ref: "https://rally1.rallydev.com/slm/webservice/v2.0/defect/12655123753", 
_refObjectUUID: "91f66a35-d860-41e0-a10d-db6dad460f28", 
_objectVersion: "9", 
_refObjectName: "Error found in US20: story C2", 
FormattedID: "DE19", 
TestCase: { 
_rallyAPIMajor: "2", 
_rallyAPIMinor: "0", 
_ref: "https://rally1.rallydev.com/slm/webservice/v2.0/testcase/12476557645", 
_refObjectUUID: "a8d50053-e250-43c1-aebc-58472fec2988", 
_objectVersion: "10", 
_refObjectName: "myTS3", 
FormattedID: "TC7", 
_type: "TestCase" 
}, 
_type: "Defect" 
} 
] 
} 
} 

现在我们知道如何在通过UI和WS API将TestCase添加到Defect的TestCases集合的情况下将TestCase与缺陷相关联,我们希望找到一个将TestCase与使用TestCase字段的缺陷。

我们将使用没有故事链接的缺陷,因为原始缺陷(在我的示例中为DE19)已经链接了US20。根据WS API文档中关于缺陷的TestCase属性的说明,只需指定其中一个。

注意此缺陷所涉及的测试用例。可以指定Requirement或TestCase,但不能同时指定两者。

我们将把ObjectID 14604252931引用的预先存在的TestCase添加到另一个缺陷DE81,由对象ID 14710889543引用:

请求网址:

https://rally1.rallydev.com/slm/webservice/v2.0/defect/14710889543?key=7b193d4b-.... 

有效负载:

{"Defect":{ 
"TestCase":"/testcase/14604252931" 
} 
} 

请注意,如果此时第二个缺陷DE81与UI中的随机故事相关联,则将删除与TestCase的关联,而不会出现任何错误或警告。

现在这变得更加令人困惑。第一个Defect的DE19详细信息页面,我们看到它与US20和TC7相关联。使用"测试用例"将DE81与TestCase联系起来似乎是不可能的。详细信息页面上的字段。当我们点击放大镜图标时,选择器对话框为空。事实证明,将DE81与UserStory和TestCase相关联的唯一方法是创建与UserStory关联的新TestCase。

这两个步骤如下: 一个。将UserStory链接到TestCase 湾回到缺陷并点击"测试用例"详细信息页面上的字段。这次将使用上面创建的新TestCase填充选择器对话框。 现在,TestCase和UserStory都与此缺陷相关联。

如果此时尝试将TC61替换为与UserStory无关的其他TestCase,则会失败。如果此尝试是通过API进行的,如下所示:

请求网址:

https://rally1.rallydev.com/slm/webservice/v2.0/defect/14710889543?key=7b193d4b-.... 

有效负载:

{"Defect":{ 
"TestCase":"/testcase/14604252931" 
} 
} 

会导致此错误:

{"OperationResult": {"_rallyAPIMajor": "2", "_rallyAPIMinor": "0", "Errors": ["Validation error: Defect.TestCase is an invalid relationship "], "Warnings": []}}

更新 re:Stella评论中描述的案例:

在UI中创建了一个UserStory,称为StoryG /用户故事/ 17824476422

通过详细信息页面左侧的TestCases链接将新的TestCase与它相关联。 /测试用例/ 17824476889

现在,这个TestCAse通过用户故事的TestCases集合与故事相关联。

接下来,通过API创建缺陷:

https://rally1.rallydev.com/slm/webservice/v2.0/defect/create?key=733c0893-0e5b-4c66-8204-9a2afa548d36

有效载荷:

{"Defect":{ 
"Name":"Bug with StoryG",
"Requirement":"/hierarchicalrequirement/17824476422",
"TestCase":"/testcase/17824476889"
}
}

这有效:新缺陷与UserStory和TestCase相关联。 实际上,这与UI一致。使用API​​时,必须在有效负载中引用RequirementTestCase。在UI中创建缺陷时,必须指定两者:请参阅响应的第一段。选择TestCase时,TestCase选择器只显示一个选项:已经与UserStory关联的TestCase。

下面是一个不起作用的场景,它在API和UI之间是一致的。 让我们看看如果我尝试将无关的UserStory和TestCase链接到缺陷会发生什么

创建了一个UserStory,StoryH /用户故事/ 17824480704

通过详细信息页面左侧的TestCases链接将新的TestCase与它相关联。 /测试用例/ 17824481042

现在,这个TestCase通过用户故事的TestCases集合与故事相关联。

接下来,我在创建缺陷时引用不相关的TestCase:/ testcase / 17824638756

https://rally1.rallydev.com/slm/webservice/v2.0/defect/create?key=733c0893-0e5b-4c66-8204-9a2afa548d36

有效载荷:

{"Defect":{ 
"Name":"Bug with StoryH",
"Requirement":"/hierarchicalrequirement/17824480704",
"TestCase":"/testcase/17824638756"
}
}

这会按预期返回错误,并与UI保持一致:

{"CreateResult": {"_rallyAPIMajor": "2", "_rallyAPIMinor": "0", "Errors": ["Validation error: Defect.TestCase is an invalid relationship "], "Warnings": []}}

还有另一种方法可以关联此缺陷用户 - 测试用例三角形的所有成员。 以下是可以观察到UI和API之间的差异的地方:

在用户界面中:

a)使用故事详细信息页面左侧的TestCases链接将用户故事与测试用例相关联 b)创建新缺陷,使用缺陷详细信息页面上的测试用例字段将其与测试用例相关联。

从测试用例选择器中选择测试用例后,故事会自动显示。

API中的

a)使用故事详细信息页面左侧的TestCases链接将用户故事与测试用例相关联 b)使用浏览器的REST客户端创建缺陷,同时设置其TestCase字段,并期望故事自动链接。

https://rally1.rallydev.com/slm/webservice/v2.0/defect/create?key=5e10c58...

有效载荷:

{"Defect":{ 
"Name":"Bug with TC77",
"TestCase":"/testcase/17866645137"
}
}

测试用例详细信息页面左侧的缺陷(1)链接显示新创建的缺陷。 但是,缺陷的详细信息页面并未显示故事。 我提交了一个错误。

回顾一下WS API中出现的这个三角形:

  1. 缺陷 - 此工件可以通过Requirement属性引用UserStory,也可以通过TestCase属性引用TestCase。 根据WSAPI文档说它可以有一个或另一个,但不是两个。链接这三个工件时,它们必须一致。 如果将缺陷定义为指向Userstory和Testcase,那么这两个也必须指向彼此,这实际上是Either / Or规则的例外。 缺陷上的TestCase属性与缺陷上的TestCases集合完全分开。

  2. UserStory - 此工件具有TestCases集合和Defect集合。

  3. TestCase - 此工件可以通过WorkProduct属性指向Requirement(这是UserStory)。