如何正确实现 .net 标准库的单元测试

How to correctly implement unit tests for .net Standard Library

据我的研究了解。 .net 标准库不能单独使用,因此需要通过不同的框架进行测试,无论是 .net Framework 还是 .net Core 。我就是这么解释的。 现在我正在尝试创建一个标准库,因为我需要它尽可能兼容大多数设备,问题是我不知道如何正确创建单元测试。每次创建 MSTest 项目时,我都会收到以下错误:

Test run will use DLL(s) built for framework .NETCoreApp,Version=v1.0 and platform X64. Following DLL(s) do not match framework/platform settings. Otchi.Ebml.Tests.dll is built for Framework 2.1 and Platform AnyCPU.

我对不同的体系结构和其他设置进行了很多试验,但似乎无法消除该警告。我是在做错什么,还是有不同的、更合适的方法来为标准库创建单元测试

.NET 标准库不包含执行所需的组件。它只定义了执行模式。当您部署到特定的机器/处理器架构时,代码必须知道要执行的指令集。

这就是 .NET 框架和 .NET 核心发挥作用的地方。 .NET 框架包含 Microsoft Windows 操作系统支持的指令集的执行细节。同样,.NET 核心包含 Windows 本身不支持的其他体系结构的指令集。

要编写单元测试,您需要在 .NET 或 .NET 核心中创建一个新项目来执行您的代码。如果您想涵盖所有基础,或者如果您有一些针对不同体系结构编译不同的二进制文件(想到第三方库),那么您可能需要对多个发行版进行单元测试。

您的图书馆应该是一个独立的图书馆。您应该在更新库之前执行单元测试,以验证输入库的代码是否通过。这样以后使用该库的任何人都可以确信它会工作。

为面向 .NETStandard 的库编写单元测试很棘手,因为您必须针对所选 .NETStandard 版本的各种实现来测试您的代码。 正如 所述,这是因为 .NETStandard 仅定义了随后在实际平台中实现的类型。

最常见的问题是跨各种平台(如 .NETFramework、.NETCore、Mono 等)的实现差异。 然而,不同版本平台的实现也存在差异,这些差异可能会扰乱您的库在所述平台上的工作方式(参见 this example)。

这就是为什么 运行 您在实现您选择的 .NETStandard 版本的平台的最低版本上进行的测试没有完全成功的原因。 您必须考虑您的库可以使用的所有运行时。

一般来说,您有两种选择来解决这个问题。

选项 1

使用 为所有有效运行时构建单元测试项目。 这也意味着您的单元测试项目必须有一组非常大的目标框架,只要发布新版本的平台,就必须对其进行扩展。

如果您想涵盖所有相关场景,那么您将拥有 dozens of target frameworks 以及正在构建的单元测试项目的多个版本。 让我们假设这会很快失控。

选项 2

使用可以按设计实际处理 .NETStandard 的单元测试平台。 为 .NETStandard 构建单元测试并在匹配的运行时执行这些测试将降低测试项目的复杂性。

时至今日,大多数单元测试平台都无法做到这一点,您只能使用选项 1。 适合这种方法并实际解决您问题的方法是 Nuclear.Test.

Please note that Nuclear.Test requires .NETStandard 2.0 and only handles .NETFramework and .NETCore in its current release. This is subject to change however and i'm working on reducing the required version of .NETStandard to 1.0 and include test workers for Mono and UWP as well.