Тестирование приложений WinUI, созданных с помощью Windows App SDK

В этом разделе мы даем рекомендации по тестированию и проверке функциональности в приложениях, созданных с использованием интерфейсных возможностей Windows App SDK и WinUI 3. Тестирование является важной частью процесса разработки приложений— это помогает перехватывать ошибки раньше, поддерживать качество кода и обеспечить надежный пользовательский интерфейс по мере развития приложения. Включив модульные тесты в рабочий процесс, вы можете уверенно рефакторингировать код, добавить новые функции и отправить обновления, зная, что существующие функциональные возможности продолжают работать должным образом.

Руководство. Создание проекта модульного теста WinUI 3.

Большинство типов объектов в пространствах имен Microsoft.UI.Xaml должны использоваться из потока пользовательского интерфейса в процессе приложения XAML. (Дополнительные сведения о тестировании приложений, созданных с Windows App SDK, которые не используют WinUI 3, см. в следующем разделе: Тестирование функциональности, не связанной с WinUI.)

Замечание

Рекомендуется рефакторинг любого кода для тестирования, извлекая его из основного проекта приложения и помещая его в проект библиотеки. Затем проект приложения и проект модульного теста могут ссылаться на этот проект библиотеки. В этом разделе описывается создание модульных тестов для приложений WinUI 3 в Visual Studio с помощью встроенных шаблонов проектов модульного теста.

Замечание

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

В этом руководстве вы узнаете, как:

  • Создайте проект модульного теста WinUI в Visual Studio.
  • Используйте Visual Studio Инспектор тестирования.
  • Добавьте проект библиотеки классов WinUI для тестирования.
  • Запустите тесты с помощью обозревателя тестов Visual Studio.

Необходимые условия

Необходимо установить и настроить Visual Studio для разработки WinUI. См. "Краткое руководство: настройка среды и создание проекта WinUI 3".

Создание проекта приложения модульного теста WinUI

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

  1. Откройте Visual Studio и выберите Create новый проект в окне "Пуск".

    Screenshot окна запуска Visual Studio.

  2. В окне Create новый проект отфильтруйте проекты по C#, Windows и WinUI выберите шаблон WinUI Unit Test App и выберите Next

    Скриншот окна «Создание нового проекта» в Visual Studio.

  3. [Необязательно] В окне "Настройка нового проекта" измените имя проекта, имя решения (снимите флажок "Разместить решение" и "Проект" в том же каталоге) и расположение проекта.

  4. Нажмите кнопку "Создать".

Выполнение тестов с помощью обозревателя тестов

При создании тестового проекта тесты отображаются в обозревателе тестов, который используется для выполнения модульных тестов. Вы также можете группировать тесты в категории, фильтровать список тестов, создавать, сохранять и запускать списки воспроизведения тестов, отладочные модульные тесты и (в Visual Studio Enterprise) анализировать покрытие кода.

Файл UnitTests.cs содержит исходный код для модульных тестов, используемых Test Explorer. По умолчанию базовые примеры тестов, показанные здесь, создаются автоматически:

namespace WinUITest1
{
   [TestClass]
   public class UnitTest1
   {
      [TestMethod]
      public void TestMethod1()
      {
         Assert.AreEqual(0, 0);
      }

      // Use the UITestMethod attribute for tests that need to run on the UI thread.
      [UITestMethod]
      public void TestMethod2()
      {
         var grid = new Grid();
         Assert.AreEqual(0, grid.MinWidth);
      }
   }
}
  1. Если вы этого еще не сделали, создайте решение. Это позволит Visual Studio "обнаружить" все доступные тесты.

  2. Откройте обозреватель тестов. Если он не отображается, откройте меню "Тест " и выберите обозреватель тестов (или нажмите клавиши CTRL+ E, T).

    Снимок экрана меню

  3. Просмотр тестов. В окне обозревателя тестов разверните все узлы (на этом этапе будут присутствовать только примеры тестов).

    Снимок экрана окна обозревателя тестов в Visual Studio, показывающий тесты по умолчанию.

  4. Выполните тесты.

    • Щелкните правой кнопкой мыши отдельные тестовые узлы и выберите "Выполнить".
    • Выберите тест и нажмите кнопку воспроизведения или нажмите клавиши CTRL+R, T.
    • Нажмите кнопку "Выполнить все тесты в представлении" или нажмите клавиши CTRL+R, V.

    Скриншот окна обозревателя тестов в Visual Studio, показывающий контекстное меню теста с выделенной командой Запуск.

  5. Просмотр результатов. После завершения тестов результаты отображаются в окне обозревателя тестов.

    Screenshot окна обозревателя тестов в Visual Studio с результатами тестового выполнения.

