无法通过PowerShell脚本将(某些)SpecFlow测试导入TFS?

无法通过PowerShell脚本将(某些)SpecFlow测试导入TFS?,powershell,tfs,specflow,microsoft-test-manager,Powershell,Tfs,Specflow,Microsoft Test Manager,我有一个在VSTFS 2015中每晚运行的SpecFlow测试的自动构建,它是通过PowerShell脚本填充的。大多数测试导入时没有问题,但是在大约800个测试中,大约有30个测试根本无法导入 从TFS生成返回的错误为: TF237086:无法保存工作项,因为至少有一个字段包含不允许的值。 由于这是一个脚本,这些特定的测试始终无法导入,这似乎很奇怪 下面添加了脚本(主要来自ye olde interweb): 关于为什么某些测试无法导入,或者以前有人遇到过这种情况,有什么想法吗?找到/缩小错误

我有一个在VSTFS 2015中每晚运行的SpecFlow测试的自动构建,它是通过PowerShell脚本填充的。大多数测试导入时没有问题,但是在大约800个测试中,大约有30个测试根本无法导入

从TFS生成返回的错误为:

TF237086:无法保存工作项,因为至少有一个字段包含不允许的值。

由于这是一个脚本,这些特定的测试始终无法导入,这似乎很奇怪

下面添加了脚本(主要来自ye olde interweb):


关于为什么某些测试无法导入,或者以前有人遇到过这种情况,有什么想法吗?

找到/缩小错误的最佳方法是在MTM中手动创建失败的自动测试用例

实际上,要创建测试用例,只需要“Title”值。然而,您还应该再次确认您的测试用例中是否存在某个字段的错误默认值。因为至少有一个字段包含不允许的值,所以将导致此错误。这意味着这可能是一个测试用例模板错误


更多故障排除方法请查看类似问题:

谢谢您的输入。。。我尝试过对测试进行更改,但与其他成功导入的测试(包括具有相同“功能”文件的测试)没有明显区别。糊涂了,所以。考虑到“Title”是唯一需要的主字段,并且测试是自动化的,我比较了其他测试的长度。结果表明,标题字段很可能有字符限制。要么如此,要么存在字符编码问题。解决这两个因素可以确保成功的测试导入。哈扎!


    [CmdletBinding()]

    $storage = "$env:BUILD_ARTIFACTSTAGINGDIRECTORY\AcmeCo.Acceptance.Tests.dll"

    Write-Host "Importing tests from '$storage'"

    & 'C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\TCM.exe' testcase /collection:$env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI /teamproject:"AcmeCo" /import /storage:$storage /category:"SomeSuite1" /syncsuite:135777
    & 'C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\TCM.exe' testcase /collection:$env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI /teamproject:"AcmeCo" /import /storage:$storage /category:"SomeSuite2" /syncsuite:148870
    & 'C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\TCM.exe' testcase /collection:$env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI /teamproject:"AcmeCo" /import /storage:$storage /category:"SomeSuite3" /syncsuite:135775
    & 'C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\TCM.exe' testcase /collection:$env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI /teamproject:"AcmeCo" /import /storage:$storage /category:"SomeSuite4" /syncsuite:148872

    & 'C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\TCM.exe' testcase /collection:$env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI /teamproject:"AcmeCo" /import /storage:$storage /category:"SomeSuite5" /syncsuite:135781
    & 'C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\TCM.exe' testcase /collection:$env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI /teamproject:"AcmeCo" /import /storage:$storage /category:"SomeSuite6" /syncsuite:135782
    & 'C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\TCM.exe' testcase /collection:$env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI /teamproject:"AcmeCo" /import /storage:$storage /category:"SomeSuite7" /syncsuite:148869

    Write-Host "Tests imported"

    Write-Host "Updating test plans"
    [Reflection.Assembly]::LoadWithPartialName('Microsoft.TeamFoundation.Client')
    [Reflection.Assembly]::LoadWithPartialName('Microsoft.TeamFoundation.TestManagement.Client')
    [Reflection.Assembly]::LoadWithPartialName('Microsoft.TeamFoundation.Build.Client')

    # Find all test plans using this build definition
    $tpc = [Microsoft.TeamFoundation.Client.TfsTeamProjectCollectionFactory]::GetTeamProjectCollection($env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI)
    $tcm = $tpc.GetService([Microsoft.TeamFoundation.TestManagement.Client.ITestManagementService])
    $buildServer = $tpc.GetService([Microsoft.TeamFoundation.Build.Client.IBuildServer])
    $teamProject = $buildServer.GetBuild($Env:BUILD_BUILDURI);
    $testProject = $tcm.GetTeamProject($teamProject.TeamProject);
    $testPlans = $testProject.TestPlans.Query("SELECT * FROM TestPlan")

    $matchingTestPlans = @()
    foreach($testPlan in $testPlans)
    {
        Write-Host "The current Test Plan build definition is: '$testPlan.BuildFilter.AreaPath'"

        if($testPlan.BuildFilter.AreaPath -contains 'AcmeCo Test Plan')
        {
            $matchingTestPlans += $testPlan
        }
    }

    # Update test plans with latest build
    if($matchingTestPlans)
    {
        Write-Host "Updating test plans using '$Env:BUILD_BUILDDEFINITIONNAME' to '$Env:BUILD_BUILDURI' ($($matchingTestPlans.count) matching test plans)"

        foreach ($matchingTestPlan in $matchingTestPlans) {
            $matchingTestPlan.BuildUri = $Env:BUILD_BUILDURI
            $matchingTestPlan.Save()
        }

        Write-Host "Test plans updated"
    }
    else
    {
        Write-Warning "Found no test plans to update."
    }