如何使用 Python REST API 从 VSTS (Azure DevOps) 中的查询中提取工作项?
How to extract WorkItems from query in VSTS (Azure DevOps) with Python REST API?
我正在使用 Azure DevOps 的官方 Python REST API:
https://github.com/Microsoft/azure-devops-python-api
多亏了示例,我才能够从 id 中检索有关测试用例的信息。
如何从查询(WIQL)中做到这一点?
到目前为止,这是我的代码(带有修改的标记和链接):
from vsts.vss_connection import VssConnection
from msrest.authentication import BasicAuthentication
token = "hcykwckuhe6vbnigsjs7r3ai2jefsdlkfjslkfj5mxizbtfu6k53j4ia"
team_instance = "https://tfstest.toto.com:8443/tfs/Development/"
credentials = BasicAuthentication("", token)
connection = VssConnection(base_url=team_instance, creds=credentials)
def print_work_items(work_items):
for work_item in work_items:
print(
"{0} {1}: {2}".format(
work_item.fields["System.WorkItemType"],
work_item.id,
work_item.fields["System.Title"],
)
)
WIT_CLIENT = (
"vsts.work_item_tracking.v4_1.work_item_tracking_client.WorkItemTrackingClient"
)
wit_client = connection.get_client(WIT_CLIENT)
def get_TC_by_id(desired_ids):
work_items = wit_client.get_work_items(ids=desired_ids, error_policy="omit")
print_work_items(work_items)
def get_TC_from_query(query):
# THIS FUNCTION IS NOT WORKING...
work_items = wit_client.get_work_items(query=query, error_policy="omit")
print_work_items(work_items)
get_TC_by_id([1035375])
get_TC_from_query(
"""\
SELECT
[System.Id],
[System.WorkItemType],
[System.Title],
[System.State],
[System.AreaPath],
[System.IterationPath]
FROM workitems
WHERE
[System.TeamProject] = @project
AND [System.WorkItemType] = 'Test Case'
ORDER BY [System.ChangedDate] DESC
"""
)
这是我得到的错误
File "test_TFS.py", line 35, in get_TC_from_query
work_items = wit_client.get_work_items(query=query, error_policy="omit")
TypeError: get_work_items() got an unexpected keyword argument 'query'
如何从查询中检索测试用例?
特别是"vsts.work_item_tracking.v4_1.work_item_tracking_client.WorkItemTrackingClient"
等"client"的值我不太理解
谢谢大家!
在 VSTS 示例的 Github 存储库上发布消息(即导致 pull request 的问题)后,我得到了解决问题的提示。
解决方案是使用:
- 带有
Wiql
class 的 wiql 查询对象
query_by_wiql
函数
- 使用
get_work_item
函数将查询结果(引用 WorkItem id)转换为 WorkItem(或 get_work_items
一次处理多个 WorkItems)
这是我对这个问题的解决方案:
[更新版本 5.1 和 azure-devops 模块替换 VSTS]
from azure.devops.connection import Connection
from msrest.authentication import BasicAuthentication
from azure.devops.v5_1.work_item_tracking.models import Wiql
token = "hcykwckuhe6vbnigsjs7r3ai2jefsdlkfjslkfj5mxizbtfu6k53j4ia"
team_instance = "https://tfstest.toto.com:8443/tfs/Development/"
credentials = BasicAuthentication("", token)
connection = Connection(base_url=team_instance, creds=credentials)
def print_work_items(work_items):
for work_item in work_items:
print(
"{0} {1}: {2}".format(
work_item.fields["System.WorkItemType"],
work_item.id,
work_item.fields["System.Title"],
)
)
wit_client = connection.clients.get_work_item_tracking_client()
def get_TC_from_query(query):
query_wiql = Wiql(query=query)
results = wit_client.query_by_wiql(query_wiql).work_items
# WIQL query gives a WorkItemReference => we get the corresponding WorkItem from id
work_items = (wit_client.get_work_item(int(result.id)) for result in results)
print_work_items(work_items)
批量请求项目更快。但是,一次可以请求的项目数量是有限制的,因此您需要将列表分成 200 个项目块。
这还将处理不同的查询样式(workitems
或 workitemLinks
)
def get_TC_from_query(query):
query_wiql = Wiql(query)
query_result = wit_client.query_by_wiql(query_wiql)
if query_result.query_result_type.lower() == 'workitemlink':
items = [relation.target for relation in query_result.work_item_relations]
elif query_result.query_result_type.lower() == 'workitem':
items = query_result.work_items
else:
raise AttributeError(f"Incorrect type for {query_result.query_result_type}")
# get_work_items can only handle 200 items per search
size_chunks = 200
for idx in range(0, len(items), size_chunks):
search_items = items[idx:idx+size_chunks]
yield from wit_client.get_work_items([x.id for x in search_items], expand='all')
我正在使用 Azure DevOps 的官方 Python REST API: https://github.com/Microsoft/azure-devops-python-api
多亏了示例,我才能够从 id 中检索有关测试用例的信息。
如何从查询(WIQL)中做到这一点?
到目前为止,这是我的代码(带有修改的标记和链接):
from vsts.vss_connection import VssConnection
from msrest.authentication import BasicAuthentication
token = "hcykwckuhe6vbnigsjs7r3ai2jefsdlkfjslkfj5mxizbtfu6k53j4ia"
team_instance = "https://tfstest.toto.com:8443/tfs/Development/"
credentials = BasicAuthentication("", token)
connection = VssConnection(base_url=team_instance, creds=credentials)
def print_work_items(work_items):
for work_item in work_items:
print(
"{0} {1}: {2}".format(
work_item.fields["System.WorkItemType"],
work_item.id,
work_item.fields["System.Title"],
)
)
WIT_CLIENT = (
"vsts.work_item_tracking.v4_1.work_item_tracking_client.WorkItemTrackingClient"
)
wit_client = connection.get_client(WIT_CLIENT)
def get_TC_by_id(desired_ids):
work_items = wit_client.get_work_items(ids=desired_ids, error_policy="omit")
print_work_items(work_items)
def get_TC_from_query(query):
# THIS FUNCTION IS NOT WORKING...
work_items = wit_client.get_work_items(query=query, error_policy="omit")
print_work_items(work_items)
get_TC_by_id([1035375])
get_TC_from_query(
"""\
SELECT
[System.Id],
[System.WorkItemType],
[System.Title],
[System.State],
[System.AreaPath],
[System.IterationPath]
FROM workitems
WHERE
[System.TeamProject] = @project
AND [System.WorkItemType] = 'Test Case'
ORDER BY [System.ChangedDate] DESC
"""
)
这是我得到的错误
File "test_TFS.py", line 35, in get_TC_from_query
work_items = wit_client.get_work_items(query=query, error_policy="omit")
TypeError: get_work_items() got an unexpected keyword argument 'query'
如何从查询中检索测试用例?
特别是"vsts.work_item_tracking.v4_1.work_item_tracking_client.WorkItemTrackingClient"
谢谢大家!
在 VSTS 示例的 Github 存储库上发布消息(即导致 pull request 的问题)后,我得到了解决问题的提示。
解决方案是使用:
- 带有
Wiql
class 的 wiql 查询对象
query_by_wiql
函数- 使用
get_work_item
函数将查询结果(引用 WorkItem id)转换为 WorkItem(或get_work_items
一次处理多个 WorkItems)
这是我对这个问题的解决方案:
[更新版本 5.1 和 azure-devops 模块替换 VSTS]
from azure.devops.connection import Connection
from msrest.authentication import BasicAuthentication
from azure.devops.v5_1.work_item_tracking.models import Wiql
token = "hcykwckuhe6vbnigsjs7r3ai2jefsdlkfjslkfj5mxizbtfu6k53j4ia"
team_instance = "https://tfstest.toto.com:8443/tfs/Development/"
credentials = BasicAuthentication("", token)
connection = Connection(base_url=team_instance, creds=credentials)
def print_work_items(work_items):
for work_item in work_items:
print(
"{0} {1}: {2}".format(
work_item.fields["System.WorkItemType"],
work_item.id,
work_item.fields["System.Title"],
)
)
wit_client = connection.clients.get_work_item_tracking_client()
def get_TC_from_query(query):
query_wiql = Wiql(query=query)
results = wit_client.query_by_wiql(query_wiql).work_items
# WIQL query gives a WorkItemReference => we get the corresponding WorkItem from id
work_items = (wit_client.get_work_item(int(result.id)) for result in results)
print_work_items(work_items)
批量请求项目更快。但是,一次可以请求的项目数量是有限制的,因此您需要将列表分成 200 个项目块。
这还将处理不同的查询样式(workitems
或 workitemLinks
)
def get_TC_from_query(query):
query_wiql = Wiql(query)
query_result = wit_client.query_by_wiql(query_wiql)
if query_result.query_result_type.lower() == 'workitemlink':
items = [relation.target for relation in query_result.work_item_relations]
elif query_result.query_result_type.lower() == 'workitem':
items = query_result.work_items
else:
raise AttributeError(f"Incorrect type for {query_result.query_result_type}")
# get_work_items can only handle 200 items per search
size_chunks = 200
for idx in range(0, len(items), size_chunks):
search_items = items[idx:idx+size_chunks]
yield from wit_client.get_work_items([x.id for x in search_items], expand='all')