Добавление проекта библиотеки классов для тестирования

  1. Добавьте новый проект в решение модульного теста. В Обозреватель решений щелкните решение правой кнопкой мыши и выберите Add -> Новый проект... .

    Скриншот контекстного меню решения с выделенным вариантом "Добавить/Новый проект" в Visual Studio.

  2. В этом примере добавьте проект библиотеки классов WinUI 3. В окне "Новый проект" отфильтруйте библиотеку классов C#/Windows/WinUI и выберите библиотеку классов WinUI.

    Скриншот окна 'Новый проект', в котором выделена библиотека классов WinUI в Visual Studio.

  3. Нажмите кнопку "Далее " и введите имя проекта (в этом примере мы используем WinUIClassLibrary1) и нажмите клавишу CREATE.

    Снимок экрана нового проекта «Библиотека классов WinUI», выделенного в Обозреватель решений, а файл Class1.cs открыт в редакторе кода.

  4. Добавьте новое UserControl в проект. В Обозреватель решений щелкните правой кнопкой мыши проект библиотеки классов WinUI 3, который вы только что добавили и выберите Add -> New Item в контекстном меню.

    Снимок экрана контекстного меню решения с выделенным пунктом

  5. В окне "Добавить новый элемент" выберите узел WinUI в списке установленных элементов и выберите элемент управления пользователем из результатов. Присвойте элементу управления UserControl1имя.

    Скриншот окна

  6. Откройте файл связанного кода UserControl1.xaml.cs. В этом примере мы добавим новый публичный метод GetSeven, который просто возвращает целое число.

    namespace WinUIClassLibrary1
    {
      public sealed partial class UserControl1 : UserControl
      {
         public UserControl1()
         {
             this.InitializeComponent();
         }
    
         public int GetSeven()
         {
             return 7;
         }
      }
    }
    
  7. Задайте проект библиотеки классов WinUI 3 в качестве зависимости от проекта модульного теста, чтобы включить использование типов из проекта библиотеки классов WinUI 3. В Обозреватель решений в проекте библиотеки классов щелкните правой кнопкой мыши Dependencies и выберите Add Project Reference>.

    Скриншот контекстного меню Зависимости с выделенной функцией

    WinUIClassLibrary1 Выберите элемент из списка "Проекты".

    Снимок экрана: диалоговое окно

  8. Создайте новый метод тестирования в UnitTests.cs. Так как этот тестовый случай требует запуска потока пользовательского интерфейса XAML, помечайте его атрибутом [UITestMethod] вместо стандартного [TestMethod] атрибута.

    [UITestMethod]
    public void TestUserControl1()
    {
       WinUIClassLibrary1.UserControl1 userControl1 = new WinUIClassLibrary1.UserControl1();
       Assert.AreEqual(7, userControl1.GetSeven());
    }
    

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

    Screenshot окна обозревателя тестов в Visual Studio с примерами тестов по умолчанию с новым модульным тестом.

  9. Выполните тесты.

  • Щелкните правой кнопкой мыши новый тестовый узел и выберите "Выполнить".
  • Выберите новый тест и нажмите кнопку воспроизведения или нажмите клавиши CTRL+ R, T.
  • Нажмите кнопку "Выполнить все тесты в представлении" или нажмите клавиши CTRL+R, V.

Снимок экрана окна Test Explorer в Visual Studio показывает результат завершенного запуска образцов тестов по умолчанию и нового модульного теста.

Тестирование функциональных возможностей, отличных от WinUI

Во многих случаях приложение включает функции, которые не зависят от типов Microsoft.UI.Xaml, но по-прежнему требуют тестирования. Различные средства доступны для тестирования кода .NET, включая MSTest, NUnit и xUnit>. Дополнительные сведения о тестировании приложений .NET см. в разделе Testing в .NET.

