1

我已阅读您是否将单元测试放在同一个项目或另一个项目中的答案?当时(大约 10 年前)的共识是将单元测试与他们正在测试的代码放在一个单独的项目中。给出的主要原因是避免部署非生产代码,这是相当合理的。

从那以后事情发生了很大的变化,至少对于基于 JavaScript 的项目来说,将我们的测试放在代码旁边是常态,而且实际上大多数人认为这是非常可取的。但我不会在这里讨论优势,因为这不是这个问题的意义所在。

假设我们想为 C# 做同样的事情,但仍然避免将测试代码部署到 prod,我们可以在 IL 级别编织一些编译后的魔法,以作为构建过程的一部分从二进制文件中剥离测试吗?例如,我们可以从具有该[TestFixture]属性的二进制文件中搜索并销毁所有类吗?

我们可以利用 Roslyn 的某些特性来实现同样的目标吗?

或者,我们可以采取其他方法吗?

4

1 回答 1

5

一种选择是使用MSBuild 条件从最终构建中排除测试文件。

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFrameworks>netstandard2.0</TargetFrameworks>
  </PropertyGroup>

  <ItemGroup>
    <Compile Condition=" '$(Configuration)' == 'Release' " Remove="Test\**\*.cs" />
  </ItemGroup>

</Project>

这一切都可以通过使用 glob 的单个语句来完成,这比必须#if DEBUG在每个测试文件中放置一个语句更简单。

当然,这意味着您需要在测试后再次构建以应用条件编译,这实际上意味着在Release模式中应用的更改未经测试。由于浮点舍入错误和其他编译器优化没有经过测试,您可能会错过测试中的一些重要内容。

注意:与 JavaScript 中的情况不同,.NET 中非常希望将测试代码与生产代码分开,这样您就不必在部署前重新编译,从而有效地否定您可能已经完成的任何测试。

于 2018-03-07T11:39:54.700 回答