Azure DevOps:解决多个 .Net 框架时测试失败
Azure DevOps: tests failing when addressing multiple .Net frameworks
[编辑:8 月 10 日]
我有一个生成 DLL 的项目(用于私有 NuGet 包)。该项目编写为在以下框架中编译:
<TargetFrameworks>netstandard2.0;netstandard2.1</TargetFrameworks>
该解决方案还包含四个测试项目,每个都是用 .NetCore 3.1 编写的(使用上述项目中的 .Netstandard 2.1 dll)。
这些几个月来一直运行良好,但当然,我并没有测试我的 NuGet 包是否适用于使用 .NetStandard 2.0 框架的代码。
因此我更新了测试项目以在以下框架中编译:
<TargetFrameworks>net472;net48;netcoreapp3.1</TargetFrameworks>
我立即将我的测试次数增加了两倍,并且 Visual Studio 他们都通过了(呸!)。好吧,几乎翻了三倍...每个项目都包含一些不适用于 .NetFramework 的测试,所以我使用条件编译来删除这些 .NetFramework 代码的测试。
一切都好....
但是,当我将其推送到 Azure 时,测试步骤失败。
构建脚本 (yaml) 包含以下命令:
...
- task: VSBuild@1
displayName: 'Build all'
inputs:
solution: '$(solution)'
platform: '$(buildPlatform)'
configuration: '$(buildConfiguration)'
maximumCpuCount: true
- task: DotNetCoreCLI@2
displayName: 'Run Tests'
inputs:
command: 'test'
projects: '**/*Test.csproj'
arguments: '--configuration $(buildConfiguration) --collect "Code coverage"'
...
(仅供参考,我们还连接到 SonarCloud 并报告代码覆盖率)
“头条”新闻似乎很有希望:
Job preparation parameters
6 queue time variables used
100% tests passed
当我深入研究时,我看到每个测试项目都有以下模式:
Total tests: 3650
Passed: 3650
Total tests: 3650
Passed: 3650
Total tests: 3652
Passed: 3652
所以,从上面,我可以看出这些数字对应于我的一个测试项目被执行了三次,一次针对 .Net 4.7.2,一次针对 .Net 4.8,一次针对 .Core 3.1。
我看到其他每个测试项目都有一组类似的三个执行。
所以...每个测试都通过了。
但是,在每个测试项目的 .NetCore 版本执行后(因此,几个月来一直执行良好的那个),我现在得到以下信息:
##[error]Error: The process 'C:\Program Files\dotnet\dotnet.exe' failed with exit code 1
"C:\Program Files\dotnet\dotnet.exe" test d:\a\s\My.Test.Project\EMy.Test.Project.csproj --logger trx --results-directory d:\a\_temp --configuration Release --collect "Code coverage"
我不知道如何解释它,因此也不知道如何修复它。
我的猜测是代码分析报告接收了三次覆盖率数据,这导致它出现了一些问题。如果是这种情况,那么我不得不在 YAML 中说“像我们一直在做的那样使用 .NetCore 3.1 执行每个测试项目一次并收集代码覆盖率,然后再次执行它们,一次用于 .Net 4.7。 2 然后是 4.8,没有代码覆盖率”。但我不确定如何在 yaml 中表达它...
编辑 8 月 10 日 #1
为了回应下面Kevin Lu的评论,我从细节中挖出了这个。
Data collector 'Code Coverage' message: Failed to initialize code
coverage datacollector with error: System.TypeLoadException: Could not
load type
'Microsoft.VisualStudio.TestPlatform.Utilities.CodeCoverageRunSettingsProcessor'
from assembly 'Microsoft.TestPlatform.Utilities, Version=15.0.0.0,
Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'. at
Microsoft.VisualStudio.Coverage.DynamicCoverageDataCollectorImpl.Initialize(XmlElement
configurationElement, IDataCollectionSink dataSink,
IDataCollectionLogger logger) at
Microsoft.VisualStudio.Coverage.DynamicCoverageDataCollector.OnInitialize(XmlElement
configurationElement). Data collector 'Code Coverage' message: Data
collector 'Code Coverage' threw an exception during type loading,
construction, or initialization: System.TypeLoadException: Could not
load type
'Microsoft.VisualStudio.TestPlatform.Utilities.CodeCoverageRunSettingsProcessor'
from assembly 'Microsoft.TestPlatform.Utilities, Version=15.0.0.0,
Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'. at
Microsoft.VisualStudio.Coverage.DynamicCoverageDataCollectorImpl.Initialize(XmlElement
configurationElement, IDataCollectionSink dataSink,
IDataCollectionLogger logger) at
Microsoft.VisualStudio.Coverage.DynamicCoverageDataCollector.OnInitialize(XmlElement
configurationElement) at
Microsoft.VisualStudio.TraceCollector.BaseDataCollector.Initialize(XmlElement
configurationElement, IDataCollectionEvents events,
IDataCollectionSink dataSink, IDataCollectionLogger logger,
IDataCollectionAgentContext agentContext) at
Microsoft.VisualStudio.TraceCollector.BaseDataCollector.Initialize(XmlElement
configurationElement, DataCollectionEvents events, DataCollectionSink
dataSink, DataCollectionLogger logger,
DataCollectionEnvironmentContext environmentContext) at
Microsoft.VisualStudio.TestPlatform.Common.DataCollector.DataCollectorInformation.InitializeDataCollector()
at
Microsoft.VisualStudio.TestPlatform.Common.DataCollector.DataCollectionManager.LoadAndInitialize(DataCollectorSettings
dataCollectorSettings, String settingsXml)..
编辑 8 月 10 日 #2
我尝试添加不同的 NuGet 包以查看是否可以让它工作 即 Microsoft.TestPlatform.ObjectModel
然后 Microsoft.TestPlatform
),但无济于事。
然后我更改了构建脚本:
- task: DotNetCoreCLI@2
displayName: 'Run Tests'
inputs:
command: 'test'
projects: '**/*Test.csproj'
arguments: '--configuration $(buildConfiguration) --collect "Code coverage"'
至
- task: VSTest@2
displayName: 'Run Tests'
inputs:
testSelector: 'testAssemblies'
testAssemblyVer2: |
**\No1Test.dll
**\No2Test.dll
**\No3Test.dll
**\No4Test.dll
searchFolder: '$(System.DefaultWorkingDirectory)'
codeCoverageEnabled: true
runInParallel: true
这感觉像是倒退了一步,但是,所有测试都通过了并且没有错误消息,所以这是值得高兴的事情。但是....这是“完美”的解决方案吗?
从错误信息来看,您使用的包似乎有一些问题。
我想分享我项目中的包。
Project.csproj
...
<PropertyGroup>
<TargetFrameworks>net472;net48;netcoreapp3.1</TargetFrameworks>
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.6.1" />
<PackageReference Include="xunit" Version="2.4.1" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.1" />
<PackageReference Include="Microsoft.TestPlatform.ObjectModel" Version="16.6.1" />
</ItemGroup>
...
Microsoft.NET.Test.Sdk
包与代码覆盖率有关。如果我删除这个包,测试将失败。
顺便说一下,运行 Microsoft hosted agent: Windows-2019
。
更新:
使用 Microsoft.NET.Test.Sdk
版本进行测试:16.7.0。我遇到了同样的问题。
您可以试试以前的版本(例如16.6.1)。
更新2:
Microsoft.NET.Test.Sdk
版本 16.7.1 已发布解决此问题。
[编辑:8 月 10 日]
我有一个生成 DLL 的项目(用于私有 NuGet 包)。该项目编写为在以下框架中编译:
<TargetFrameworks>netstandard2.0;netstandard2.1</TargetFrameworks>
该解决方案还包含四个测试项目,每个都是用 .NetCore 3.1 编写的(使用上述项目中的 .Netstandard 2.1 dll)。
这些几个月来一直运行良好,但当然,我并没有测试我的 NuGet 包是否适用于使用 .NetStandard 2.0 框架的代码。
因此我更新了测试项目以在以下框架中编译:
<TargetFrameworks>net472;net48;netcoreapp3.1</TargetFrameworks>
我立即将我的测试次数增加了两倍,并且 Visual Studio 他们都通过了(呸!)。好吧,几乎翻了三倍...每个项目都包含一些不适用于 .NetFramework 的测试,所以我使用条件编译来删除这些 .NetFramework 代码的测试。
一切都好....
但是,当我将其推送到 Azure 时,测试步骤失败。
构建脚本 (yaml) 包含以下命令:
...
- task: VSBuild@1
displayName: 'Build all'
inputs:
solution: '$(solution)'
platform: '$(buildPlatform)'
configuration: '$(buildConfiguration)'
maximumCpuCount: true
- task: DotNetCoreCLI@2
displayName: 'Run Tests'
inputs:
command: 'test'
projects: '**/*Test.csproj'
arguments: '--configuration $(buildConfiguration) --collect "Code coverage"'
...
(仅供参考,我们还连接到 SonarCloud 并报告代码覆盖率)
“头条”新闻似乎很有希望:
Job preparation parameters
6 queue time variables used
100% tests passed
当我深入研究时,我看到每个测试项目都有以下模式:
Total tests: 3650
Passed: 3650
Total tests: 3650
Passed: 3650
Total tests: 3652
Passed: 3652
所以,从上面,我可以看出这些数字对应于我的一个测试项目被执行了三次,一次针对 .Net 4.7.2,一次针对 .Net 4.8,一次针对 .Core 3.1。
我看到其他每个测试项目都有一组类似的三个执行。
所以...每个测试都通过了。
但是,在每个测试项目的 .NetCore 版本执行后(因此,几个月来一直执行良好的那个),我现在得到以下信息:
##[error]Error: The process 'C:\Program Files\dotnet\dotnet.exe' failed with exit code 1
"C:\Program Files\dotnet\dotnet.exe" test d:\a\s\My.Test.Project\EMy.Test.Project.csproj --logger trx --results-directory d:\a\_temp --configuration Release --collect "Code coverage"
我不知道如何解释它,因此也不知道如何修复它。
我的猜测是代码分析报告接收了三次覆盖率数据,这导致它出现了一些问题。如果是这种情况,那么我不得不在 YAML 中说“像我们一直在做的那样使用 .NetCore 3.1 执行每个测试项目一次并收集代码覆盖率,然后再次执行它们,一次用于 .Net 4.7。 2 然后是 4.8,没有代码覆盖率”。但我不确定如何在 yaml 中表达它...
编辑 8 月 10 日 #1
为了回应下面Kevin Lu的评论,我从细节中挖出了这个。
Data collector 'Code Coverage' message: Failed to initialize code coverage datacollector with error: System.TypeLoadException: Could not load type 'Microsoft.VisualStudio.TestPlatform.Utilities.CodeCoverageRunSettingsProcessor' from assembly 'Microsoft.TestPlatform.Utilities, Version=15.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'. at Microsoft.VisualStudio.Coverage.DynamicCoverageDataCollectorImpl.Initialize(XmlElement configurationElement, IDataCollectionSink dataSink, IDataCollectionLogger logger) at Microsoft.VisualStudio.Coverage.DynamicCoverageDataCollector.OnInitialize(XmlElement configurationElement). Data collector 'Code Coverage' message: Data collector 'Code Coverage' threw an exception during type loading, construction, or initialization: System.TypeLoadException: Could not load type 'Microsoft.VisualStudio.TestPlatform.Utilities.CodeCoverageRunSettingsProcessor' from assembly 'Microsoft.TestPlatform.Utilities, Version=15.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'. at Microsoft.VisualStudio.Coverage.DynamicCoverageDataCollectorImpl.Initialize(XmlElement configurationElement, IDataCollectionSink dataSink, IDataCollectionLogger logger) at Microsoft.VisualStudio.Coverage.DynamicCoverageDataCollector.OnInitialize(XmlElement configurationElement) at Microsoft.VisualStudio.TraceCollector.BaseDataCollector.Initialize(XmlElement configurationElement, IDataCollectionEvents events, IDataCollectionSink dataSink, IDataCollectionLogger logger, IDataCollectionAgentContext agentContext) at Microsoft.VisualStudio.TraceCollector.BaseDataCollector.Initialize(XmlElement configurationElement, DataCollectionEvents events, DataCollectionSink dataSink, DataCollectionLogger logger, DataCollectionEnvironmentContext environmentContext) at Microsoft.VisualStudio.TestPlatform.Common.DataCollector.DataCollectorInformation.InitializeDataCollector() at Microsoft.VisualStudio.TestPlatform.Common.DataCollector.DataCollectionManager.LoadAndInitialize(DataCollectorSettings dataCollectorSettings, String settingsXml)..
编辑 8 月 10 日 #2
我尝试添加不同的 NuGet 包以查看是否可以让它工作 即 Microsoft.TestPlatform.ObjectModel
然后 Microsoft.TestPlatform
),但无济于事。
然后我更改了构建脚本:
- task: DotNetCoreCLI@2
displayName: 'Run Tests'
inputs:
command: 'test'
projects: '**/*Test.csproj'
arguments: '--configuration $(buildConfiguration) --collect "Code coverage"'
至
- task: VSTest@2
displayName: 'Run Tests'
inputs:
testSelector: 'testAssemblies'
testAssemblyVer2: |
**\No1Test.dll
**\No2Test.dll
**\No3Test.dll
**\No4Test.dll
searchFolder: '$(System.DefaultWorkingDirectory)'
codeCoverageEnabled: true
runInParallel: true
这感觉像是倒退了一步,但是,所有测试都通过了并且没有错误消息,所以这是值得高兴的事情。但是....这是“完美”的解决方案吗?
从错误信息来看,您使用的包似乎有一些问题。
我想分享我项目中的包。
Project.csproj
...
<PropertyGroup>
<TargetFrameworks>net472;net48;netcoreapp3.1</TargetFrameworks>
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.6.1" />
<PackageReference Include="xunit" Version="2.4.1" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.1" />
<PackageReference Include="Microsoft.TestPlatform.ObjectModel" Version="16.6.1" />
</ItemGroup>
...
Microsoft.NET.Test.Sdk
包与代码覆盖率有关。如果我删除这个包,测试将失败。
顺便说一下,运行 Microsoft hosted agent: Windows-2019
。
更新:
使用 Microsoft.NET.Test.Sdk
版本进行测试:16.7.0。我遇到了同样的问题。
您可以试试以前的版本(例如16.6.1)。
更新2:
Microsoft.NET.Test.Sdk
版本 16.7.1 已发布解决此问题。