C# 无法在Visual Studio中关联测试用例

C# 无法在Visual Studio中关联测试用例,c#,visual-studio,unit-testing,tfs,azure-devops,C#,Visual Studio,Unit Testing,Tfs,Azure Devops,我在单元测试C#项目文件中有一个标准的MSTest单元测试。该项目正在运行.NET Framework 4.7.2,并安装了MSTest适配器和框架的1.3.2版。我正在运行Visual Studio 2017 Enterprise 15.7.6,并且有一个VSTS工作区,其中包含一些随机手动创建的测试用例 当我在测试资源管理器中右键单击我的单元测试并选择“关联到测试用例”时,我可以输入测试用例ID,添加关联,然后单击“保存”。保存后,我收到一条错误消息,如下所示 我曾尝试使用不同版本的MST

我在单元测试C#项目文件中有一个标准的MSTest单元测试。该项目正在运行.NET Framework 4.7.2,并安装了MSTest适配器和框架的1.3.2版。我正在运行Visual Studio 2017 Enterprise 15.7.6,并且有一个VSTS工作区,其中包含一些随机手动创建的测试用例

当我在测试资源管理器中右键单击我的单元测试并选择“关联到测试用例”时,我可以输入测试用例ID,添加关联,然后单击“保存”。保存后,我收到一条错误消息,如下所示


我曾尝试使用不同版本的MSTest和项目文件的不同.NET Framework版本保存关联,但这两种版本都没有解决问题。我还尝试以管理员身份运行VisualStudio,但没有成功。有没有其他人遇到过这个问题,或者知道任何解决方法?

我用两个VS2017版本在我这边进行了测试,它们都运行良好

例如,我在VSTS的一个测试计划中手动添加了一个简单的测试用例,然后我使用VS2017 15.7.6创建了一个带有.net 4.7.2的简单单元测试项目

如果可能,您可以通过以下步骤在您的一侧进行测试:

(1) 使用其他VS机器测试它(相同的VS版本,但如果有,则不在同一机器中)

(2) 清理VSTS缓存。在“解决方案资源管理器”窗口中清理并重新生成测试项目,然后再次进行测试

(3) 工具->选项->工作项,在那里选择“VisualStudio(兼容模式)”

(4) 如果仍然没有帮助,请在您的VS中添加一个新的测试简单单元测试项目,删除nuget包:MSTest.TestAdapter和MSTest.TestFramework,然后添加对Microsoft.VisualStudio.QualityTools.UnitTestFramework的本地引用,再次查看结果

更新:

我将我的VS2017更新为15.8.1版本,我也遇到了同样的问题,默认情况下该选项是禁用的。这将是一个真正的反馈


得到相同问题的其他成员可以投票。

我提出的一个解决办法,现在专门用来代替手动关联,就是在测试方法名称中提供测试用例id,并通过rest API自动更新TFS中的用例,方法是添加以下PowerShell脚本以在成功的TFS构建上运行

每个测试的GUID都是使用测试方法的完整命名空间生成的,需要添加到“/fields/Microsoft.VSTS.TCM.AutomatedTestId”

这需要根据您自己的TFS身份验证方法和可能的TFS版本(我使用的是2017.2)以及您需要阅读的测试类型进行调整。这支持编码的UI和xUnit。如果您根本不使用编码的UI,则可以删除顶部的LoadFrom

param (
    [string]$Dll = $(throw "-path to test Dll is required.")    
)
Write-Warning "$Dll will be locked until this powershell session closes"
#Load for CodedUi Support
[Reflection.Assembly]::LoadFrom(("C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\PublicAssemblies\Microsoft.VisualStudio.TestTools.UITesting.dll"))
[Reflection.Assembly]::LoadFrom(("C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\PublicAssemblies\Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll"))

try {
    $tests = ([Reflection.Assembly]::LoadFrom(($Dll)).GetTypes().GetMethods() | Where-Object { $_.GetCustomAttributes($false) | Where-Object {$_.TypeId.Name -icontains 'TestMethodAttribute' -or $_.TypeId.Name -icontains 'FactAttribute' -or $_.TypeId.Name -icontains 'SkippableFactAttribute' -or $_.TypeId.Name -icontains 'TheoryAttribute'}} | ForEach-Object { @{ Class = $_.DeclaringType.Name; Name = $_.Name; FullName = $_.DeclaringType.FullName + "."  + $_.Name; }})
}
catch {

    Write-Error "Could not load or read $dll" -ErrorAction Stop
}


