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 , которая была закрыта как «По проекту»
- Запуск моих локальных тестов на локальном хосте
Это мойСледующий вариант для расследования.Это хорошая идея?
Могу ли я попробовать еще что-нибудь?