如何使用 Python REST API 在 Azure DevOps 中检索测试结果?

How to retrieve Test Results in Azure DevOps with Python REST API?

如何使用 Python REST API 从 VSTS (Azure DevOps) 检索测试结果?

文档(截至今天)非常简单,甚至 API 示例的专用存储库中的示例也很简单 (https://github.com/Microsoft/azure-devops-python-samples)。

由于某些原因,测试结果不被视为工作项,因此常规 WIQL 查询将不起作用。

此外,查询给定区域路径的结果会很棒。

谢谢

首先,您需要使用与测试结果匹配的客户端字符串获取正确的连接客户端。

从 vsts.vss_connection 导入 VssConnection 来自 msrest.authentication 导入 BasicAuthentication

token = "hcykwckuhe6vbnigsjs7r3ai2jefsdlkfjslkfj5mxizbtfu6k53j4ia"
team_instance = "https://tfstest.toto.com:8443/tfs/Development/"

credentials = BasicAuthentication("", token)
connection = VssConnection(base_url=team_instance, creds=credentials)

TEST_CLIENT = "vsts.test.v4_1.test_client.TestClient"
test_client = connection.get_client(TEST_CLIENT)

然后,您可以查看所有可用的函数:vsts/test/<api_version>/test_client.py"

以下函数看起来很有趣:

  • def get_test_results(self, project, run_id, details_to_include=None, skip=None, top=None, outcomes=None)(根据过滤器获取 运行 的测试结果)
  • def get_test_runs(self, project, build_uri=None, owner=None, tmi_run_id=None, plan_id=None, include_run_details=None, automated=None, skip=None, top=None)
  • def query_test_runs(self, project, min_last_updated_date, max_last_updated_date, state=None, plan_ids=None, is_automated=None, publish_context=None, build_ids=None, build_def_ids=None, branch_name=None, release_ids=None, release_def_ids=None, release_env_ids=None, release_env_def_ids=None, run_title=None, top=None, continuation_token=None)(尽管此函数在 min_last_updated_datemax_last_updated_date
  • 之间有 7 天范围的限制

要从给定区域路径中的测试计划中检索所有结果,我使用了以下代码:

tp_query = Wiql(query="""
SELECT
        [System.Id]
FROM workitems
WHERE
        [System.WorkItemType] = 'Test Plan'
        AND [Area Path] UNDER 'Development\MySoftware'
ORDER BY [System.ChangedDate] DESC""")

for plan in wit_client.query_by_wiql(tp_query).work_items:
    print(f"Results for {plan.id}")
    for run in test_client.get_test_runs(my_project, plan_id = plan.id):
        for res in test_client.get_test_results(my_project, run.id):
            tc = res.test_case
            print(f"#{run.id}. {tc.name} ({tc.id}) => {res.outcome} by {res.run_by.display_name} in {res.duration_in_ms}")

请注意,测试结果包括以下属性:

  • duration_in_ms
  • build
  • outcome(字符串)
  • associated_bugs
  • run_by(身份)
  • test_case(测试用例)
  • test_case_title(字符串)
  • area(区域路径)
  • Test_run,对应测试运行
  • test_suite
  • test_plan
  • completed_date(Python 日期时间对象)
  • started_date(Python 日期时间对象)
  • configuration

希望它可以帮助其他人节省我探索此内容所花费的时间 API。

干杯