Мне необходимо получить список тест кейсов из запроса в TFS.
TfsTeamProjectCollection tfsTeamProjectCollection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new Uri("server_address"));
ITestManagementService testMangementService = (ITestManagementService)tfsTeamProjectCollection.GetService(typeof(ITestManagementService));
ITestManagementTeamProject testManagementTeamProject = testMangementService.GetTeamProject("project_name");
Далее я получаю список всех запросов
IList<ITestCaseQuery> testCaseQuery = testManagementTeamProject.Queries;
Затем получаю список тест кейсов в запросе
List<ITestCase> testCaseList = testManagement.TestCases.Query(testCaseQuery["selected_query"].QueryText).ToList();
Проблема заключается в том, что если Type of Query - Flat list of work items, то я получаю все тест кейсы в запросе, а если Type of Query - Work items and direct link или Tree of work items, то выдает исключение: "TF248021: You have specifeid a query string that is not valid when you use the query method for a flat list of work items. You cannot specify a parametrized query or a query string for linked work items with the query method you specified." Если тип запроса "Flat list of work items", то строка запроса будет такой: "select [System.Id], ... from WorkItems ...", а если - "Work items and direct link" или "Tree of work items", то такой: "select [System.Id], ... from WorkItemLinks ..." Такое происходит, если я в запрос, помимо тест кейсов, добавляю Product Backlog Item.
Насчет значения поля testCaseQuery["selected_query"].QueryText. Если значение поля:
"select [System.Id], [System.WorkItemType], [System.Title], [System.AssignedTo], [System.State], [System.Tags] from WorkItems where [System.TeamProject]=@project and ([System.WorkItemType]='Test Case' and [System.Title] contains words 'new' or [System.WorkItemType]='Product Backlog Item')" то все работает. А если значение:
"select [System.Id], [System.WorkItemType], [System.Title], [System.AssignedTo], [System.State], [System.Tags] from WorkItemLinks where (Source.[System.TeamProject]=@project and (Source.[System.WorkItemType]='Test Case' or Source.[System.WorkItemType]='Task' or Source.[System.WorkItemType]='Feature')) and ([System.Links.LinkType]='System.LinkTypes.Hierarchy-Forward') and (Target.[System.TeamProject]=@project and Target.[System.WorkItemType]<>") mode (Recursive)"
то выдает исключение.
На самом деле не очень понятно зачем выполняется отбор тест-кейсов через клиент testManagement. Для того, чтобы отбирать айтемы в любом виде, используюется WorkItem Client. При этом результат выполнения флет-листа и результата со ссылками разный. Простой список содержит список айтем, а дерево или ссылки содержит структуру линков в виде Source->Target. Для построения правильного запроса рекомендую в VS сначал создать запрос снеобходимыми условиями, а сохранить его не в тфс, а на локальный диск. Там будет виден правильно сконструированный wiql запрос.
Примеры запуска запросов:
Простой список:
private static void GetTasksWithWIQL(WorkItemStore pWiStore)
{
List<WorkItem> _parents = new List<WorkItem>();
string _wiql = String.Format("SELECT [System.Id] FROM WorkItems WHERE ([System.WorkItemType] = 'Task') ORDER BY [System.Id]");
Query _query = new Query(pWiStore, _wiql);
WorkItemCollection _wis = _query.RunQuery();
for (int i = 0; i < _wis.Count; i++)
Console.WriteLine("Work item: {0}:{1}:{2}", _wis[i].Type.Name, _wis[i].Id, _wis[i].Title);
}
Список со ссылками:
private static void GetParentsWithWIQL(WorkItemStore pWiStore)
{
string _wiql = String.Format("SELECT [System.Id] FROM WorkItemLinks WHERE ([Source].[System.WorkItemType] = 'User Story') And ([Target].[System.WorkItemType] = 'Task') And ([System.Links.LinkType] = 'System.LinkTypes.Hierarchy-Forward') ORDER BY [System.Id] mode(Recursive,ReturnMatchingChildren)");
Query _query = new Query(pWiStore, _wiql);
WorkItemLinkInfo[] _links = _query.RunLinkQuery();
for (int i = 0; i < _links.Count(); i++)
if (_links[i].SourceId == 0) Console.WriteLine("This is top level {1}", _links[i].SourceId, _links[i].TargetId);
else
Console.WriteLine("Parent - {0}; Child - {1}", _links[i].SourceId, _links[i].TargetId);
}
Получение теста через рабочий элемент:
private static void GetTests(WorkItemStore pWiStore, string pTeamProjectName)
{
ITestManagementTeamProject _testProject = pWiStore.TeamProjectCollection.GetService<ITestManagementService>().GetTeamProject(pTeamProjectName);
string _wiql = String.Format("SELECT [System.Id] FROM WorkItems WHERE [System.WorkItemType] = 'Test Case' And [System.TeamProject] = '{0}' ORDER BY [System.Id]", pTeamProjectName);
Query _query = new Query(pWiStore, _wiql);
var _wis = _query.RunQuery();
for (int i = 0; i < _wis.Count; i++)
if (_wis[i].Type.Name == "Test Case")
{
var _testCaseToEdit = _testProject.TestCases.Find(_wis[i].Id);
//edit test case here
}
}
Продвижение своими сайтами как стратегия роста и независимости