如何使用来自 Rider 或 VS 2017 的 NUnit、xUnit 或 MSTest 测试 .NET Standard 2 库?
How to test .NET Standard 2 library with either NUnit, xUnit or MSTest from either Rider or VS 2017?
我有一个使用 Azure Durable Functions 的项目,它们仅在 .NET Standard 2 上可用。因此,它定义了可以在测试项目中使用哪个 class 库。但是,我无法将在 unit/integration 测试中使用 xUnit、NUnit 或 MSTest 的库放在一起。
将 NUnit 添加到 .NET Standard 2 为 class 库的项目失败并出现以下错误:
INFO: Restoring packages for
C:\VSTS\github.com\netstandardXunitMsTestNunit\src\Netstandard2xUnitMsTestnUnit\nunit\nunit.csproj...
DEBUG: Restoring packages for .NETStandard,Version=v2.0... DEBUG:
Resolving conflicts for .NETStandard,Version=v2.0... ERROR: Cycle
detected. nunit -> NUnit (>= 3.9.0). DEBUG: Checking compatibility
of packages on .NETStandard,Version=v2.0. DEBUG: Checking
compatibility for nunit 1.0.0 with .NETStandard,Version=v2.0.
xUnit 的错误是相同的(只是错误消息谈论的是 xUnit 循环)。
这两个错误也可以在 Rider 和 Visual Studio 2017 Enterprise 中重现。清理 nuget 缓存后,我再次尝试。结果是一样的
在 MsTest 的情况下,可以添加 ms 测试库,但测试发现既不工作 Rider 也不工作 Visual Studio。
是否可以对 .NET Standard 2 库进行单元测试?
除了等待这些项目采用 .NET Standard 2 之外,我还能做些什么吗?
I created a small sample project, can be found here: https://github.com/SayusiAndo/netstandard2xunitresharper
.NET Standard 没有运行时,因此它不会执行您的测试。
您的测试程序集必须针对可执行 平台,例如 .NET Framework 或 .NET Core 版本。
<TargetFramework>net470</TargetFramework>
或者
<TargetFramework>netcoreapp2.0</TargetFramework>
有关详细信息,请参阅 。
.NET Standard 是每个 .NET Standard 版本(例如 .NET Framework、.NET Core 和 Xamarin)定义的一组 API,所有 .NET 实现必须提供这些 API 以符合该版本。您的库的 TargetFramework 值为 netstandard2.0,这意味着您不仅可以从 .NET Core 应用程序引用逻辑库,还可以从为 .NET Framework 或 Xamarin 构建的应用程序引用逻辑库。
但是,您不能为其构建应用程序,只能构建库。这是 MSDN doc about .NET Standard.
因此,如果您想测试该库,您需要指定您的库支持的目标。如果你想支持多个 .NET 版本,那么你应该测试它们以确保你的库可以 运行 在这些目标上正确。这是.csproj
中目标框架的配置:
单一目标:
<TargetFramework>net461</TargetFramework>
多个目标:
<TargetFrameworks>netcoreapp2.0;net461</TargetFrameworks>
- 如果您的 class 库将由以 .Net Framework 4.6.1 为目标的应用程序使用,则在以 .Net Framework 4.6.1 为目标的同一解决方案中创建一个新的单元测试项目,以便您进行测试使用相同的框架组合。
- 在单元测试项目的引用下添加对class库项目的引用。
- 将 xUnit 和 xUnit.runner.visualstudio nuget 包添加到单元测试项目。
- 将单元测试 class 重命名为相关名称,并将 using MSTest 指令替换为 using XUnit。
- 开始编写和 运行 测试。(build/re-build 解决方案因此它会为每个新测试更新测试资源管理器中的测试列表)。
我最近发布了我的私有单元测试平台,它 .NETStandard 2.0
很好。除非您在测试中投入了大量时间和精力,否则您可能想看看 Nuclear.Test.
基本上,如果您将测试项目定位在 .NETStandard
,它将在 .NETFramework
和 .NETCore
过程中执行这些测试,以查看它们是否都正常工作。
不幸的是,目前它需要 .NETStandard 2.0
作为最小版本。幸运的是,这就是您正在使用的。
此解决方案既不是 NUnit 也不是 xUnit 也不是 MSTest,但它会完全按照您的描述进行操作。
我有一个使用 Azure Durable Functions 的项目,它们仅在 .NET Standard 2 上可用。因此,它定义了可以在测试项目中使用哪个 class 库。但是,我无法将在 unit/integration 测试中使用 xUnit、NUnit 或 MSTest 的库放在一起。
将 NUnit 添加到 .NET Standard 2 为 class 库的项目失败并出现以下错误:
INFO: Restoring packages for C:\VSTS\github.com\netstandardXunitMsTestNunit\src\Netstandard2xUnitMsTestnUnit\nunit\nunit.csproj... DEBUG: Restoring packages for .NETStandard,Version=v2.0... DEBUG: Resolving conflicts for .NETStandard,Version=v2.0... ERROR: Cycle detected. nunit -> NUnit (>= 3.9.0). DEBUG: Checking compatibility of packages on .NETStandard,Version=v2.0. DEBUG: Checking compatibility for nunit 1.0.0 with .NETStandard,Version=v2.0.
xUnit 的错误是相同的(只是错误消息谈论的是 xUnit 循环)。
这两个错误也可以在 Rider 和 Visual Studio 2017 Enterprise 中重现。清理 nuget 缓存后,我再次尝试。结果是一样的
在 MsTest 的情况下,可以添加 ms 测试库,但测试发现既不工作 Rider 也不工作 Visual Studio。
是否可以对 .NET Standard 2 库进行单元测试?
除了等待这些项目采用 .NET Standard 2 之外,我还能做些什么吗?
I created a small sample project, can be found here: https://github.com/SayusiAndo/netstandard2xunitresharper
.NET Standard 没有运行时,因此它不会执行您的测试。
您的测试程序集必须针对可执行 平台,例如 .NET Framework 或 .NET Core 版本。
<TargetFramework>net470</TargetFramework>
或者
<TargetFramework>netcoreapp2.0</TargetFramework>
有关详细信息,请参阅
.NET Standard 是每个 .NET Standard 版本(例如 .NET Framework、.NET Core 和 Xamarin)定义的一组 API,所有 .NET 实现必须提供这些 API 以符合该版本。您的库的 TargetFramework 值为 netstandard2.0,这意味着您不仅可以从 .NET Core 应用程序引用逻辑库,还可以从为 .NET Framework 或 Xamarin 构建的应用程序引用逻辑库。
但是,您不能为其构建应用程序,只能构建库。这是 MSDN doc about .NET Standard.
因此,如果您想测试该库,您需要指定您的库支持的目标。如果你想支持多个 .NET 版本,那么你应该测试它们以确保你的库可以 运行 在这些目标上正确。这是.csproj
中目标框架的配置:
单一目标:
<TargetFramework>net461</TargetFramework>
多个目标:
<TargetFrameworks>netcoreapp2.0;net461</TargetFrameworks>
- 如果您的 class 库将由以 .Net Framework 4.6.1 为目标的应用程序使用,则在以 .Net Framework 4.6.1 为目标的同一解决方案中创建一个新的单元测试项目,以便您进行测试使用相同的框架组合。
- 在单元测试项目的引用下添加对class库项目的引用。
- 将 xUnit 和 xUnit.runner.visualstudio nuget 包添加到单元测试项目。
- 将单元测试 class 重命名为相关名称,并将 using MSTest 指令替换为 using XUnit。
- 开始编写和 运行 测试。(build/re-build 解决方案因此它会为每个新测试更新测试资源管理器中的测试列表)。
我最近发布了我的私有单元测试平台,它 .NETStandard 2.0
很好。除非您在测试中投入了大量时间和精力,否则您可能想看看 Nuclear.Test.
基本上,如果您将测试项目定位在 .NETStandard
,它将在 .NETFramework
和 .NETCore
过程中执行这些测试,以查看它们是否都正常工作。
不幸的是,目前它需要 .NETStandard 2.0
作为最小版本。幸运的是,这就是您正在使用的。
此解决方案既不是 NUnit 也不是 xUnit 也不是 MSTest,但它会完全按照您的描述进行操作。