Мне нужно провести модульное тестирование некоторых функций библиотеки, включающих связь SSH с серверами Linux и Windows.
У меня есть файл test_config.json
, предоставленный пользователем. Эта конфигурация в основном содержит два свойства:
public ServerConfig? TestServerLinux { get; set; }
public ServerConfig? TestServerWindows { get; set; }
И вот проблема, с которой я столкнулся: эти тесты будут запускаться только локально, а не в каком-либо конвейере, и поскольку этот тестовый сервер Windows является реальной машиной, Linux, вероятно, будет запущен как Docker-контейнер на машине разработчика.
Все мои тестовые классы будут разделены на Windows и Linux или будут содержать отдельные методы тестирования для Windows и Linux. Я хочу, чтобы тест для каждого запускался условно, только если конфигурация этого сервера заполнена.
Таким образом, если конфигурация сервера Windows равна нулю, все TestClasses (или TestMethods) для Windows не следует запускать.
Возможно ли что-то подобное, используя Microsoft.VisualStudio.TestTools.UnitTesting
, у нас есть все тесты, написанные для этого фреймворка, поэтому я не хочу вводить еще один?
Из ответа: Как пропустить модульный тест во время выполнения?
Вы можете расширить TestMethodAttribute. Выберите метод для запуска на основе имени или прочитайте файл конфигурации, а затем верните true или false.
public class TestMethodForConfigAttribute : TestMethodAttribute
{
public string Name { get; set; }
public TestMethodForConfigAttribute(string name)
{
Name = name;
}
public override TestResult[] Execute(ITestMethod testMethod)
{
if (IsConfigEnabled(Name))
{
return base.Execute(testMethod);
}
else
{
return new TestResult[] { new TestResult { Outcome = UnitTestOutcome.Inconclusive } };
}
}
public static bool IsConfigEnabled(string name)
{
if (name == "Windows")
return true;
else
return false;
}
}
Метод испытания
[TestClass]
public class UnitTest1
{
[TestMethodForConfig("Windows")]
public void MyTest()
{
//...
}
}
Проголосуйте за ответ. Просто интересно, можете ли вы сделать его «чище», используя существующий словарь/поиск вместо «магических строк». (альтернативный конструктор) public TestMethodForConfigAttribute(System.Runtime.InteropServices.OSPlatform targetOs) {this. /* йада йада йада */} на основе этих ::: using System.Runtime.InteropServices; bool IsWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows); /**/ bool IsMacOS = RuntimeInformation.IsOSPlatform(OSPlatform.OSX); /**/ bool IsLinux = RuntimeInformation.IsOSPlatform(OSPlatform.Linux); /**/
Или иметь один атрибут для Windows и один для Linux.
Кажется, есть более общий вопрос, на основе которого вы могли бы построить: stackoverflow.com/questions/53338872/…