【问题标题】:How can I write chained joins in a HP ALM Rest API query?如何在 HP ALM Rest API 查询中编写链式联接?
【发布时间】:2019-03-05 23:28:41
【问题描述】:

我使用的是 HP Quality Center 11.52 版,我的任务是复制一系列图表或 AnalysisItems,就像它们的正式名称一样。我还没有找到任何直接从 AnalysisItem 中检索图形显示数据的方法,因此我的方法是在这些 AnalysisItem 中提取过滤器,并将它们复制/细化到工作的 REST 调用或 URL 中。这在大多数情况下都有效,但我在使用链式连接时遇到了麻烦。以下是来自配置选项卡和过滤器文本框中的分析项之一的示例过滤器:

Filter: Test: Project["My Project"]; 
Cross Filter: <Cross Filter Test Instance-Test Set>Test Set Folder[^Root\My Path\My Project\My Tests^]

这里有两个过滤子句,用';'隔开

  1. 我可以通过名称轻松找到项目下的测试实例。它是这样的:

    .../test-instances/?query={test.user-18["My Project"]}
    

当然,这需要我们使用 user-18 字段来存储项目名称,这是我公司使用的逻辑分区,在定义的项目中是一个 QC 实体。

  1. 但是,如果我想交叉过滤这些找到的测试实例,并且仅在特定文件夹中的测试集中找到实例,我将不得不进行链式连接,我预计它可能会写成这样:

    .../test-instances/?query={test.user-18["My Project"];
    test-set.test-set-folder.name["^Root\My Path\My Project\My Tests^"]}
    

但是,这给了我一个错误,指出“实体:test-set 没有名为:test-set-folder.name 的字段。现在我知道了,但我希望它能够理解之前的部分最后一个标点符号,也是一个关系。不是。

我也试过了:

.../test-instances/?query={test.user-18["My Project"];
test-set[test-set-folder.name["^Root\My Path\My Project\My Tests^"]]}

但是嵌套的方括号也不起作用。

最后我尝试了一个我在“filter-data”数据库中看到的语法,它看起来像这样:

.../test-instances/?query={test.user-18["My Project"];
test-set[x]test-set-folder.name["^Root\My Path\My Project\My Tests^"]}

这也是不允许的。

我对自己想要实现的目标充满信心,但文档并没有太大帮助。我认为是否可以在 QC 用户界面内的 AnalsisItem 中设置过滤器,在 REST-API 中也应该可以。我已尝试广泛搜索 API,但要么不可能,要么很难在文档中找到。

谁能帮我正确的语法,如果有的话,在这里?

【问题讨论】:

  • 我不认为你可以在test-set-folder.name=^Root\My Path\My Project\My Tests^ 中传递一个文件夹的完整路径,原因很简单是每个文件夹名称在数据库中以不同的 ID 存储并且没有简单的方法RESTAPI 遍历文件夹树以找到正确的 ID 以继续。
  • 你是对的。我意识到文件夹名称不包括路径,所以这是我现在的方法。不过,过滤数据不能直接用于细化单个调用,这似乎很奇怪。
  • 也许并不容易,但我会通过您提到的路径并获取文件夹或分层路径的最新 ID。然后我猜你可以使用文件夹 ID 来检索你的数据,因为它在 QC ALM 中是唯一的。
  • @Marcosmdm,你真的应该把它放在答案中,并对路径结构进行一些额外的解释。
  • @Matthiasdirickx:添加了答案,希望这能澄清一点:-)祝你有美好的一天。

标签: rest alm hp-quality-center


【解决方案1】:
  • 在质量中心,报告和图表不包含数据。它们只是定义,它们从“实时”数据库中检索数据。
  • 显示的 QC 过滤器很可能是用于与后端交互的 OTA(开放测试架构)定义,而不是 REST。

但是如果你想收集测试实例数据,那么你可以从文件夹中向下工作。

第一步:获取文件夹路径

在 Quality Center 中,文件夹路径由字母组合定义。这些文件夹是用三个字母的短语构建的。 'AAA' 是根。

'AAA'
   -- 'AAAAAA'
         -- 'AAAAAAAAA'
         -- 'AAAAAAAAB'
         -- 'AAAAAAAAC'
   -- 'AAAAAB'

我认为不可能在 UI 本身中创建与根文件夹相同级别的额外文件夹。所以本质上,当没有进行自定义时,前三个字母将始终是“AAA”。

根据 Marco 的评论和我的经验,我将创建一个组件来处理检索文件夹。您在深入研究其他结构时也将需要它,因此如果您努力概括它,这将不会是白费。

您的第一次搜索将在分层路径上,以“AAA”(根文件夹)开头,长度为 6 个字符(第二级的文件夹,您要搜索的第一个子文件夹)。然后获取新的 ID 并重复,直到您位于路径标识符的末尾。在你的情况下:

  • 我的路
  • 我的项目
  • 我的测试

基本上,您是根据名称沿着路径走下去,并用字符串连接的字母组成标识符。然后可以使用该结果来检索确切的文件夹。假设在同一级别上没有两个同名的文件夹。

假设这些都是根节点下的第一个,并且假设您还想要更多的后代,我们继续这个假设的逻辑:

标识的分层路径是“AAAAAAAAAAAA”。

