Поддерживает ли xUnit "одни и те же тесты, разные настройки"? Или как написать тесты, которые выполняются локально для dev и в конвейере для тестирования развертывания? - PullRequest
2 голосов
/ 26 апреля 2019

TL; DR: В соответствии с заголовком: Как я могу запускать одни и те же тесты, но с разными настройками?

Я работаю в C #, Visual Studio, развертывание через DevOps Azure (или VSTS) в WebApp.в Azure.

Разрабатываемое программное обеспечение настраивает ресурсы в Azure и удостоверения в Azure Active Directory.

Это означает, что у меня есть такие тесты:

[Fact]
public void ShouldCreateAzureDevOpsProject()
{
   _azureDevOpsHelper.GetAzureDevOpsProject(_projectName).Should().NotBe(null);
}

[Fact]
public void ShouldPutDefaultFileInRepo()
{ 
  _azureDevOpsHelper.GetDefaultFileFromRepo(_projectName).Should().NotBe(null);
}

[Fact]
public void ShouldEnableAllMicrosoftResourceProviders()
{
   _azureSubscriptionHelper.GetMicrosoftResourceProviders().Select(x => x.RegistrationState).Should().NotContain("NotRegistered");
}

Я хочузапустить эти тесты для кода, как я его пишу.Код запускается на моем ноутбуке, поэтому настройка (которую я сейчас использую в xUnit Fixture):

new EngineOrchestrator.EngineOrchestrator().RequestInstance(userSuppliedConfiguration);

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

Дело в том, что тесты идентичны, независимо от настройки.Значения для проверки получены из файла конфигурации json как в «локальном», так и в «конвейерном» случаях;изоляция достигается путем добавления в другой файл конфигурации для тестов во время развертывания.

Иными словами; Я пытаюсь понять, как можно инкапсулировать настройку, чтобы две разные установки могли совместно использовать одни и те же тесты. Это противоположно тому, что делают приборы и т. Д., Когда несколько тестов могут использовать одну и ту же настройку.

Я пытался:

  • Переключение «настройки» в зависимости от того, на какой машине выполняется тест
if (Environment.MachineName.StartsWith("Plavixo"))
{
    new EngineOrchestrator.EngineOrchestrator().RequestInstance(userSuppliedConfiguration);
}
else
{
    HttpEngineHelper.RunOrchestrator(userSuppliedConfiguration, authenticationDetails);
}

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

  • Создание тестов Аннотацияи наследование конкретным классам, которые имеют свои специфические настройки в своих конструкторах.
public class LocalBootstrap : BootstrapTests.BootstrapTests
{
   public LocalBootstrap():base()
      {
         //do specific setup here
public abstract class BootstrapTests
{
   [Fact]
   public void ShouldCreateAzureDevOpsProject()

Этот вид работал, но настройка выполнялась перед каждым тестом, что имеет смысл: "xUnit.net создает новый экземпляр класса test для каждого запускаемого теста, поэтому любой код, помещенный в конструктор класса test, будет выполняться для каждогоsingle test. "

  • Создание Fixture abstract

A выполняется один раз и распределяется между тестами,Я попытался сделать абстрактное устройство и иметь конкретный класс для каждой из моих установок.

xUnit генерирует исключение System.AggregateException: тип фиксации класса может определять только один открытый конструктор.На это ссылается проблема github , которая была закрыта как «По проекту»

  • Запуск моих локальных тестов на локальном хосте

Это мойСледующий вариант для расследования.Это хорошая идея?

Могу ли я попробовать еще что-нибудь?

1 Ответ

1 голос
/ 24 мая 2019

В итоге я разработал решение, которое работает для нас. Суть решения заключалась в том, чтобы сделать тесты абстрактными и унаследовать от этого абстрактного класса пару конкретных классов, которые захватили требуемую настройку. Это упрощенная схема того, что мы сейчас имеем. enter image description here

Мы все еще используем приборы, потому что хотим, чтобы код Arrange и код Act выполнялись только один раз.

Эта схема работает очень хорошо для нас, потому что мы можем запускать одни и те же тесты с несколькими настройками (у нас есть Bootstrap и Full) и с несколькими стилями вызова (удаленно или локально). Мы намерены добавить больше настроек для Greenfield и Brownfield (что связано с тем, выполнялся ли наш код раньше или нет).

...