如何从 MVC 应用程序中的 TFS 服务器构建中获取硒测试结果

how to get selenium Test results from TFS server builds in MVC app

我正在使用 TFS 2015 构建、部署和 运行 我的 selenium UI 测试。 它对我来说很好用。我对不同的客户也有不同的构建定义(这里的测试 运行 是相同的,但它们 运行 针对不同的数据库)。

我的测试 运行 每天晚上和早上我都必须单独去每个构建定义查看结果(我收到一封邮件,其中包含测试失败和通过的数量)。 但是要查看哪个测试失败以及其他详细信息,例如为什么失败,我需要每次都去服务器上的 TFS build def。

我打算制作一个简单的应用程序,它将像一个简单的 MVC 网络应用程序一样获取数据并将其显示在一个地方(内部用途)。到目前为止,我只能使用

获取构建的简单数据,如名称和结果
using Microsoft.TeamFoundation.Build.WebApi;

但我无法获得测试 运行 详细信息和事件,任何人都可以建议我使用哪个 API 来实现此目的并以更简单的形式显示数据。

我得到了这个 link 但我不确定如何在我的应用程序中使用它。 https://www.visualstudio.com/en-us/docs/integrate/api/test/results

谢谢,

艾米

这是我用来从 TFS 2018 rest API 获取结果的 PowerShell 脚本,它是 运行 多个 selenium 测试 运行 as UI 使用 TFS Release 的测试管理。您可以更改 API 版本号以支持 TFS 2015 并简化以下脚本以访问和通过电子邮件发送您的测试结果。在脚本中,我考虑了多个发布环境,因为我在 TFS 发布管理中使用它。该脚本具有任务 ID 7 的硬编码访问权限,以查找发布环境的状态。删除此示例中的那些步骤并简化它以用于构建。 您可以在 PowerShell 构建任务中将 PowerShell 作为内联脚本执行。

param(
    [Parameter(Mandatory=$true)]
    [string] $TestEnvIds,
    [String] $recipients
)
$collectionUri = $Env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI
$TeamProject = $Env:SYSTEM_TEAMPROJECT
$ReleaseId = $Env:RELEASE_RELEASEID




$resultHtml='';

#$securePassword = $Password | ConvertTo-SecureString -AsPlainText -Force   
#$credential = New-Object System.Management.Automation.PSCredential($User, $securePassword)       


$Uri = $collectionUri + $TeamProject + '/_apis/Release/releases/' + $ReleaseId + '?api-version=4.0-preview.4'

write-host 'calling:' $Uri

$ReleaseInstance = Invoke-RestMethod -Method Get -ContentType application/json -Uri $Uri -UseDefaultCredentials #-Credential $credential -Body $ReleaseMetadata 

$TestEnvIdArray =  $TestEnvIds.Split('; ',[System.StringSplitOptions]::RemoveEmptyEntries);
write-host "Test Run Results"
write-host "*************************"

$PassedTotTestCount = 0;
$FailedTotTestCount = 0;


foreach($TestEnvId in $TestEnvIdArray)
{
    #get definition environment id
    $tempEnv=  $ReleaseInstance.environments.Where({$_.definitionEnvironmentId -eq $TestEnvId})
    $envid=$tempEnv.id

    $resultHtml = $resultHtml + '<h2><u>' + $tempEnv.name + '</u></h2>'

    if($tempEnv.deploysteps.tasks.Count-gt0)
    {

        $Uri1=$collectionUri + $TeamProject + '/_apis/Release/releases/' + $ReleaseId + '/environments/'+$envid+'/tasks/7/logs?api-version=4.0-preview.4'
        $ReleaseText = Invoke-RestMethod -Method Get -ContentType application/json -Uri $Uri1 -UseDefaultCredentials

        if($ReleaseText.Contains('Deployment on this environment failed.'))
        {
            write-host "Deployment of test agent failed or other error occured."
            $resultHtml = $resultHtml + '<h3>Deployment of test agent failed or other error occured.</h3>'
        }
        else
        {
            #get test run id of environment
            $pattern="Test Run with Id(.*?)Queued"
            $testRunID=[regex]::Match($ReleaseText,$pattern).Groups[1].Value.trim()

            $testResultUri=$collectionUri + $TeamProject + '/_apis/test/runs/'+$testRunID+'/results?api-version=4.0-preview.4'
            $TestResults = Invoke-RestMethod -Method Get -ContentType application/json -Uri $testResultUri -UseDefaultCredentials

            # print Test Results
            write-host "**********Test Env" $TestResults.value[0].computerName"***************"
            write-host "---------------------------"

            $resultDetHtml =  '<ul>'

            $PassedCountEnv = 0;
            $FailedCountEnv = 0;

            for($i = 0; $i -lt $TestResults.value.Count; $i++)
            {
                write-host 'Test Id :'  $TestResults.value[$i].testCase.id 'Test Name:' $TestResults.value[$i].testCase.name 'Status:' $TestResults.value[$i].outcome
                $resultDetHtml = $resultDetHtml + '<li style="font-family: Arial; font-size: 12pt;">'+ $TestResults.value[$i].outcome + ' Test:'+ $TestResults.value[$i].testCase.id + ' - ' + $TestResults.value[$i].testCase.name + '</li>'

                if($TestResults.value[$i].outcome.tolower() -eq 'passed')
                {
                    $PassedCountEnv += 1;
                }
                else
                {
                    $FailedCountEnv += 1;
                }

            }
            $resultDetHtml = $resultDetHtml + '</ul>'

            $resultHtml = $resultHtml + '<h3>Pass Rate: <span style="color: #3366ff;"> {0:N2}' -f + (($PassedCountEnv/($PassedCountEnv+$FailedCountEnv))*100) + '% </span> <span style="color: #339966;">Passed</span>:' + $PassedCountEnv + '<span style="color: #ff0000;"> Failed</span>:' + $FailedCountEnv  + '</h3>'
            $resultHtml = $resultHtml + $resultDetHtml

            $PassedTotTestCount = $PassedTotTestCount + $PassedCountEnv
            $FailedTotTestCount = $FailedTotTestCount + $FailedCountEnv

        }

    }
    else
    {
        write-host "Test environment has failed."
        $resultHtml = '<h3>Test environment has failed.</h3>' + $resultHtml 
    }
}