我知道我在这里变得非常冗长,但作为测试人员角色的技术含量较低的用户,我个人喜欢更简单的编码步骤,然后是复杂的步骤。仅仅因为编写密集的代码是一门诗意的艺术,而我没有掌握它。

第二步:获取请求路径的所有子文件夹

所以,继续:通过这个分层路径,我们可以识别所有子文件夹,并收集它们的 ID。

这看起来像这样:

.../test-set-folders?query={hierarchical-path["AAAAAAAAAAAA*"]}

第三步:获取测试集

使用这些文件夹 ID,您可以检索所需的测试集: 假设它返回 ID 为 1 的测试集文件夹。

.../test-sets?query={parent-id[1]}

为每个文件夹 ID 迭代 REST 查询,收集测试集 ID。

第四步:获取测试实例

使用测试集,您可以通过类似查询获取测试实例和所有可用数据。

这是我对使用 rest 服务的看法。如果您从 QC 中检索数据以获取快照并使用数据设计自己的图表,我个人建议您查询数据库。使用 SQL,您可以在 Excel 报告中轻松建立所需的所有连接。

这确实破坏了使用 REST API 的便利性。也许具有特定查询的数据库的简单专用客户端将是一个解决方案?

关于收集数据的最后一句话:在为自定义图表检索数据时,我使用“运行”对象作为我的基础。

  • 运行可以提供一段时间内的视图
  • 运行可以链接到各种东西,并且是执行的实际来源
  • 使用实例时,您需要拍摄快照,运行会以某种方式为您解决这个问题。

【讨论】:

  • 嗨,马蒂亚斯,我喜欢你的解释。使用这种方法,我可以预见的唯一问题是如果您有很多文件夹(我有很多文件夹)。我的方法在查询中基本上更简单。您总是一次获得一个文件夹,客户端/服务器的负载将减少。你同意吗?另外(不确定)如果在新的 HP 版本中分层路径脱离了 4 个字符 AAAA + AAAA+ AAAB 等的组合。谢谢,祝你有美好的一天!
  • 感谢您的提醒。我会按照你的回答。谢谢!
【解决方案2】:

假设我想进入测试集路径:Root/System Test/ProgramName/ReleaseName/WeekNumber/ 等等。在您登录并能够发送 REST 消息后 :-)

下面是我如何检查路径和操作描述的示例(来自我的 python 模块的输出):

GET https://yourServer.com/qcbin/rest/domains/DomainName/projects/SANDBOX/test-set-folders?query={name['Root']}

在测试集中询问名称 Root --> 可能是多个文件夹的名称为 Root(我故意创建了另一个),但您的工具应该能够获取真正的“根”文件夹 xml。

200 - test-sets folder hierarchy downloaded.
Multiple folder with that name! Found 2 folders with that name!
Root ID found.

GET https://yourServer.com/qcbin/rest/domains/DomainName/projects/SANDBOX/test-set-folders?query={name['System Test'];parent-id['0']}
200 - test-sets folder hierarchy downloaded.
Folder System Test already existing...going ahead in path....

现在获取下一步的 xml:“系统测试”文件夹名称,其父 ID 为 0。

GET https://yourServer.com/qcbin/rest/domains/DomainName/projects/SANDBOX/test-set-folders?query={name['ProgramName'];parent-id['112']}
200 - test-sets folder hierarchy downloaded.
Folder ProgramName already existing...going ahead in path....

重复多次相同的过程(当然我不是手动执行此操作)

GET https://yourServer.com/qcbin/rest/domains/DomainName/projects/SANDBOX/test-set-folders?query={name['ReleaseName'];parent-id['113']}
200 - test-sets folder hierarchy downloaded.
Folder ReleaseName already existing...going ahead in path....
GET https://yourServer.com/qcbin/rest/domains/DomainName/projects/SANDBOX/test-set-folders?query={name['SWType'];parent-id['114']}
200 - test-sets folder hierarchy downloaded.
Folder SWType already existing...going ahead in path....
GET https://yourServer.com/qcbin/rest/domains/DomainName/projects/SANDBOX/test-set-folders?query={name['WK18'];parent-id['115']}
200 - test-sets folder hierarchy downloaded.
Folder WK18 already existing...going ahead in path....
GET https://yourServer.com/qcbin/rest/domains/DomainName/projects/SANDBOX/test-set-folders?query={name['FeatureType'];parent-id['366']}
200 - test-sets folder hierarchy downloaded.

想象一下,在路径的末尾您仍想附加一个新文件夹:

Folder FeatureType has to be created.
POST https://yourServer.com/qcbin/rest/domains/DomainName/projects/SANDBOX/test-set-folders
201 - test-set-folders created.

从您每次获得的 xml 中,您使用的是父 ID 和您想要检查的文件夹名称。这是一个独特的组合。

当您到达最后一步后,您就会知道要查找的最终文件夹的 ID(以及所有描述)。现在您可以使用它来检查您需要的所有信息!该 ID 正是您要查找的 ID!

正如我所说的,程序可以完全自动化。祝您有美好的一天,希望对您有所帮助!

【讨论】:

    【解决方案3】:

    这里只是一个快速的回答,关于什么解决了我的大部分问题:

    关系

    在文档中,您实际上可以找到一种称为关系的东西,它为您提供了许多与 SQL 连接非常相似的选项,它允许您从一个实体中获取结果,基于链式连接方式的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多