运行 带有 REST API 的 Azure DevOps 测试用例

Run Azure DevOps test case with REST APIs

我需要在 Azure Devops 中 运行 自动化 API 测试(与测试用例关联)。

我可以 运行 通过选择 - build and release 手动设置它。

因为我运行在 Linux 代理上使用 Azure Devops yaml 管道中的测试用例,我无法使用 VSTEST@2 任务来输入 - TestPlan,TestSuite id .

我找到的唯一选择是 运行 通过 APIs - 并通过 - bash 任务调用 API。

这是脚本

param (
    [string]$token="",
    [string]$collection="",
    [string]$projectName ="",
    [int] $planIdStatic = ,
    [int] $suiteIdStatic = ,
    [int] $testcaseID = 


)

$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $user, $token)))
$response = Invoke-RestMethod "https://dev.azure.com/$collection/$projectName/_apis/test/plans?api-version=5.0" -Method 'GET' -Headers @{Authorization = ("Basic {0}" -f $base64AuthInfo)}
foreach( $val in $response.value)
{

#PLAN ID 
Write-Host $val.id
 # $planId = [convert]::ToInt32($val.id)
 [int] $planId = $planIdStatic
  $suites = "https://dev.azure.com/$collection/$projectName/_apis/test/plans/$planId/suites?api-version=5.0"
 $listofSuites = Invoke-RestMethod $suites -Method 'GET' -Headers @{Authorization = ("Basic {0}" -f $base64AuthInfo)}
 #define Suite ID

 [int] $suiteId = $suiteIdStatic
 $suitename = "https://dev.azure.com/$collection/$projectName/_apis/test/plans/$planId/suites/$suiteId/points?api-version=5.0"
 $listofSuites = Invoke-RestMethod $suitename -Method 'GET' -Headers @{Authorization = ("Basic {0}" -f $base64AuthInfo)}


 #Define TestCaseID

 [int] $tcID = $testcaseID

 $tc = "https://dev.azure.com/$collection/$projectName/_apis/test/plans/$planId/suites/$suiteId/points?testCaseId=$tcID&api-version=5.0"
 $testcaseapi = Invoke-RestMethod $tc -Method 'GET' -Headers @{Authorization = ("Basic {0}" -f $base64AuthInfo)}
 
 #Define PointID

[int] $pointID =    $testcaseapi.value[0].id 
 $runName = "Test RUN Setup"

 #PayLoad

 $payload = @"
 
 {
   "name":"$runName",
   "plan":{
      "id":"$planId"
   },
   "pointIds":[
      "$pointID"
   ]
}
"@;

#Initiate the RUN

$tcRun = "https://dev.azure.com/$collection/$projectName/_apis/test/runs?api-version=5.0"
 $testRun = Invoke-RestMethod $tcRun -Method 'POST'  -ContentType "application/json"  -Body $payload -Headers @{Authorization = ("Basic {0}" -f $base64AuthInfo)} 
Write-Host "Test Run Status is ...." 
}

来自博客 - https://ghoshasish99.medium.com/integrate-your-test-automation-framework-with-azure-test-plan-a3230ab0f1da

不幸的是,它创建了测试 运行 - 但它不会 运行 它只是永远显示为正在进行中的任何测试用例,仅此而已 - (注意 - 测试计划与构建和发布相关联)

我怀疑脚本需要带有构建和发布管道和发布阶段的有效负载主体(假设我的发布有 DEV - QA 和 PROD)阶段。

除了使用RestAPI到运行测试运行,还需要使用ReleaseAPI到运行release需要更新运行ning发布信息测试运行.

步骤如下:

第 1 步:您可以在 Release Pipeline 中定义一个变量。

第 2 步:在 VSTest 任务中添加此变量:

注意:测试运行id需要和release一一对应,然后测试运行的status会待更新。

这是一个例子:

param (
    [string]$token="",
    [string]$collection="",
    [string]$projectName ="",
    [int] $planIdStatic =947 ,
    [int] $suiteIdStatic =1086 ,
    [int] $testcaseID =79,
    [int] $releasedefinitionid =96,
    [int] $buildid =62903


)