foreach ($test in $tests)
{
    $sha1 = New-Object System.Security.Cryptography.SHA1CryptoServiceProvider;
    $nameHash = $sha1.ComputeHash([System.Text.Encoding]::Unicode.GetBytes($test.FullName));
    [byte[]]$toGuid = [System.Byte[]]::CreateInstance([System.Byte],16);
    [System.Array]::Copy($nameHash, $toGuid, 16);
    $guid = [guid]::new($toGuid);
    $id = ([Regex]::Match($test.Name, "(\d+)(?!.*\d)").Value)

    try {
        if ($psversiontable.PSVersion.Major -lt 6) {
            $currentGUID = (Invoke-RestMethod "http://{instance}[/{team-project}]/_apis/wit/workitems/$($id)?api-version=3.0-preview" -Method Get -UseBasicParsing -UseDefaultCredentials).Fields.'Microsoft.VSTS.TCM.AutomatedTestId'
        }
        else {
            $currentGUID = (Invoke-RestMethod "http://{instance}[/{team-project}]/_apis/wit/workitems/$($id)?api-version=3.0-preview" -Method Get -UseBasicParsing -UseDefaultCredentials -AllowUnencryptedAuthentication).Fields.'Microsoft.VSTS.TCM.AutomatedTestId'
        }
    }
    catch {
        $currentGUID = $null;
    }

    if($currentGUID -ne $guid)
    {       
        Write-Host "Updating $id."
        [array]$hash = @{
            op = "add";
            path = "/fields/Microsoft.VSTS.TCM.AutomatedTestName";
            from = $null;
            value = $test.FullName;        
        },@{
            op = "add";
            path = "/fields/Microsoft.VSTS.TCM.AutomatedTestStorage";
            from = $null;
            value = (Split-Path $DLL -leaf);
        },@{
            op = "add";
            path = "/fields/Microsoft.VSTS.TCM.AutomatedTestId";
            from = $null;
            value = $guid;
        },@{
            op = "add";
            path = "/fields/Microsoft.VSTS.TCM.AutomationStatus";
            from = $null;
            value = "Automated";
        },@{
            op = "add";
            path = "/fields/System.Reason";
            from = $null;
            value = "Completed";
        },@{
            op = "add";
            path = "/fields/System.State";
            from = $null;
            value = "Ready";
        }

        $patch = Convertto-json $hash -Compress

        write-host $test.Name
        write-host "http://{instance}[/{team-project}]/_apis/wit/workitems/$($id)?api-version=3.0-preview"
        if ($psversiontable.PSVersion.Major -lt 6) {
            $result = Invoke-RestMethod "http://{instance}[/{team-project}]/_apis/wit/workitems/$($id)?api-version=3.0-preview" -Method Patch -UseBasicParsing -UseDefaultCredentials -Body $patch -ContentType "application/json-patch+json"
        }
        else {
            $result = Invoke-RestMethod "http://{instance}[/{team-project}]/_apis/wit/workitems/$($id)?api-version=3.0-preview" -Method Patch -UseBasicParsing -UseDefaultCredentials -Body $patch -ContentType "application/json-patch+json" -AllowUnencryptedAuthentication
        }
    }
    else {
        Write-Host "No changes to $id."
    }
}

在Visual Studio中似乎存在问题。您是否尝试过修复安装?很遗憾,修复安装无法解决问题。我将尝试运行VS2017 Enterprise的旧版本15.6.7。我有一个关于MS的公开案例,其中至少有一个人能够在15.7.6上重现这个问题,并且能够通过降低到15.7.5来修复它。自更新至VS 2017 15.8.0后,不再显示错误消息。相反,“与测试用例关联”在右键单击测试资源管理器中的某个测试时被禁用。我在这里还有一篇正在进行的MS社区帖子:刚刚确认在版本15.8.0和15.8.1之间的行为是相同的。自从安装update 15.8.0之后,所有测试的“与测试用例关联”按钮都变灰。测试项目目前已安装测试包的v1.3.2。我使用其他机器进行了测试,使用的是VS2017的旧版本和新版本,但都不起作用。执行清理>重建不起作用。在兼容模式下运行工作项浏览器不起作用。当我删除MSTest NuGet包并添加对QualityTools.UnitTestFramework程序集的直接本地引用时,“关联到测试用例”选项不再灰显,但我仍然从原始帖子中收到错误消息。建议的四个步骤中没有一个解决了这个问题。@srstate,最新版本确实存在这个问题,“与测试用例关联”对于所有测试都是灰色的,我已经根据您在开发人员社区网站上的反馈向产品团队报告了这个问题。但是,如果我删除这些包并参考QualityTools.UnitTestFramework程序集,它在我这方面工作得很好。您是否在VS机器中安装MTM?或者,您可以将新的测试用例添加到新的测试计划中,然后再次查看结果。其他成员提供了其他解决方法,如使用Rest API:我在一台安装了MTM的机器和一台没有安装MTM的机器上尝试了此方法,但结果仍然相同。@Srestate,最新信息:MsTestV2测试用例关联在15.8.x中被禁用,因为该功能尚未完全就绪。它将在15.9预览2中启用。