Я могу успешно запустить модульные тесты VS из командной строки (и, следовательно, из сборки на машине сборки).
VSTest.Console.EXE "MyTest.dll" /logger:trx /platform:x64 /inIsolation
Я также могу отфильтровать любые необходимые тесты, которые я не хочу выполнять в определенной среде, с помощью опции /TestCaseFilter:
VSTest.Console.EXE "MyTest.dll" /TestCaseFilter:Name!=Verify_DigitallySigned
Это необходимо, чтобы нет запускал тест(ы) "проверить наличие цифровой подписи".
Таким образом, я могу отфильтровать необходимый набор тестовых случаев.
Однако я хочу, чтобы модульный тест знал, не требуются ли определенные тесты (утверждения). Например, передать аргумент "/DontTestSigning". Таким образом, модульные тесты (написанные на C++ или C#) увидят такой параметр/опцию и не будут выполнять дополнительные утверждения, что предотвратит сбои сборки на ненастоящих сборках (например, на сборках PR).
Я вижу, что есть опция /testsettings с VSTest.Console.exe (а также с MSTest.exe), но я не уверен, как (IF) это можно применить и сообщить фактическим тестовым функциям о некоторых «не делать» вариант.
Единственный подход, который я предусмотрел, - это переменная среды. Ищем лучший вариант
Управление несколькими переменными среды было бы слишком. Я бы предпочел сохранить файл xml/json, чтобы иметь пары ключевых значений, такие как (TestCase, параметр, чтобы решить, следует ли пропустить конкретное утверждение), чтобы сделать его более гранулированным. Лебедка вспомогательного класса анализирует и помогает в достижении условия должна быть написана и может использоваться для пропуска утверждений.





По сути, вы должны иметь в своем тесте только один Assert, чтобы каждый тест проверял одна единственная вещь.
Итак, то, что у вас есть, похоже на это, я полагаю:
[Test]
public void MyTest()
{
Assert.That(...);
Assert.That(...);
Assert.That(...);
}
Когда вы хотите исключить, например. второй Assert, вы, конечно, должны предоставить некоторую функциональность в вашем коде для выполнения или не выполнения этих строк, например:
public void MyTest()
{
Assert.That(...);
if (executeSecondAssert)
Assert.That(...);
Assert.That(...);
}
Вы можете ввести некоторый переключатель компиляции, который устанавливает значение для вышеуказанного логического флага:
#if (EXECUTE_ASSERT)
bool executeSecondAssert = true;
#else
bool executeSecondAssert = false;
а теперь предоставьте этот переключатель компиляции через переменную среды.
Это потребует настройки переключателей компилятора/препроцессора для разных сборок. Тогда код не будет общим.
Даже я бы предпочел одиночные утверждения. Но это не всегда так. Хорошие тестовые примеры требуют успешного выполнения нескольких строк утверждений, прежде чем фактический тест будет успешным. Производительность и общее время сборки являются одной из причин, среди прочих. Следовательно, условные прогоны некоторых тестовых случаев требуются для нескольких тестов с моей стороны.
Вы также можете предоставить файл .runsettings процессу vstest.console, как указано здесь. https://docs.microsoft.com/visualstudio/test/configure-unit-tests-by-using-a-dot-runsettings-file?view=vs-2019.
Чтобы указать пользовательские параметры, измените раздел TestRunParameters, например:
<!-- Parameters used by tests at runtime -->
<TestRunParameters>
<Parameter name = "executeAsserts" value = "1,2,3" />
</TestRunParameters>
Доступ к этим параметрам теперь можно получить с помощью этого кода:
TestContext.Properties["executeAsserts"];
так что ваш окончательный тестовый код может выглядеть так:
[Test]
public void MyTest()
{
var assertsToRun = TestContext.Properties["executeAsserts"].Split(",").Select(x => Convert.ToInt(x)).ToArray();
if (assertsToRun.Contains(1)
Assert.That(...);
if (assertsToRun.Contains(2)
Assert.That(...);
if (assertsToRun.Contains(3)
Assert.That(...);
}
Вы должны иметь возможность запустить тест, используя следующую команду:
vstest.console.exe MyTestAssembly.dll /Settings:MySettings.runsettings
что-то вроде
if (executeTheTest) Assert.That(...)? Сказав это, нет никакого способа указать извне ваших тестов, какие строки кода должны фактически выполняться. Это ничем не отличается от любой написанной вами программы. Сама программа, безусловно, нуждается в каком-то переключателе, например. сверившись сexecuteTheTest.