В Visual Studio вы можете создать проект для любого из этих средств тестирования, щелкнув правой кнопкой мыши по вашему решению в Обозреватель решений, выбрав Add -> New Project в контекстном меню, затем отметив C# в селекторе все языки/Windows в селекторе все языки/Test в селекторе все типы проектов, и затем выбрав соответствующее средство тестирования из списка (MSTest Test Project, NUnit Test Project или xUnit Test Project).

При создании нового проекта MSTest, NUnit или xUnit, ссылающегося на проект WinUI 3, необходимо:

  1. Обновите элемент TargetFramework в файле .csproj вашего тестового проекта. Это значение должно соответствовать TargetFramework в проекте WinUI 3. По умолчанию проекты MSTest, NUnit и xUnit нацелены на полный спектр платформ, поддерживаемых .NET, но проект WinUI 3 поддерживает только Windows и имеет более конкретный TargetFramework.

    Например, если целевой объект .NET 8, обновите TargetFramework проекта модульного теста с <TargetFramework>net8.0</TargetFramework> до <TargetFramework>net8.0-windows10.0.19041.0</TargetFramework>.

  2. Обновите RuntimeIdentifiers в тестовом проекте.

    <RuntimeIdentifiers Condition="$([MSBuild]::GetTargetFrameworkVersion('$(TargetFramework)')) &gt;= 8">win-x86;win-x64;win-arm64</RuntimeIdentifiers>

    <RuntimeIdentifiers Condition="$([MSBuild]::GetTargetFrameworkVersion('$(TargetFramework)')) &lt; 8">win10-x86;win10-x64;win10-arm64</RuntimeIdentifiers>

  3. Добавьте следующее свойство в файл PropertyGroup в CSPROJ-файле тестового проекта, чтобы убедиться, что тест загружает среду выполнения Windows App SDK: <WindowsAppSdkBootstrapInitialize>true</WindowsAppSdkBootstrapInitialize>

  4. Убедитесь, что среда выполнения Windows App SDK установлена на компьютере, на котором выполняется тест. Для получения дополнительных сведений о развертывании Windows App SDK см. руководство по развертыванию Windows App SDK для приложений, зависящих от платформы, которые упакованы с использованием внешнего расположения (или неупакованы).

Автоматизация тестов пользовательского интерфейса

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

Appium с WinAppDriver

WinAppDriver был исходным средством Microsoft для тестирования автоматизации пользовательского интерфейса Windows, но он больше не находится в активной разработке. Рекомендуемым преемником является Appium с плагином Windows Application Driver (appium-windows-driver). Appium использует тот же протокол WebDriver и поддерживает классические приложения Windows через платформу автоматизации пользовательского интерфейса Windows (Windows модель автоматизации пользовательского интерфейса).

Чтобы настроить Appium для настольного приложения WinUI 3:

Замечание

