问题如下:
我最近开始了一个新项目,他们有 28 个单元测试项目(使用 NUnit),其中许多仍然是 .NET Framework 4.7.2。他们有 3 个项目升级到 .NET 6,但现在它们不包含测试结果,并且在管道中不可用。在本地运行构建解决方案时,它确实会在本地生成正确的 trx 文件,但它也没有正确的 XML 元素。
从管道中,我可以下载包含所有 trx 文件的 TestResults zip,它们都适用于 4.7.2 项目,但是无法找到这 3 个 .NET 6 项目 trx 文件,如上所示。
这是我们关于测试结果发布的 YAML 配置:
## Publish test results
- task: PublishTestResults@2
displayName: Publish Test Results
condition: succeededOrFailed()
inputs:
testRunner: VSTest
testResultsFiles: Pipelines/TestResults/*.trx
mergeTestResults: true
testRunTitle: Test run for build $(Build.BuildNumber)
platform: Any CPU
configuration: Release
文件确实存在,但缺少某些 XML 元素,例如:“结果”、“测试定义”和“测试条目”。
这是“空”trx 文件的示例:
这是来自 4.7.2 项目之一的 trx 文件的正确示例:
如您所见,“正确”文件具有 XML 元素结果等。.NET 6 项目 trx 文件没有这些元素...有谁知道为什么以及如何将这些结果放入.NET 6 项目的 trx 文件?在 Visual Studio 中,测试确实运行并且正在运行!
编辑:
是的,通过 VS 测试资源管理器,一切似乎都正常。但是我发现,通过在项目文件夹本身中运行“dotnet test”,它将抛出以下错误“错误 CS0246:找不到类型或命名空间名称”(您是否缺少 using 指令或程序集参考?)”
所以我的项目 A 引用了安装了 Nugets 的项目 B,然后它抱怨项目 B 没有提到对 Nugets 的引用,但它们被引用了。代码会编译、构建等。但当我自己在目录中运行“dotnet test”时,似乎并非如此。
测试项目 A 是 net6.0,项目 B 是框架 4.7.2,并且引用了 Nuget,顺便说一句。 以及例如引用项目 B 的项目 D(框架 4.7.2 项目),如果您在其目录中运行“dotnet test”,则可以工作。
编辑2:
A (net6.0) → B (framework4.7.2) → C (framework4.7.2) 有 NUGET 包
⇒ 挪威克朗
A (net6.0) → C (framework4.7.2) 有 NUGET 包
⇒ 挪威克朗
A (framework4.7.2) → B (framework4.7.2) → C (framework4.7.2) 有 NUGET 包
⇒ 好的
A (net6.0) → net6.0 项目中安装的 NUGET
⇒ 好的
我找到了问题的答案!
问题在于他们的framework4.7.2项目在各自的.csproj文件中有一个“Exe”。这样做是因为他们使用了一些程序集重定向(遗留的东西),并且只能在 EXE 中完成,所以有人告诉我。当将一些项目升级到net6.0时,他们留下了“OutputType”。另一个团队的一些资深人士向我解释了这个问题,这与托管和非托管代码有关。 net6.0 项目您无法再运行 EXE(或者无法使用程序集重定向内容),因此我必须选择“.dll”文件并在这些文件上运行“dotnet test”。
而且它有效!在本地或在管道中对这些 net6.0 项目的特定“.dll”文件运行“dotnet test”确实会执行测试!然后对于旧项目我仍然去寻找 EXE 来运行。
如果其他人也有这个问题,希望这个解释有帮助!