$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $user, $token)))
$response = Invoke-RestMethod "https://dev.azure.com/$collection/$projectName/_apis/test/plans?api-version=5.0" -Method 'GET' -Headers @{Authorization = ("Basic {0}" -f $base64AuthInfo)}
foreach( $val in $response.value)
{

#PLAN ID 
Write-Host $val.id
 # $planId = [convert]::ToInt32($val.id)
 [int] $planId = $planIdStatic
  $suites = "https://dev.azure.com/$collection/$projectName/_apis/test/plans/$planId/suites?api-version=5.0"
 $listofSuites = Invoke-RestMethod $suites -Method 'GET' -Headers @{Authorization = ("Basic {0}" -f $base64AuthInfo)}
 #define Suite ID

 [int] $suiteId = $suiteIdStatic
 $suitename = "https://dev.azure.com/$collection/$projectName/_apis/test/plans/$planId/suites/$suiteId/points?api-version=5.0"
 $listofSuites = Invoke-RestMethod $suitename -Method 'GET' -Headers @{Authorization = ("Basic {0}" -f $base64AuthInfo)}


 #Define TestCaseID

 [int] $tcID = $testcaseID

 $tc = "https://dev.azure.com/$collection/$projectName/_apis/test/plans/$planId/suites/$suiteId/points?testCaseId=$tcID&api-version=5.0"
 $testcaseapi = Invoke-RestMethod $tc -Method 'GET' -Headers @{Authorization = ("Basic {0}" -f $base64AuthInfo)}
 
 #Define PointID

[int] $pointID =    $testcaseapi.value[0].id 
 $runName = "Test RUN Setup"

 #PayLoad

 $payload = @"
 
 {
   "name":"test",
    "automated":true,
    "pointIds":[$pointID],
    "state":"NotStarted",
    "dtlTestEnvironment":{"id":"vstfs://dummy"},
    "plan":{"id":"$planId"},
    "filter":{"sourceFilter":"*.dll","testCaseFilter":""}
}
"@;

#Initiate the RUN

$tcRun = "https://dev.azure.com/$collection/$projectName/_apis/test/runs?api-version=5.0"
 $testRun = Invoke-RestMethod $tcRun -Method 'POST'  -ContentType "application/json"  -Body $payload -Headers @{Authorization = ("Basic {0}" -f $base64AuthInfo)} 
Write-Host "Test Run Status is ...."

$testrunid = $testRun.id

echo $testrunid


$url = "https://vsrm.dev.azure.com/$collection/$projectName/_apis/Release/definitions/$($releasedefinitionid)?api-version=5.0-preview.3"
Write-Host "URL: $url"
$pipeline = Invoke-RestMethod -Uri $url -Method Get  -Headers @{Authorization = ("Basic {0}" -f $base64AuthInfo)} 

Write-Host "Pipeline = $($pipeline | ConvertTo-Json -Depth 100)"


$pipeline.variables.testrunid.value = "$testrunid"

####****************** update the modified object **************************
$json = @($pipeline) | ConvertTo-Json -Depth 99


$updatedef = Invoke-RestMethod -Uri $url -Method Put -Body $json -ContentType "application/json" -Headers @{Authorization = ("Basic {0}" -f $base64AuthInfo)} 



$releaseRunurl ="https://vsrm.dev.azure.com/$collection/$projectName/_apis/Release/releases?api-version=6.1-preview.8"

 $releasebody = @"
 
 {
     "definitionId": $releasedefinitionid

}
"@;

$ReleaseRun = Invoke-RestMethod $releaseRunurl -Method 'POST'  -ContentType "application/json"  -Body $releasebody -Headers @{Authorization = ("Basic {0}" -f $base64AuthInfo)} 

$Releaseid=$ReleaseRun.id

echo $Releaseid

$ReleaseEnvID=$ReleaseRun.environments.id

echo $ReleaseEnvID

$updateTestrun="https://dev.azure.com/$collection/$projectName/_apis/test/Runs/$($testrunid)?api-version=6.1-preview.3"

$updatebody = @"
 
 {
    "build":
    {
        "id":"$buildid"
    },
    "releaseEnvironmentUri":"vstfs:///ReleaseManagement/Environment/$ReleaseEnvID","releaseUri":"vstfs:///ReleaseManagement/Release/$Releaseid"

}
"@;


$UpdateRun = Invoke-RestMethod $updateTestrun -Method 'PATCH'  -ContentType "application/json"  -Body $updatebody -Headers @{Authorization = ("Basic {0}" -f $base64AuthInfo)} 


 

}

结果:

发布完成后,测试状态运行会更新