代码之家  ›  专栏  ›  技术社区  ›  Sam Warwick

质量中心OTA API:只返回TestSetFolder中的第一级子测试集

  •  4
  • Sam Warwick  · 技术社区  · 14 年前

    HP QC OTA API似乎提供了两种方法来返回指定TestSetFolder中的测试集列表。但是,这两个方法都是递归的,并返回层次结构下每个子文件夹的所有测试集。我希望能够返回任何给定测试集文件夹的直接子测试集。我意识到这可以通过使用Command对象的一个非常简单的SQL查询来实现,但是在我的场景中这不是一个选项,因为需要QC权限。

    考虑下面的c代码示例。 这使用标准的QC示例项目来说明问题。 使用“Root\Mercury Tours Web Site\Functionality And UI”的文件夹路径,在所有情况下都会正确返回3个测试集。但是,指定“Root\Mercury Tours Web Site”的路径将返回5个测试集,因为示例分别包含3个和2个测试集的2个子文件夹。在这种情况下,SQL不会正确返回任何测试集。

    // where 'tdc' is a valid TDConnection object logged in to DEFAULT.QualityCenter_Demo
    // string testSetFolderPath = @"Root\Mercury Tours Web Site";                          // 0 test sets (Method 1 and 2 return 5)
    string testSetFolderPath = @"Root\Mercury Tours Web Site\Functionality And UI";     // 3 test sets
    
    // Method 1: TestSetFolder.FindTestSets()
    var testSetTreeManager = (TestSetTreeManager)tdc.TestSetTreeManager;
    var testSetFolder = (TestSetFolder)testSetTreeManager.get_NodeByPath(testSetFolderPath);
    var testSets = testSetFolder.FindTestSets("", false, "");
    Console.WriteLine("Folder {0} contains {1} testsets", testSetFolderPath, testSets.Count);
    
    // Method 2: NewList() with filter
    var testSetFactory = (TestSetFactory)tdc.TestSetFactory;
    var filter = (TDFilter)testSetFactory.Filter;
    filter["CY_FOLDER_ID"] = "^" + testSetFolderPath + "^";
    testSets = (List)testSetFactory.NewList(filter.Text);
    Console.WriteLine("Folder {0} contains {1} testsets", testSetFolderPath, testSets.Count);
    
    // Method 3: SQL Query using Command object
    var command = tdc.Command;
    command.CommandText = "select CY_CYCLE as TestSet from CYCLE where CY_FOLDER_ID = " + testSetFolder.NodeID;
    Recordset records = command.Execute();
    Console.WriteLine("Folder {0} contains {1} testsets", testSetFolderPath, records.RecordCount);
    

    可以遍历返回的测试集,以检查TestSetFolder path属性是否与当前文件夹匹配。但是,这会导致很大的性能开销,特别是对于大型QC项目和/或通过慢速网络连接。

    QC中必须有某种方法可以做到这一点,因为QC web UI和QCExplorer工具在您展开测试集树中的节点时都会逐步加载测试集。

    有什么想法吗?谢谢!

    2 回复  |  直到 14 年前
        1
  •  3
  •   Sam Warwick    14 年前

    结果发现,在CY_FOLDER_ID上使用插入符号(^)实际上是用来强制执行递归搜索。如果这些被删除并替换为双引号,则不会返回子文件夹中的测试集。因此,示例中的方法2可以修改为:

    // Method 2: NewList() with filter
    var testSetFactory = (TestSetFactory)tdc.TestSetFactory;
    var filter = (TDFilter)testSetFactory.Filter;
    filter["CY_FOLDER_ID"] = "\"" + testSetFolderPath + "\"";    
    testSets = (List)testSetFactory.NewList(filter.Text);
    if (testSets == null)
        Console.WriteLine("Folder {0} does not contain any testsets", testSetFolderPath);
    else
        Console.WriteLine("Folder {0} contains {1} testsets", testSetFolderPath, testSets.Count);
    

    感谢克里斯蒂安·格泽尔卡,他在 SQAForums .

        2
  •  -1
  •   Kumar Saurabh Mykhailo Pylyp    9 年前
    filter["CY_FOLDER_ID"] = "\"" + testSetFolderPath + "\"";
    

    以上代码 从ALM 11开始无效 . 它将抛出一个错误“不是整数值”。

    必须在测试集树管理器上使用get_NodebyPath方法。