Для этих действий требуется Node.js (рекомендуется LTS).

  1. Установите Appium: npm install -g appium
  2. Установите драйвер Windows:appium driver install windows
  3. Убедитесь, что драйвер установлен: appium driver list (должно отображаться windows как установленное)
  4. Запустите сервер Appium: appium
  5. Написание тестов с помощью клиентской библиотеки WebDriver (доступно для C#, Python, Java и JavaScript).

Подсказка

Задайте для возможности app идентификатор пользовательской модели приложения (AUMID) вашего приложения для упакованных приложений или путь к исполняемому файлу для неупакованных приложений.

Специальные возможности и автоматизация пользовательского интерфейса

Accessibility Insights for Windows помогает проверять и подтверждать дерево модель автоматизации пользовательского интерфейса вашего приложения. Элементы, предоставляемые через модель автоматизации пользовательского интерфейса, являются теми же элементами, с которыми взаимодействуют автоматизированные средства тестирования. Обеспечение того, чтобы приложение было хорошо структурированным деревом автоматизации, повышает доступность и возможность тестирования.

Microsoft Playwright (веб-интерфейс в WebView2)

Если приложение использует WebView2 для веб-содержимого, вы можете использовать Microsoft Playwright для тестирования веб-частей. Playwright поддерживает автоматическое тестирование браузера и может подключаться к экземплярам WebView2 для сквозной проверки сценария.

Качество кода и статический анализ

Инструменты статического анализа выявляют ошибки, проблемы безопасности и качества кода ещё до выполнения программы. Интегрируйте их в рабочий процесс разработки и конвейеры CI для обеспечения согласованного качества.

анализаторы .NET (Roslyn)

.NET проекты включают встроенные анализаторы Roslyn, которые проверяют правильность, производительность, надежность и безопасность. Чтобы включить все рекомендуемые правила в проекте, выполните следующие действия.

<PropertyGroup>
  <AnalysisLevel>latest-recommended</AnalysisLevel>
  <EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild>
</PropertyGroup>

Вы можете настроить серьезность правил в .editorconfig файле или с помощью <NoWarn> файла проекта. Дополнительные сведения см. в разделе "Обзор анализа исходного кода .NET".

Статический анализ C++ (/analysis)

Для проектов C++ с Windows App SDK и Win32 включите статический анализ Microsoft, задав /analyze в свойствах проекта или в MSBuild:

<PropertyGroup>
  <EnableMicrosoftCodeAnalysis>true</EnableMicrosoftCodeAnalysis>
  <CodeAnalysisRuleSet>CppCoreCheckRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>

Средство проверки основных рекомендаций C++ применяет современные рекомендации C++. Для типичных сценариев использования Win32 API аннотации SAL и флаг /analyze помогают выявлять распространённые проблемы, связанные со временем жизни объектов, буферами и многопоточностью.

Интеграция CI

Добавьте статический анализ в конвейер CI, чтобы проверки качества кода запускались при каждом pull request. В рабочем процессе GitHub Actions:

    - name: Build with analysis
      run: dotnet build --configuration Release /p:AnalysisLevel=latest-recommended /p:TreatWarningsAsErrors=true

Для проектов C++ с помощью MSBuild:

    - name: Build with /analyze
      run: msbuild MySolution.sln /p:Configuration=Release /p:EnableMicrosoftCodeAnalysis=true /p:RunCodeAnalysis=true

Телеметрия и отчеты о сбоях

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

Application Insights

приложение Azure Insights предоставляет отчеты о сбоях, мониторинг производительности и аналитику использования классических приложений. Чтобы добавить его в проект Windows App SDK:

Замечание

Вам нужна Azure подписка и ресурс Application Insights. Чтобы получить строку подключения, см. Создание ресурса Application Insights.

  1. Установите пакет NuGet: Microsoft.ApplicationInsights
  2. Инициализируйте TelemetryClient при запуске приложения с помощью строки подключения
  3. Отслеживайте исключения, события и просмотры страниц

Подробные инструкции по настройке см. в разделе Application Insights для консольных и настольных приложений .NET.

OpenTelemetry

OpenTelemetry — это стандарт, не зависящий от поставщика, для сбора журналов, метрик и распределенных трасс. Пакет SDK .NET OpenTelemetry интегрируется с Azure Monitor и другими серверными службами.

Установите необходимые пакеты:

dotnet add package OpenTelemetry
dotnet add package Azure.Monitor.OpenTelemetry.Exporter

Затем настройте поставщик трассировки:

var activitySource = new System.Diagnostics.ActivitySource("MyApp");
// OpenTelemetry SDKs can listen to ActivitySource instances like this one.
using var activity = activitySource.StartActivity("Startup");
activity?.SetTag("app.version", "1.0.0");

OpenTelemetry — это рекомендуемый подход для новых проектов, которым требуется поддержка нескольких серверных служб или распределенная трассировка. Application Insights остается хорошим выбором, если вы используете Azure Monitor исключительно и хотите готовых панелей мониторинга.

Отчеты об ошибках Windows (WER)

Для сбора данных о нативных сбоях служба отчетов об ошибках Windows автоматически собирает дампы сбоев при неожиданном завершении работы приложения. Для упакованных приложений (MSIX) данные о сбоях доступны в отчетах о качестве Центра партнеров. Для корпоративных приложений (LOB) можно настроить сбор локальных дампов WER, чтобы сохранять мини-дампы для локального анализа.

Дополнительные ресурсы