【问题标题】:how to get selenium Test results from TFS server builds in MVC app如何从 MVC 应用程序中的 TFS 服务器构建中获取硒测试结果
【发布时间】:2018-07-04 12:28:57
【问题描述】:

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

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

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

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

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

我访问了此链接,但我不确定如何在我的应用程序中使用它。 https://www.visualstudio.com/en-us/docs/integrate/api/test/results

谢谢,

艾米

【问题讨论】:

    标签: c# asp.net-mvc selenium tfs tfsbuild


    【解决方案1】:

    您可以通过REST API(您上面提到的链接)获取特定项目的测试结果

    例如,下面的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 来实现这一点。 构建的测试结果存储在测试运行中,因此您需要先获取构建的测试运行,然后从测试运行中检索测试结果。

    您可以参考以下主题:

    【讨论】:

    • 抱歉回复晚了。
    • 实际上我正在研究你的方法,但我正在尝试用 c# 来做。挣扎,但还没有回复任何东西。我想在门户上显示所有测试结果数据。所以不能在这里使用这个 power shell 脚本。方法是正确的,但想在 c# 中做同样的事情。
    • @Amey 是的,第一部分是 PowerShell 解决方案。而且如您所见,我还提供了C#示例供您参考,您可以参考答案末尾的链接,您需要使用TFS API。
    【解决方案2】:

    这是我用来从 TFS 2018 rest API 获取结果的 PowerShell 脚本,该脚本运行多个 selenium 测试,使用 TFS 发布管理作为 UI 测试运行。您可以更改 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"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-28
      • 1970-01-01
      • 2013-04-12
      • 2016-07-17
      • 1970-01-01
      • 1970-01-01
      • 2014-05-16
      相关资源
      最近更新 更多