.net - 考虑到目标之间的实现差异,如何正确地对具有多个目标框架的 .NET 项目进行单元测试?

标签 .net unit-testing .net-core visual-studio-2017 .net-standard

考虑一个面向以下框架的 .NET 类库:

  • .NET 框架 2.0
  • .NET 框架 4.6
  • .NET 标准 1.0
  • .NET 标准 1.3
  • .NET 可移植 Profile336

  • 让我们不要立即担心为什么这是目标框架的确切列表。

    假设跨所有目标框架的外部 API 相同,但是 每个单独的目标框架都有一些该框架独有的代码,我如何正确编写涵盖所有目标框架代码的单元测试?

    我正在运行 Visual Studio 2017 社区。

    我在 GitHub 上制作了一个现成的最小示例,到目前为止我发现这可能是我现在能做的最好的:https://github.com/airbreather/MultiTargetDemo ,但这感觉不是正确的方法。一些缺陷:
  • 每个目标框架都需要一个单独的 .csproj 文件,其中包含大量复制粘贴。
  • 使用名为 ReferringTargetFrameworkForProjectReferences 的未充分记录的* 属性.
  • *这有点轻描淡写......目前在谷歌上搜索它,除了微软的 SDK 之外,几乎什么都没有出现。
  • 似乎无法与 .NET Standard 垫片一起正常工作(此处的 .NET Standard 1.3 在运行时抛出试图查找 System.IO.FileSystem )。 (编辑:想通了,这是 corefx issue #16322 ,它有一点 awkward workaround )。

  • 上面链接中的库正好有一个公共(public)类,上面正好有一个公共(public)实例方法。该方法有契约(Contract)义务只返回 32 位整数值 3,但它在每个目标上以完全不同的方式计算 3。显然,实际用例围绕着实现更多“有趣”的方法,但这足以进行对话。

    此外,请注意,该库中的测试类实际上自己使用了一些并非在所有目标平台上都可用的东西:System.Threading.Tasks.Task<TResult>在 .NET Framework 2.0 上不可用...这只是测试本身可能用于其自身目的的任何东西的代理,这些东西可能不一定在正在测​​试的目标框架中可用。

    实际用例是NetTopologySuite ,它已经针对多个全框架平台和一些 PCL;有一个year-old issue要求使其与 .NET Core 一起工作。我一直在断断续续地尝试实现这一目标大约一个月,我终于跌跌撞撞地遇到了这个问题。

    我发现了另一个问题:Unit testing code targeting several frameworks at once with .NET Core and xUnit ,确实和这个类似。这有几个不同的原因:
  • 该问题是使用 VS2015 时代的预览 SDK 工具 (project.json)。这个问题是指带有漂亮.csproj 的VS2017 时代的非预览工具。文件和所有。
  • 这个问题可以通过简单地对测试项目本身进行多目标来解决,每个“被测对象”所针对的框架都有一个“测试”目标框架。似乎无法以类似的方式解决此问题,尤其是对于不寻常的 Profile336 目标。
  • 此外,鉴于完整的 .NET Framework 4.6 可以引用针对列出的五个目标框架中的任何一个的程序集,我应该没有必要将基本测试类的实现限制为在任何交叉点中可用的内容为此选择的目标框架的抓包。
  • 我确实尝试了一种技巧,比如在 TargetFrameworks 中列出合成的东西喜欢 test1;test2;test3;test4;test5然后强制 TargetFrameworkIdentifier + TargetFrameworkVersion到 .NETFramework + 4.6,但我没有取得多大成功(尝试获取 xunit 包时失败)。我也没试过然而,对此很难。
  • 最佳答案

    一、测试项目可以多目标也可以使用 <TargetFrameworks>就像您用于图书馆的属性(property)一样。虽然 VS 测试运行器当前只显示/运行一个框架(具体来说是第一个),但任何对 dotnet test 的调用将执行所有框架(xunit 也在开发自定义控制台运行器 - dotnet xunit - 以获得更好的控制台 UX)。

    还要记住,测试项目需要指定具有 的目标框架。运行时 .因此,您的测试项目可以针对 netcoreapp*net*但从不netstandard*因为它没有关联的运行时来运行测试。自从 Microsoft.NET.Tests.Sdk 以来,我不确定可移植目标。曾经测试项目需要引用以获得测试运行器支持不具备 NETPortable 的条件。

    所以你需要选择net的所有版本和 netcoreapp您需要测试/支持 - 例如net20;net45;net46;netcoreapp1.0将涵盖您所有的 .net 框架和 .net 核心版本。

    有一种方法可以通过设置 Properties="TargetFramework=netstandard1.3" 来强制依赖特定的目标框架。在 <ProjectReference>元素,但这对于恢复和多目标可能很难正常工作。

    关于.net - 考虑到目标之间的实现差异,如何正确地对具有多个目标框架的 .NET 项目进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44477840/

    相关文章:

    java - 如何在Spring boot Web应用程序方法的这个测试用例中省略NullPointerException?

    docker - Visual Studio Dockerfile EntryPoint 覆盖解释?

    c# - .NET Core API 多行记录输出

    .net - 在 Windows XP 上开发 Windows Phone 7

    c# - 2 WCF 服务和 c# 线程

    php - 单元测试套接字

    c# - .NET Core Socket.BeginAccept 丢失

    c# - Json.NET 的 Pascal 大小写动态属性

    c# - 双缓冲图形的 AccessViolationException

    java - 用于数据库代码的 JUnit