【问题标题】:How do you run unit tests for a specific target framework in Visual Studio 2017/2019?如何在 Visual Studio 2017/2019 中为特定目标框架运行单元测试?
【发布时间】:2017-04-22 00:51:19
【问题描述】:

我真的很喜欢新的.csproj 格式。这比那个可怕的(有限的)project.json好多了。

但是,我正在努力解决一件事。我已将我的(多个)测试项目合并为一个多目标项目。

<TargetFrameworks>netcoreapp1.0;net40;net35</TargetFrameworks>

但是,Visual Studio 的测试资源管理器中似乎没有任何工具来选择目标框架——它总是只运行第一个框架。我找到了一种解决方法 - 添加具有特定框架的 &lt;TargetFramework&gt; 元素...

<TargetFramework>net35</TargetFramework>

但是,有什么方法可以选择目标框架而无需手动编辑 MSBuild (.csproj) 文件?我正在 GUI 中寻找一些选项来执行此操作 - 特别是我不必记住编辑 .csproj 文件以便在调试测试之前切换框架或记住必须在发布之前删除此行.

【问题讨论】:

    标签: c# .net visual-studio visual-studio-2017 multitargeting


    【解决方案1】:

    我知道这个问题是关于 VS 的,但我发现在&lt;TargetFrameworks&gt; 节点中针对多个框架dotnet tests 命令will run tests for all frameworks 时很有用:

    > dotnet test
    ...
    Test run for [projectPath]\bin\Debug\netcoreapp1.1\XUnitTestProject.dll(.NETCoreApp,Version=v1.1)
    ...
    Test run for [projectPath]\bin\Debug\net461\XUnitTestProject.dll(.NETFramework,Version=v4.6.1)
    ...
    

    NCrunch 还可以识别多个目标并自动为每个目标运行测试:

    【讨论】:

    • 可能对某些人有用,但对调试毫无用处 - 特别是如果您有一个库并且唯一的调试方法是在 Visual Studio 中运行测试。
    • @NightOwl888,看起来 VS 目前没有 UI。试试 NCrunch - 优秀的单元测试工具,它支持通过右键单击测试覆盖的代码行进行调试。
    • 谢谢,但是这个产品有no open source licensing。我们需要支持任何愿意加入我们团队的人,而 NCrunch 的许可不符合该要求。
    【解决方案2】:

    目前最好的选择是更改目标框架在 csproj 中的顺序。

    <PropertyGroup>
        <TargetFrameworks>netcoreapp2.1;net45;net46;net461;net462;net47</TargetFrameworks>
    </PropertyGroup>
    

    如果要调试 net45 框架的单元测试,您需要将其更改为:

    <PropertyGroup>
        <TargetFrameworks>net45;net46;net461;net462;net47;netcoreapp2.1</TargetFrameworks>
    </PropertyGroup>
    

    在 Visual Studio 中执行此操作的 UI 实现起来相对简单,但截至此答案他们还没有这样做。

    【讨论】:

    • 这似乎比使用TargetFramework 来做这件事还要糟糕。无论哪种方式,我都无法手动编辑项目文件,而不仅仅是从 UI 中选择要运行的测试,并且在构建服务器上,必须覆盖 MSBuild 配置元素。但如果你在 Visual Studio 中创建一个 VSIX 扩展来执行此操作,我一定会下载它。
    【解决方案3】:

    事实证明,微软终于在 Visual Studio 2019 中修复了这个问题(不确定具体时间)。

    如果指定多个目标框架:

    <TargetFrameworks>netcoreapp2.1;net451</TargetFrameworks>
    

    GUI 现在显示:

    并允许您一次在所有目标平台上运行测试。

    【讨论】:

      【解决方案4】:

      使用“或”运算符在运行设置文件中使用 TargetFrameWorkVersion。

      【讨论】:

      • 你能举个例子吗?另外,我希望在 GUI 中有一些东西,因为我已经有了一个 hacky 的解决方法。
      • 看起来 .runsettings 文件仅支持 Framework35、Framework40、Framework45 值,不支持 .NET Core。
      猜你喜欢
      • 2011-05-23
      • 1970-01-01
      • 1970-01-01
      • 2012-10-06
      • 1970-01-01
      • 1970-01-01
      • 2014-10-03
      • 2018-08-18
      • 1970-01-01
      相关资源
      最近更新 更多