我们正在使用 VS 2017 Enterprise 的构建机器上执行大量测试,我们在其中启用了 Visual Studio 测试任务的代码覆盖。此操作失败并在 TFS 2017 控制台中出现以下错误:
##[section]Starting: Test Assemblies **\*test*.dll
Preparing task execution handler.
Executing the powershell script: d:\builds\4\_tasks\VSTest_ef087383-ee5e-42c7-9a53-ab56c98420f9\1.0.60\VSTest.ps1
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\Extensions\TestPlatform
Working folder: d:\builds\4\3\s
Executing C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\Extensions\TestPlatform\vstest.console.exe "d:\builds\4\3\s\Source\u.a.testassembly.dll" /Settings:"C:\Users\username\AppData\Local\Temp\tmp9CCF.tmp" /EnableCodeCoverage /logger:trx /TestAdapterPath:"d:\builds\4\3\s"
Microsoft (R) Test Execution Command Line Tool Version 15.0.0.0
Copyright (c) Microsoft Corporation. All rights reserved.
##[error]The test source file "/EnableCodeCoverage" provided was not found.
使用 Visual Studio 2015 企业版,测试执行时代码覆盖率没有错误。
我们提供了 vstest.console.exe 文件的路径作为自定义路径。
如果我在 TFS 2017 'Visual Studio Test' 任务的复选框中禁用代码覆盖率并使用未指定代码覆盖率收集器的运行设置文件,则会执行测试,但不会报告代码覆盖率。
我也尝试过禁用代码覆盖率复选框并且
/EnableCodeCoverage
参数作为测试任务的命令行参数提供。这提供了与上述相同的错误。
我发现很多人在 VS 2017 中遇到代码覆盖问题,但这似乎主要与 .NET 核心项目有关?
谢谢您的帮助!:-)
更新 1
如果我尝试通过开发人员命令提示符运行 vstest.console.exe,我将无法成功指定该/EnableCodeCoverage
选项。它提供以下错误消息:
Microsoft (R) Test Execution Command Line Tool Version 15.0.0.0
Copyright (c) Microsoft Corporation. All rights reserved.
The test source file "/EnableCodeCoverage" provided was not found.
如果我在没有上述开关的情况下运行完全相同的命令,则不会出现此错误消息。
更新 2
如果我改用 Runsettings 文件,在该文件中指定数据收集器,则会收到与 JSON 相关的错误:
Cannot deserialize the current JSON object (e.g. {"name":"value"})
into type 'System.Collections.ObjectModel.Collection`1 Microsoft.VisualStudio.TestPlatform.ObjectModel.AttachmentSet]'
because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly.
如果我使用 /Diag 开关,我会在日志文件中获得以下堆栈跟踪:
Stack Trace:
ved Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
ved Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent)
ved Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType)
ved Newtonsoft.Json.Linq.JToken.ToObject(Type objectType, JsonSerializer jsonSerializer)
ved Newtonsoft.Json.Linq.JToken.ToObject[T](JsonSerializer jsonSerializer)
ved Microsoft.VisualStudio.TestPlatform.CommunicationUtilities.JsonDataSerializer.DeserializePayload[T](Message message)
ved Microsoft.VisualStudio.TestPlatform.CrossPlatEngine.DataCollection.ProxyDataCollectionManager.<>c__DisplayClass6_0.<AfterTestRunEnd>b__0()
ved Microsoft.VisualStudio.TestPlatform.CrossPlatEngine.DataCollection.ProxyDataCollectionManager.InvokeDataCollectionServiceAction(Action action, ITestMessageEventHandler runEventsHandler)
更新 3
我们的构建服务器是 Windows 2012 标准服务器。除了安装 Windows SDK 有效负载外,我们能够安装 VS 2017 而没有任何错误。之后我们不得不手动安装适用于 Windows 8 的 Windows SDK,因为 VS 2017 Enterprise 中包含的 Windows SDK 有效负载没有安装在 Windows server 2012 上。
我刚刚注意到 Windows Server 2012 不在VS 2017支持的操作系统列表中?...
更新 4
vstest.console.exe /? 的详细输出 从 VS 2017 开发人员命令提示符运行时是:
Microsoft (R) Test Execution Command Line Tool Version 15.0.0.0
Copyright (c) Microsoft Corporation. All rights reserved.
Usage: vstest.console.exe [Arguments] [Options] [[--] <args>...]]
Description: Runs tests from the specified files.
然后列出所有参数。这
/Enablecodecoverage
开关无处可寻。开发人员命令提示符使用“开始”菜单中的快捷方式打开。
我尝试运行一个测试套件,其中数据收集器是在 .runsettings 文件中定义的,而不是使用 /enablecodecoverage 开关,但这会产生上面列出的 JSON 错误。
更新 5
将我们的本地 TFS 升级到 2017 更新 1 后,我们能够成功执行单元测试并获得代码覆盖率。
但是,我们正在使用 SonarQube,显然在编写 Marketplace Extension v. 3.0.0 中提供的 SonarQube 扫描仪时,由于 VS 2017 中的注册表项发生了更改,因此无法正确定位代码覆盖率报告。
已向 SonarQube 提交了有关此问题的错误报告。
您可以通过在以下注册表项下手动创建名为“ShellFolder”的注册表值来绕过此限制:
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\VisualStudio\15.0
'ShellFolder' 字符串值应为:
C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise
我已将上述信息留在这里,以防其他人遇到与我们相同的问题。