2010-11-18 121 views
4

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

请考虑下面的C#代码示例。 这使用标准QC样本项目来说明问题。 使用“Root \ Mercury Tours网站\功能和UI”的文件夹路径,在所有情况下都能正确返回3个测试集。但是,指定“Root \ Mercury Tours网站”的路径将返回5个测试集,因为该示例包含两个分别包含3个和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工具负载测试在您展开测试集树中的节点时逐步进行。

任何想法?谢谢!

回答

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); 

感谢信基督教Grzelka谁回答了SQAForums我的职务。

+0

我试过你的解决方案,但收到一个错误_'Root \ Sandbox'不是一个有效的整数值._有没有我在你的解决方案中缺少的东西? – Harrison 2013-11-07 20:26:02

-1
filter["CY_FOLDER_ID"] = "\"" + testSetFolderPath + "\""; 

上述代码无效从ALM 11。它会抛出一个错误“不是一个整数值”。

您将不得不在测试集树管理器上使用get_NodebyPath方法。

相关问题