Quality Center OTA API:仅返回TestSetFolder中第一级子TestSets

时间:2010-11-18 06:49:04

标签: hp-quality-center

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

请考虑以下c#代码示例。 这使用标准QC示例项目来说明问题。 使用“Root \ Mercury Tours网站\功能和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路径属性是否与当前文件夹匹配。但是,这会导致主要的性能开销,特别是对于大型QC项目和/或通过慢速网络连接。

在QC中必须有一些方法来执行此操作,因为在扩展测试集树中的节点时,QC Web UI和QCExplorer工具都会逐步加载测试集。

有什么想法吗?谢谢!

2 个答案:

答案 0 :(得分:3)

事实证明,在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);

感谢Christian Grzelka在SQAForums回复我的帖子。

答案 1 :(得分:-1)

n.A

以上代码在ALM 11中无效。它会抛出错误"而不是整数值"。

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