Поделиться через


Возможности Microsoft.Testing.Platform

В контексте Microsoft.Testing.Platform возможность относится к потенциалу выполнения определенного действия или предоставления определенной информации. Это средство для платформы тестирования и расширений объявлять их возможностьработать определенным образом или предоставлять конкретные сведения запрашивающих.

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

Основная цель системы возможностей заключается в том, чтобы упростить эффективное взаимодействие между компонентами, участвующими в тестовом сеансе, что позволяет им exchange информацию и точно соответствовать их потребностям.

Пример с интерактивным руководством

Рассмотрим гипотетический пример, чтобы продемонстрировать необходимость системы возможностей.

Заметка

Этот пример предназначен исключительно для иллюстрирующих целей и в настоящее время не реализуется в Microsoft.Testing.Platform или в любой платформе тестирования.

Представьте себе ситуацию, когда у вас есть расширение, которое требует от платформы тестирования выполнять не более одного теста одновременно. Кроме того, после каждого теста расширение должно знать использование ЦП для этого конкретного теста.

Чтобы выполнить предыдущий сценарий, необходимо получить запрос из платформы тестирования, если:

  1. Он имеет возможность выполнять только один тест за раз.
  2. Он может предоставить сведения о количестве ЦП, потребляемом каждым тестом.

Как расширение может определить, имеет ли платформа тестирования возможность работать в этом режиме и предоставлять сведения об использовании ЦП для тестового сеанса? В Microsoft.Testing.Platform эта возможность представлена реализацией интерфейса Microsoft.Testing.Platform.Capabilities.ICapability.

// Base capabilities contracts

public interface ICapability
{
}

public interface ICapabilities<TCapability>
    where TCapability : ICapability
{
    IReadOnlyCollection<TCapability> Capabilities { get; }
}

// Specific testing framework capabilities

public interface ITestFrameworkCapabilities : ICapabilities<ITestFrameworkCapability>
{
}

public interface ITestFrameworkCapability : ICapability
{
}

Как вы можете видеть, интерфейс ICapability является интерфейсом-маркером , поскольку он может представлять любую возможность , а фактическая реализация будет зависеть от контекста. Вы также увидите ITestFrameworkCapability, которая наследует от ICapability для классификации функционала. Универсальный характер системы возможностей позволяет удобно группировать по контексту. ITestFrameworkCapability группирует все возможности, реализованные платформой тестирования . Интерфейс ICapabilities<TCapability> представляет набор всех возможностей, реализованных расширением. Аналогичным образом, для базовой версии существует фреймворк тестирования для конкретного контекста, называемый ITestFrameworkCapabilities. ITestFrameworkCapabilities предоставляется платформе во время процесса регистрации тестового фреймворка.

Чтобы создать возможность, которая отвечает за описанный выше сценарий, вы определите его следующим образом:

public interface IDisableParallelismCapability : ITestFrameworkCapability
{
    bool CanDisableParallelism { get; }
    bool CanProvidePerTestCpuConsumption { get; }
    void Enable();
}

Если платформа тестирования реализует этот интерфейс во время выполнения, можно запросить следующее:

  • Убедитесь, что платформа тестирования имеет возможность отключить параллелизм CanDisableParallelism = true.
  • Определите, может ли платформа тестирования предоставлять данные об использовании ЦП CanProvidePerTestCPUConsumption = true.
  • Попросите адаптер тестирования активировать этот режим, вызвав метод Enable() до начала тестового сеанса.

Фрагмент гипотетического кода внутри расширения может быть примерно следующим:

IServiceProvider provider = null; // TODO: Get IServiceProvider.
var capabilities = serviceProvider.GetRequiredService<ITestFrameworkCapabilities>();

// Utilize the `GetCapability` API to search for the specific capability to query.
var capability = capabilities.GetCapability<IDisableParallelismCapability>();
if (capability is null)
{
    // Capability not supported...
}
else
{
    capability.Enable();
    if (capability.CanDisableParallelism)
    {
        // Do something...
    }

    if (capability.CanProvidePerTestCpuConsumption)
    {
        // Do something...
    }
}

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

Очевидно, что не все сведения можно передавать через интерфейс. Учитывая предыдущий пример, что должно ожидать данное расширение, если поддерживается CanProvidePerTestCpuConsumption? Какие пользовательские сведения должны передаваться через IMessageBus платформой тестирования? Документация по возможностям представляет решение. Владелец несёт ответственность за возможность, чтобы разрабатывать, отправлять и документировать её как можно более четко, чтобы помочь исполнителям, которые хотят эффективно взаимодействовать с расширением, требующим этой конкретной возможности.

Например, расширение отчета TRX позволяет платформе тестирования реализовать необходимую возможность точного создания отчета TRX. Расширение для регистрации входит в пакет NuGet https://www.nuget.org/packages/Microsoft.Testing.Extensions.TrxReport, но возможность реализации имеется только в контракте из пакета NuGethttps://www.nuget.org/packages/Microsoft.Testing.Extensions.TrxReport.Abstractions.

В заключение рассмотрим основные аспекты системы возможностей:

  • Важно упростить четкое и стабильное взаимодействие между компонентами.
  • Все возможности должны наследоваться от ICapability или интерфейса, наследуемого от него, и предоставляются через коллекцию с интерфейсом ICapabilities.
  • Он помогает в эволюции функций, не вызывая ломающих изменений. Если определенная возможность не поддерживается, можно предпринять соответствующие действия.
  • Ответственность за проектирование, доставку и документирование использования возможности лежит на владельце возможности. Microsoft.Testing.Platform также может владеть возможностями таким же образом, как и любое другое расширение.

Возможности платформы

Платформа предоставляет специализированный интерфейс с именем ITestFrameworkCapability, который является базой всех возможностей, предоставляемых для тестовых платформ. Эти возможности предоставляются при регистрации тестового фреймворка на платформе.

IBannerMessageOwnerCapability

Необязательный возможности платформы тестирования, которая позволяет тестовой платформе предоставлять баннерное сообщение платформе. Если сообщение равно null или если функция отсутствует, платформа будет использовать по умолчанию сообщение баннера.

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

Платформа предоставляет IPlatformInformation, чтобы предоставить некоторые сведения о платформе, которая может быть полезна при создании пользовательского баннерного сообщения.