Search code examples
seleniumazure-devopsazure-pipelinesxunit2

Azure pipelines: How to add failed selenium Xunit test case attachment in VS test task


I use the Xunit2 selenium framework for automated test cases. Some case fails in pipeline. I want to see the attachment of the fail test case in the Test tab. How can I do this using VS test task? enter image description here


Solution

  • The option publishRunAttachments: true, it will update attachments to Test run attachment tab, check the pic below

    enter image description here

    After the VS test task runs, we can get the run ID through the variable VSTEST_TESTRUNID.

    enter image description here

    Then we could call the RESST API Create Test Result Attachment to add attachments to the test result attachment tab.

    Request API:

    POST https://dev.azure.com/{organization}/{project}/_apis/test/Runs/{runId}/attachments?api-version=6.0-preview.1
    

    Request Body:

    {
      "stream": "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAIAAABvFaqvAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAABlSURBVDhP7cxBCsAgDERR739pG/CnGJI0FopQ8O2cjNP6R85QbeNQU7wT1dkijaQ3vkZoWElaoTeJojW01cYh0jwfgiFBV/lEjOZtacijN/nLkOBHhIaVDgn+Wdycp6FXzlCl9wt0Y0cAzHo/zgAAAABJRU5ErkJggg==",
      "fileName": "imageAsFileAttachment.png",
      "comment": "Test attachment upload",
      "attachmentType": "GeneralAttachment"
    }
    

    You could also check this thread

    Update1

    We could add task power shell and call the rest api via below script:

    $connectionToken="{PAT}"
    $base64AuthInfo= [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$($connectionToken)"))
    $URL = "https://dev.azure.com/{organization}/{project}/_apis/test/Runs/{runId}/attachments?api-version=6.0-preview.1" 
    $body =@"
    {
      "stream": "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAIAAABvFaqvAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAABlSURBVDhP7cxBCsAgDERR739pG/CnGJI0FopQ8O2cjNP6R85QbeNQU7wT1dkijaQ3vkZoWElaoTeJojW01cYh0jwfgiFBV/lEjOZtacijN/nLkOBHhIaVDgn+Wdycp6FXzlCl9wt0Y0cAzHo/zgAAAABJRU5ErkJggg==",
      "fileName": "imageAsFileAttachment.png",
      "comment": "Test attachment upload",
      "attachmentType": "GeneralAttachment"
    }
    "@
    $Result = Invoke-RestMethod -Uri $URL -ContentType "application/json" -Body $body -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} -Method POST
    

    Update2

    Check the pic below and notice the URL

    enter image description here

    According to the screenshot you shared before, it seems that you want to add attachments to the test run instead of test result. So we just need test run ID and we could get the test run ID from variable after the task vs test ends.

    If you want to add attachments to test result, we could list all test result via test run ID.

    Sample URL:

    GET https://dev.azure.com/{organization}/{project}/_apis/test/Runs/{RunID}/results
    

    The add attachments to the test result via test result ID and test run ID.

    Sample power shell script to list all test result ID

    $connectionToken="{PAT}"
    $base64AuthInfo= [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$($connectionToken)"))
    $URL = "https://dev.azure.com/{organization}/{project}/_apis/test/Runs/{RunID}/results"
    $Result = Invoke-RestMethod -Uri $URL -Headers @{authorization = "Basic $base64AuthInfo"} -Method Get 
     foreach($Run in $Result.value){
     Write-Host "This test run contain" $Run.id "and the test reuslt name is" $Run.testCase.name
     }
    

    Update3

    $connectionToken="{PAT}"
    $base64AuthInfo= [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$($connectionToken)"))
    $URL = "https://dev.azure.com/{organization}/{project}/_apis/test/Runs/134/results"
    $Result = Invoke-RestMethod -Uri $URL -Headers @{authorization = "Basic $base64AuthInfo"} -Method Get 
    #List all test result  get the test result ID via result
    foreach($Run in $Result.value){
    
    #Get the test result ID via result
    If($Run.outcome -eq "Failed"){
    $TestResultID = $Run.id
    #Write-Host $TestResultID
    
    
    #Add attachment via test run ID and test result ID
    $TestResultAttachmentURL = "https://dev.azure.com/{organization}/{project}/_apis/test/Runs/{runId}/Results/$($TestResultID)/attachments?api-version=6.0-preview.1" 
    
    $body =@"
    {
      "stream": "VXNlciB0ZXh0IGNvbnRlbnQgdG8gdXBsb2FkLg==",
      "fileName": "textAsFileAttachment.txt",
      "comment": "Test attachment upload",
      "attachmentType": "GeneralAttachment"
    }
    "@
    $TestResultAttachmentResult = Invoke-RestMethod -Uri $TestResultAttachmentURL -ContentType "application/json" -Body $body -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} -Method POST
    }
    }
    

    Update4

    $AzureDevOpsPAT = {PAT}
    $AzureDevOpsAuthenicationHeader = @{Authorization = 'Basic ' + [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$($AzureDevOpsPAT)")) }
    $UriOrga = "https://dev.azure.com/{organization}/{project}/" 
    $uriAccount = $UriOrga + "_apis/test/runs?api-version=6.0"
    
    $response = Invoke-RestMethod -Uri $uriAccount -Headers $AzureDevOpsAuthenicationHeader -Method Get
    $testRunsIdSorted = $response.value | sort-object id -Descending
    Write-Host "##vso[task.setvariable variable=runId]$($testRunsIdSorted[0].id | ConvertTo-Json -Depth 100)"
    $result = Invoke-RestMethod -Uri https://dev.azure.com/{organization}/{project}/_apis/test/runs/$($testRunsIdSorted[0].id)/results?api-version=6.0 -Headers $AzureDevOpsAuthenicationHeader -Method Get
    
    #List all test result  get the test result ID via result
    foreach($Run in $result.value){
    
    #Get the test result ID via result
    If($Run.outcome -eq "Failed"){
    $TestResultID = $Run.id
    #Write-Host $TestResultID
    
    
    #Add attachment via test run ID and test result ID
    $TestResultAttachmentURL = "https://dev.azure.com/{organization}/{project}/_apis/test/Runs/$($runId)/Results/$($TestResultID)/attachments?api-version=6.0-preview.1" 
    
    $body =@"
    {
      "stream": "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAIAAABvFaqvAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAABlSURBVDhP7cxBCsAgDERR739pG/CnGJI0FopQ8O2cjNP6R85QbeNQU7wT1dkijaQ3vkZoWElaoTeJojW01cYh0jwfgiFBV/lEjOZtacijN/nLkOBHhIaVDgn+Wdycp6FXzlCl9wt0Y0cAzHo/zgAAAABJRU5ErkJggg==",
      "fileName": "imageAsFileAttachment.png",
      "comment": "Test attachment upload",
      "attachmentType": "GeneralAttachment"
    }
    "@
    $TestResultAttachmentResult = Invoke-RestMethod -Uri $TestResultAttachmentURL -ContentType "application/json" -Body $body -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} -Method POST
    }
    }
    

    enter image description here enter image description here

    If I click on .png file, it shows nothing.