当我在UI上创建缺陷时,我无法仅将其分配给测试用例,用户故事会自动分配。如果我尝试删除用户故事,测试用例也会消失。
但是通过restApi,我只能与Test Case联系,而不提及用户故事。
我认为这是一个错误,因为无论你如何创建一个缺陷,行为应该是相似的。
我没有提及它,但我们总是有与用户故事相关的测试用例。
答案 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时,必须在有效负载中引用Requirement
和TestCase
。在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中出现的这个三角形:
缺陷 - 此工件可以通过Requirement属性引用UserStory,也可以通过TestCase属性引用TestCase。 根据WSAPI文档说它可以有一个或另一个,但不是两个。链接这三个工件时,它们必须一致。 如果将缺陷定义为指向Userstory和Testcase,那么这两个也必须指向彼此,这实际上是Either / Or规则的例外。 缺陷上的TestCase属性与缺陷上的TestCases集合完全分开。
UserStory - 此工件具有TestCases集合和Defect集合。
TestCase - 此工件可以通过WorkProduct属性指向Requirement(这是UserStory)。