$ReultsEmailSubject = 'Test results for Release:' + $ReleaseInstance.description

$resultHtml = '<h1><u>' + $ReultsEmailSubject +'</u><h1>' + '<h3>Pass Rate: <span style="color: #3366ff;"> {0:N2}' -f +(($PassedTotTestCount/($PassedTotTestCount+$FailedTotTestCount))*100) + '% </span> <span style="color: #339966;">Passed</span>:' + $PassedTotTestCount + '<span style="color: #ff0000;"> Failed</span>:' + $FailedTotTestCount  + '</h3>' + $resultHtml 
#$resultHtml

write-host "Now sending email"


$recipientsArray = $recipients.Split(',')

Send-MailMessage -To $recipientsArray -Subject $ReultsEmailSubject -Body $resultHtml -BodyAsHtml -SmtpServer yourSMTPserver  -From tfs@yourdomain.com

write-host "Email Sent"

您可以通过REST API(您上面提到的link)

获取特定项目的测试结果

例如,下面的 PowerShell 脚本示例可以从特定项目中获取所有 失败的 测试结果,或者导出到 .csv 文件,然后在Excel中打开,稍后过滤:

Param(
   [string]$collectionurl = "http://server:8080/tfs/Collection", 
   [string]$project = "ProjectName",
   [string]$user = "username",
   [string]$token = "password"
) 

# Base64-encodes the Personal Access Token (PAT) appropriately
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $user,$token)))

#Get test runs
$testrunsUrl = "$collectionurl/$project/_apis/test/runs?api-version=1.0"
$testruns = (Invoke-RestMethod -Uri $testrunsUrl -Method Get -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}).value

#Get unit tests from each test run
$UnitTestResults = @()

foreach ($testrun in $testruns)
{
$testrunID = $testrun.id

#Get test results for specific test run
$baseUrl = "$collectionurl/$project/_apis/test/runs/$testrunID/results?api-version=3.0-preview"
$response = Invoke-RestMethod -Uri $baseUrl -Method Get -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}
$unittests = $response.value | where({$_.outcome -eq 'Failed'})

$customObject = new-object PSObject -property @{
          "ComputerName" = @($unittests.computerName -join ',')|Select-Object
          "BuildId" = @($unittests.build.id -join ',')|Select-Object
          "BuildName" = @($unittests.build.name -join ',')|Select-Object
          "BuildUrl" = @($unittests.build.url -join ',')|Select-Object
          "TestRunID" = $testrunID
          "ProjectName" = @($unittests.project.name -join ',')|Select-Object
          "TestRunName" = @($unittests.testRun.name -join ',')|Select-Object
          "TestRunURL" = @($unittests.testRun.url -join ',')|Select-Object
          "UnitTestname" = @($unittests.automatedTestName -join ',')|Select-Object
          "outcome" = @($unittests.outcome -join ',')|Select-Object
          "errorMessage" = @($unittests.errorMessage -join ',')|Select-Object
          "TestResultsUrl" = @($unittests.url -join ',')|Select-Object
          "completedDate" = @($unittests.completedDate -join ',')|Select-Object 
        } 

    $UnitTestResults += $customObject
}

$UnitTestResults | Select `
                ProjectName,
                ComputerName,
                BuildId,
                BuildName,
                BuildUrl,
                TestRunID,
                TestRunName,
                TestRunURL, 
                UnitTestname,
                outcome,
                errorMessage,
                TestResultsUrl,
                completedDate | where({$_.outcome -like '*Failed*'}) #|export-csv -Path C:\LC\UnitTest.csv -NoTypeInformation

您也可以使用 TFS API 来实现。 build的测试结果保存在test运行s中,所以需要先获取build的test运行,然后从test运行中获取测试结果。

您可以参考以下主题: