问题
I'm using the official Python REST API of Azure DevOps: https://github.com/Microsoft/azure-devops-python-api
Thanks to the samples I have been able to retrieve information on Test Cases from ids.
How to do it from queries (WIQL)?
Here is my code so far (with modified tokens and links):
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
"""
)
This is the error I get
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'
How shall I retrieve Test Cases from a query?
In particular, I do not understand the values of the "client" such as "vsts.work_item_tracking.v4_1.work_item_tracking_client.WorkItemTrackingClient"
Thank you all!
回答1:
After posting a message (i.e. issue leading to a pull request) on the Github repository for VSTS examples, I got a hint to solve my issue.
The solution is to use:
- a wiql query object with
Wiql
class query_by_wiql
function- transforming the results of the query (references with WorkItem id) to WorkItem with
get_work_item
function (orget_work_items
to process several WorkItems in a single pass)
Here is my solution to my problem:
from vsts.vss_connection import VssConnection
from msrest.authentication import BasicAuthentication
from vsts.work_item_tracking.v4_1.models.wiql import Wiql
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_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)
来源:https://stackoverflow.com/questions/52810441/how-to-extract-workitems-from-query-in-vsts-azure-devops-with-python-rest-api