PackageReference 迁移后,SpecFlow 测试不再出现在 Visual Studio 2019 Test Explorer 中
SpecFlow tests no longer appear in Visual Studio 2019 Test Explorer after PackageReference migration
我最近将我公司的遗留应用程序从 packages.config 迁移到 PackageReferences。我们有 5 个项目:主要 ASP.NET 网络应用程序、一个 SQL 连接器模型项目、一个 xUnit 测试项目、一个 FluentAssertions 测试项目和一个 SpecFlow 项目(不,我没有设置这一切) .我当前的目标是移动所有 packages.config 以在 csproj 文件的 PackageReference 中正确使用 NuGet,以便最终从 .NET Framework 4.6.1 迁移到 .NET Core。不幸的是,我们还没有为这样的举动做好准备。
我已经完成了所有项目的迁移。通过一些摆弄,它们全部构建并且大多数 运行 正确。我们的 Web 项目构建和 运行s(我们仍然需要适当的冒烟测试,但到目前为止看起来不错)。我们的 FluentAssertions 和 XUnit 项目也可以完美地构建和 运行 他们所有的测试。我们确实有一些警告,但是比这次迁移之前少了。
SpecFlow 测试不起作用。具体来说,SpecFlow 测试不会在 Visual Studio 2019 年自动填充到测试资源管理器中。它们是在这次迁移之前。在我们的自动构建过程中,我们需要这些测试 运行(目前)。我们正在分阶段修复我们的技术债务。
我在过去几天进行了在线调查,可以对我们的 SpecFlow 项目做出以下声明:
- 我们在扩展中添加了 NUnit3,它似乎“正在运行”。与 Visual Studio 2019 扩展的 SpecFlow 相同。
- 我们拥有迁移之前的所有 NUnit3、MSTest 和 SpecFlow NuGet 包(在相同版本中)作为 NuGet 引用 post-迁移。
- 如果我 运行 来自项目上下文菜单的测试,它说有 0 个测试 运行。
Executing all tests in project: MyCompany.Specs
========== Starting test run ==========
========== Test run finished: 0 Tests (0 Passed, 0 Failed, 0 Skipped) run in < 1 ms ==========
- 我在工具->选项->SpecFlow 菜单中打开了 SpecFlow 跟踪。
- 我重新安装了 NUnit3 扩展很多次。
- 我已经删除了 csproj 文件中的
<Target Name="EnsureNuGetPackageBuildImports" >
标记以构建它,因为我确实有 NuGet 包。显然,迁移后,这个标签和子元素是不需要的,因为包是集中的。
- 我的 csproj 文件中确实有导入标签:
<Import Project="..\packages\MSTest.TestAdapter.2.0.0\build\net45\MSTest.TestAdapter.props" Condition="Exists('..\packages\MSTest.TestAdapter.2.0.0\build\net45\MSTest.TestAdapter.props')" />
<Import Project="..\packages\NUnit3TestAdapter.3.10.0\build\net35\NUnit3TestAdapter.props" Condition="Exists('..\packages\NUnit3TestAdapter.3.10.0\build\net35\NUnit3TestAdapter.props')" />
- 清理并重建项目或解决方案无效。另一个项目构建并 运行 他们的测试正确。
Specs 项目中的 - App.config 在 ConfigSection 中有以下标记:
<section name="specFlow" type="TechTalk.SpecFlow.Configuration.ConfigurationSectionHandler, TechTalk.SpecFlow" />
...并且在配置文件的下方有以下部分:
<specFlow>
<!-- For additional details on SpecFlow configuration options see http://go.specflow.org/doc-config -->
<unitTestProvider name="NUnit" />
</specFlow>
知道为什么 SpecFlow 测试不再显示在测试资源管理器中吗?我还应该检查什么来诊断这个问题吗?从 packages.config 迁移到 PackageReference 时,SpecFlow 是否存在已知问题?
如果您仍然拥有 NUnit Visual Studio 测试适配器的 Visual Studio 扩展 (VSIX)(从您的评论“我们在Extensions"),您需要禁用或删除它。 VSIX 适配器将在 Nuget 打包适配器上使用,并导致与 Nuget 打包适配器发生冲突。 VSIX 扩展也不应该在 VS 2017 或更高版本中使用。您可以检查主菜单 -> 工具 -> 扩展和更新并查找 Nunit3TestAdapter。
使用 VSIX 扩展是使用测试适配器和运行器的旧方法。它是
脆弱,因为你在 VS 中安装了一个需要的版本
支持许多不同的项目和 VS 扩展框架
与构建生命周期的笨拙挂钩非常复杂。
新方法是将测试适配器和运行器打包为 NuGet 包。无需安装任何东西,Visual Studio 会为您的项目找到 version-specific 测试适配器和运行程序库,以及您的测试程序集。你需要
使用一个或另一个,现在首选 Nuget 包,否则 Visual Studio 会与你作对,你会遇到与你所看到的类似的问题。
Visual Studio Test Explorer 缓存有时会失控。尝试关闭 Visual Studio 的所有副本并清理其位于 C:\Users{$username}\AppData\Local\Temp\VisualStudioTestExplorerExtensions\
的临时文件和文件夹
您可能 运行 遇到以下问题:测试过程 运行 在测试发现编排期间选择了适配器或其他库的错误架构。尝试更改测试的默认处理器架构(主菜单测试 -> 测试设置)。尝试将 x86 更改为 x64,反之亦然。
谢谢@Dude0001 的回答。这是部分正确的,但不是全部。
当您将 SpecFlow 项目从 packages.config 迁移到 PackageReference 时,您正在将本地 NuGet 包和设置换成 NuGet 中的全局设置,因此,我们不再需要 SpecFlow 的 VSIX 扩展(如上所述 Dude0001)。
除此之外,我还必须删除 App.config 中的所有配置和导入语句的 csproj 文件,以及专门针对 specflow 的其他配置。您不需要指定您使用 SpecFlow(在我的例子中是 NUnit)的测试 运行ner。
此外,我必须将 NUnit 和 SpecFlow 及其支持的 NuGet 包更新到 .NET Framework 4.6.1 的最新版本。
所有这些结合起来使我成功地找到了测试并运行它们正确地像迁移之前那样。
我最近将我公司的遗留应用程序从 packages.config 迁移到 PackageReferences。我们有 5 个项目:主要 ASP.NET 网络应用程序、一个 SQL 连接器模型项目、一个 xUnit 测试项目、一个 FluentAssertions 测试项目和一个 SpecFlow 项目(不,我没有设置这一切) .我当前的目标是移动所有 packages.config 以在 csproj 文件的 PackageReference 中正确使用 NuGet,以便最终从 .NET Framework 4.6.1 迁移到 .NET Core。不幸的是,我们还没有为这样的举动做好准备。
我已经完成了所有项目的迁移。通过一些摆弄,它们全部构建并且大多数 运行 正确。我们的 Web 项目构建和 运行s(我们仍然需要适当的冒烟测试,但到目前为止看起来不错)。我们的 FluentAssertions 和 XUnit 项目也可以完美地构建和 运行 他们所有的测试。我们确实有一些警告,但是比这次迁移之前少了。
SpecFlow 测试不起作用。具体来说,SpecFlow 测试不会在 Visual Studio 2019 年自动填充到测试资源管理器中。它们是在这次迁移之前。在我们的自动构建过程中,我们需要这些测试 运行(目前)。我们正在分阶段修复我们的技术债务。
我在过去几天进行了在线调查,可以对我们的 SpecFlow 项目做出以下声明:
- 我们在扩展中添加了 NUnit3,它似乎“正在运行”。与 Visual Studio 2019 扩展的 SpecFlow 相同。
- 我们拥有迁移之前的所有 NUnit3、MSTest 和 SpecFlow NuGet 包(在相同版本中)作为 NuGet 引用 post-迁移。
- 如果我 运行 来自项目上下文菜单的测试,它说有 0 个测试 运行。
Executing all tests in project: MyCompany.Specs
========== Starting test run ==========
========== Test run finished: 0 Tests (0 Passed, 0 Failed, 0 Skipped) run in < 1 ms ==========
- 我在工具->选项->SpecFlow 菜单中打开了 SpecFlow 跟踪。
- 我重新安装了 NUnit3 扩展很多次。
- 我已经删除了 csproj 文件中的
<Target Name="EnsureNuGetPackageBuildImports" >
标记以构建它,因为我确实有 NuGet 包。显然,迁移后,这个标签和子元素是不需要的,因为包是集中的。 - 我的 csproj 文件中确实有导入标签:
<Import Project="..\packages\MSTest.TestAdapter.2.0.0\build\net45\MSTest.TestAdapter.props" Condition="Exists('..\packages\MSTest.TestAdapter.2.0.0\build\net45\MSTest.TestAdapter.props')" />
<Import Project="..\packages\NUnit3TestAdapter.3.10.0\build\net35\NUnit3TestAdapter.props" Condition="Exists('..\packages\NUnit3TestAdapter.3.10.0\build\net35\NUnit3TestAdapter.props')" />
- 清理并重建项目或解决方案无效。另一个项目构建并 运行 他们的测试正确。 Specs 项目中的
- App.config 在 ConfigSection 中有以下标记:
<section name="specFlow" type="TechTalk.SpecFlow.Configuration.ConfigurationSectionHandler, TechTalk.SpecFlow" />
...并且在配置文件的下方有以下部分:
<specFlow>
<!-- For additional details on SpecFlow configuration options see http://go.specflow.org/doc-config -->
<unitTestProvider name="NUnit" />
</specFlow>
知道为什么 SpecFlow 测试不再显示在测试资源管理器中吗?我还应该检查什么来诊断这个问题吗?从 packages.config 迁移到 PackageReference 时,SpecFlow 是否存在已知问题?
如果您仍然拥有 NUnit Visual Studio 测试适配器的 Visual Studio 扩展 (VSIX)(从您的评论“我们在Extensions"),您需要禁用或删除它。 VSIX 适配器将在 Nuget 打包适配器上使用,并导致与 Nuget 打包适配器发生冲突。 VSIX 扩展也不应该在 VS 2017 或更高版本中使用。您可以检查主菜单 -> 工具 -> 扩展和更新并查找 Nunit3TestAdapter。
使用 VSIX 扩展是使用测试适配器和运行器的旧方法。它是 脆弱,因为你在 VS 中安装了一个需要的版本 支持许多不同的项目和 VS 扩展框架 与构建生命周期的笨拙挂钩非常复杂。 新方法是将测试适配器和运行器打包为 NuGet 包。无需安装任何东西,Visual Studio 会为您的项目找到 version-specific 测试适配器和运行程序库,以及您的测试程序集。你需要 使用一个或另一个,现在首选 Nuget 包,否则 Visual Studio 会与你作对,你会遇到与你所看到的类似的问题。
Visual Studio Test Explorer 缓存有时会失控。尝试关闭 Visual Studio 的所有副本并清理其位于 C:\Users{$username}\AppData\Local\Temp\VisualStudioTestExplorerExtensions\
的临时文件和文件夹您可能 运行 遇到以下问题:测试过程 运行 在测试发现编排期间选择了适配器或其他库的错误架构。尝试更改测试的默认处理器架构(主菜单测试 -> 测试设置)。尝试将 x86 更改为 x64,反之亦然。
谢谢@Dude0001 的回答。这是部分正确的,但不是全部。
当您将 SpecFlow 项目从 packages.config 迁移到 PackageReference 时,您正在将本地 NuGet 包和设置换成 NuGet 中的全局设置,因此,我们不再需要 SpecFlow 的 VSIX 扩展(如上所述 Dude0001)。
除此之外,我还必须删除 App.config 中的所有配置和导入语句的 csproj 文件,以及专门针对 specflow 的其他配置。您不需要指定您使用 SpecFlow(在我的例子中是 NUnit)的测试 运行ner。
此外,我必须将 NUnit 和 SpecFlow 及其支持的 NuGet 包更新到 .NET Framework 4.6.1 的最新版本。
所有这些结合起来使我成功地找到了测试并运行它们正确地像迁移之前那样。