繁体   English   中英

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 package 是否适用于使用 .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 并报告代码覆盖率)

“头条”新闻似乎很有希望:

作业准备参数
使用了 6 个排队时间变量
100% 测试通过

当我深入研究时,我看到每个测试项目的以下模式:

总测试:3650
通过:3650

总测试:3650
通过:3650

总测试:3652
通过: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\1\s\My.Test.Project\EMy.Test.Project.csproj --logger trx --results-directory d:\a\_temp --configuration Release --collect "Code coverage"

我不知道如何解释它,因此如何解决它。

我的猜测是代码分析报告正在接收 3 次覆盖率数据,这导致了一些问题。 如果是这种情况,那么我不得不在 YAML 中说“像我们一直在做的那样使用.NetCore 3.1 执行每个测试项目并收集代码覆盖率,然后再次执行它们,一次用于.Net 4.7。 2,然后是没有代码覆盖的 4.8”。 但我不确定在 yaml 中如何表达...


编辑 8 月 10 日 #1

为了回应 Kevin Lu 在下面的评论,我从细节中挖掘了这一点。

数据收集器“代码覆盖率”消息:无法初始化代码覆盖率数据收集器并出现错误:System.TypeLoadException:无法从程序集“Microsoft.TestPlatform.Utilities,版本=15.0.0.0 加载类型“Microsoft.VisualStudio.TestPlatform.Utilities.CodeCoverageRunSettingsProcessor” ,文化=中性,PublicKeyToken=b03f5f7f11d50a3a'。 在 Microsoft.VisualStudio.Coverage.DynamicCoverageDataCollector.OnInitialize(XmlElement configurationElement,IDataCollectionSink dataSink,IDataCollectionLogger 记录器)的 Microsoft.VisualStudio.Coverage.DynamicCoverageDataCollectorImpl.Initialize(XmlElement configurationElement)。 数据收集器“代码覆盖率”消息:数据收集器“代码覆盖率”在类型加载、构造或初始化期间引发异常:System.TypeLoadException:无法从程序集“Microsoft.VisualStudio.TestPlatform.Utilities.CodeCoverageRunSettingsProcessor”加载类型“Microsoft. TestPlatform.Utilities,版本=15.0.0.0,文化=中性,PublicKeyToken=b03f5f7f11d50a3a'。 在 Microsoft.VisualStudio.Coverage.DynamicCoverageDataCollectorImpl.Initialize(XmlElement configurationElement, IDataCollectionSink dataSink, IDataCollectionLogger logger) 在 Microsoft.VisualStudio.Coverage.DynamicCoverageDataCollector.OnInitialize(XmlElement configurationElement) 在 Microsoft.VisualStudio.TraceCollector.BaseDataCollector.Initialize(XmlElement configurationElement, IDataCollectionEvents 事件, IDataCollectionSink dataSink, IDataCollectionLogger logger, IDataCollectionAgentContext agentContext) 在 Microsoft.VisualStudio.TraceCollector.BaseDataCollector.Initialize(XmlElement configurationElement, DataCollectionEvents events, DataCollectionSink dataSink, DataCollectionLogger logger, DataCollectionEnvironmentContext environmentContext) 在 Microsoft.VisualStudio.TestPlatform.Common.DataCollector.DataCollectorInform () 在 Microsoft.VisualStudio.TestPlatform.Common.DataCollector.DataCollectionManager.LoadAndInitialize(DataCollectorSettings dataCol 讲师设置,字符串 settingsXml)..


编辑 8 月 10 日 #2

我尝试添加不同的 NuGet 包以查看是否可以使其正常工作,Microsoft.TestPlatform.ObjectModelMicrosoft.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

这感觉像是倒退了一步,然而,所有的测试都通过了,没有错误消息,所以这是值得高兴的。 但是....这是“完美”的解决方案吗?

从错误信息来看,您使用的 package 似乎存在一些问题。

我想分享我项目中的包。

项目.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 package 与代码覆盖率有关。 如果我删除这个 package,测试将失败。

顺便说一句,构建在Microsoft hosted agent: Windows-2019

更新:

使用Microsoft.NET.Test.Sdk版本进行测试:16.7.0。 我得到同样的问题。

在此处输入图像描述

您可以尝试以前的版本(例如 16.6.1)。

更新2:

Microsoft.NET.Test.Sdk版本 16.7.1 已发布以解决此问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM