Модульные тесты C# и код в той же папке: вырезать тесты из скомпилированного двоичного файла

Я прочитал ответы на вопросы. Вы ставите модульные тесты в том же или другом проекте? и тогда (почти 10 лет назад) был достигнут консенсус - поставить модульные тесты в отдельный проект от кода, который они тестируют. Основная причина заключается в том, чтобы избежать развертывания непроизводственного кода, что вполне разумно.

С тех пор многое изменилось, и, по крайней мере, для проектов, основанных на JavaScript, наши тесты рядом с кодом являются нормой, и, действительно, большинство считает это крайне желательным. Но я не буду вдаваться в преимущества здесь, поскольку это не то, о чем этот вопрос.

Предполагая, что мы хотим того же самого для C#, но по-прежнему избегая развертывания тестового кода в prod, есть ли какая-то магия после компиляции, которую мы можем сплести на уровне IL, чтобы вырезать тесты из двоичного файла как часть процесса сборки? Например, можем ли мы искать и уничтожать все классы из двоичного файла с помощью [TestFixture] атрибут?

Можем ли мы использовать некоторую особенность Roslyn, чтобы достигнуть того же самого?

В качестве альтернативы, есть ли другой подход, который мы можем использовать?

1 ответ

Одним из вариантов является использование условий MSBuild для исключения тестовых файлов из окончательной сборки.

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

  <PropertyGroup>
    <TargetFrameworks>netstandard1.3</TargetFrameworks>
  </PropertyGroup>

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

</Project>

Все это может быть сделано с помощью одного оператора с использованием globs, что проще, чем указание #if DEBUG утверждение в каждом тестовом файле.

Конечно, это означает, что вам нужно строить заново после тестирования.

ПРИМЕЧАНИЕ. В отличие от сценария JavaScript, в.NET крайне желательно отделять тестовый код от производственного кода, чтобы вам не приходилось перекомпилировать его перед развертыванием, что фактически сводит на нет все тесты, которые вы могли выполнить.

Другие вопросы по тегам