Prueba de aplicaciones WinUI compiladas con el SDK de Aplicaciones para Windows

En este tema se proporcionan algunas recomendaciones sobre cómo probar y validar la funcionalidad en las aplicaciones creadas con las características de SDK de Aplicaciones para Windows mediante WinUI 3 interfaz de usuario (UI). Las pruebas son una parte esencial del proceso de desarrollo de aplicaciones: ayuda a detectar errores al principio, mantener la calidad del código y garantizar una experiencia de usuario confiable a medida que evoluciona la aplicación. Al incorporar pruebas unitarias en el flujo de trabajo, puede refactorizar el código, agregar nuevas características y enviar actualizaciones sabiendo que la funcionalidad existente sigue funcionando según lo previsto.

Tutorial: Creación de un proyecto de prueba unitaria de WinUI 3.

La mayoría de los tipos de objeto de los espacios de nombres Microsoft.UI.Xaml deben usarse desde un subproceso de interfaz de usuario en un proceso de aplicación XAML. (Para obtener más información sobre las aplicaciones de prueba creadas con SDK de Aplicaciones para Windows que no usan WinUI 3, consulte la siguiente sección, Pruebas de funcionalidades que no son de WinUI.)

Nota:

Se recomienda refactorizar cualquier código que se vaya a probar extrayéndolo del proyecto de aplicación principal y colocándolo en un proyecto de biblioteca. Tanto el proyecto de aplicación como el proyecto de prueba unitaria pueden hacer referencia a ese proyecto de biblioteca. En esta sección se describe cómo crear pruebas unitarias para aplicaciones winUI 3 en Visual Studio mediante las plantillas de proyecto de prueba unitaria integradas.

Nota:

La aplicación de prueba unitaria que se describe aquí se escribe en el contexto de una aplicación WinUI 3. Esto es necesario para cualquier prueba que ejecute código que requiera el tiempo de ejecución xaml. Este proyecto creará un subproceso de interfaz de usuario XAML y ejecutará las pruebas.

En este tutorial aprenderá a:

  • Cree un proyecto WinUI Unit Test App en Visual Studio.
  • Use el Visual Studio Test Explorer.
  • Agregue un proyecto de biblioteca de clases winUI para realizar pruebas.
  • Ejecute pruebas con el Explorador de pruebas de Visual Studio.

Prerrequisitos

Debe tener Visual Studio instalado y configurado para el desarrollo de WinUI. Consulte Inicio rápido: Configuración del entorno y creación de un proyecto de WinUI 3.

Creación de un proyecto de aplicación de prueba unitaria de WinUI

Para empezar, cree un proyecto de prueba unitaria. El tipo de proyecto incluye todos los archivos de plantilla que necesita.

  1. Abra Visual Studio y seleccione Crear un nuevo proyecto en la ventana Inicio.

    Captura de pantalla de la ventana de inicio de Visual Studio.

  2. En la ventana Crear un nuevo proyecto, filtre los proyectos a C#, Windows y WinUI, seleccione la plantilla WinUI Unit Test App y seleccione Next

    Captura de pantalla del Visual Studio ventana

  3. [Opcional] En la ventana Configurar el nuevo proyecto, cambie el Nombre del proyecto, el Nombre de la solución (desactive Colocar solución y proyecto en el mismo directorio) y la Ubicación del proyecto.

  4. Selecciona Crear.

Ejecución de pruebas con el Explorador de pruebas

Al crear el proyecto de prueba, las pruebas aparecen en el Explorador de pruebas, que se usa para ejecutar las pruebas unitarias. También puede agrupar pruebas en categorías, filtrar la lista de pruebas, crear, guardar y ejecutar listas de reproducción de pruebas, depurar pruebas unitarias y (en Visual Studio Enterprise) analizar la cobertura de código.

El archivo UnitTests.cs contiene el código fuente de las pruebas unitarias que se utilizan en el Explorador de pruebas. De forma predeterminada, las pruebas de ejemplo básicas que se muestran aquí se crean automáticamente:

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. Si aún no lo ha hecho, compile la solución. Esto permitirá que Visual Studio "descubra" todas las pruebas disponibles.

  2. Abra el Explorador de pruebas. Si no está visible, abra el menú Prueba y, a continuación, elija Explorador de pruebas (o pulse Ctrl + E, T).

    Captura de pantalla del menú Prueba en Visual Studio.

  3. Visualice las pruebas. En la ventana Explorador de pruebas, expanda todos los nodos (solo las pruebas de ejemplo estarán presentes en este momento).

    Captura de pantalla de la ventana Explorador de pruebas en Visual Studio que muestra las pruebas de ejemplo predeterminadas.

  4. Ejecute las pruebas.

    • Haga clic con el botón derecho en nodos de prueba individuales y seleccione Ejecutar.
    • Seleccione una prueba y pulse el botón Reproducir o pulse Ctrl + R, T.
    • Pulse el botón Ejecutar todas las pruebas en la vista o pulse Ctrl + R, V.

    Captura de pantalla de la ventana Explorador de pruebas en Visual Studio que muestra el menú contextual de prueba con el comando Ejecutar resaltado.

  5. Revisión de los resultados. Una vez completadas las pruebas, los resultados se muestran en la ventana Explorador de pruebas.

    Captura de pantalla de la ventana Explorador de pruebas en Visual Studio que muestra los resultados de la ejecución de pruebas.

Adición de un proyecto de biblioteca de clases para pruebas

  1. Agregue u nuevo proyecto a la solución de prueba unitaria. En el Explorador de soluciones, haga clic con el botón derecho en la solución y seleccione Agregar -> Nuevo proyecto... .

    Captura de pantalla del menú contextual de la solución con Agregar/Nuevo Proyecto resaltado en Visual Studio.

  2. Para este ejemplo, agregue un proyecto de biblioteca de clases WinUI 3. En la ventana Nuevo proyecto, filtre por C#/Windows/WinUI y seleccione Biblioteca de clasesWinUI.

    Captura de pantalla de la ventana Nuevo proyecto con biblioteca de clases winUI resaltada en Visual Studio.

  3. Seleccione Siguiente y escriba un nombre para el proyecto (para este ejemplo usamos WinUIClassLibrary1) y presione Crear.

    Captura de pantalla del nuevo proyecto

  4. Agregue un nuevo UserControl al proyecto. En el Explorador de soluciones, haga clic con el botón derecho en el proyecto de biblioteca de clases winUI 3 que acaba de agregar y seleccione Agregar -> Nuevo elemento en el menú contextual.

    Captura de pantalla del menú contextual de la solución con Agregar/Nuevo Elemento resaltado en Visual Studio.

  5. En la ventana Agregar nuevo elemento , seleccione el nodo WinUI en la lista Elementos instalados y, a continuación, elija Control de usuario en los resultados. Asigne al control el nombre UserControl1.

    Screenshot de la ventana Agregar nuevo elemento con WinUI\/User Control (WinUI) resaltado en Visual Studio.

  6. Abra el archivo de código subyacente UserControl1.xaml.cs. En este ejemplo, agregamos un nuevo método público denominado GetSeven que simplemente devuelve un entero.

    namespace WinUIClassLibrary1
    {
      public sealed partial class UserControl1 : UserControl
      {
         public UserControl1()
         {
             this.InitializeComponent();
         }
    
         public int GetSeven()
         {
             return 7;
         }
      }
    }
    
  7. Establezca el proyecto Biblioteca de Clases WinUI 3 como una dependencia del proyecto de pruebas unitarias para habilitar el uso de tipos desde el proyecto Biblioteca de Clases WinUI 3. En Explorador de soluciones, en el proyecto de biblioteca de clases, haga clic con el botón derecho en Dependencies y seleccione Agregar referencia de proyecto.

    Captura de pantalla del menú contextual Dependencias con

    Seleccione el WinUIClassLibrary1 elemento de la lista Proyectos .

    Captura de pantalla del cuadro de diálogo Administrador de referencias con el proyecto

  8. Cree un nuevo método de prueba en UnitTests.cs. Como este caso de prueba requiere que se ejecute un subproceso de interfaz de usuario XAML, marque con el [UITestMethod] atributo en lugar del atributo estándar [TestMethod] .

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

    Este nuevo método de prueba aparece ahora en el Explorador de pruebas como una de las pruebas unitarias.

    Captura de pantalla de la ventana Explorador de pruebas en Visual Studio que muestra las pruebas de ejemplo predeterminadas con la nueva prueba unitaria.

  9. Ejecute las pruebas.

  • Haga clic con el botón derecho en el nuevo nodo de prueba y seleccione Ejecutar.
  • Seleccione la nueva prueba y pulse el botón Reproducir o pulse Ctrl + R, T.
  • Pulse el botón Ejecutar todas las pruebas en la vista o pulse Ctrl + R, V.

Screenshot de la ventana Explorador de pruebas en Visual Studio que muestra una ejecución de prueba completada de las pruebas de ejemplo predeterminadas y la nueva prueba unitaria.

Prueba de la funcionalidad que no es WinUI

En muchos casos, una aplicación incluye funcionalidad que no depende de los tipos Microsoft.UI.Xaml, pero que aún así es necesario probar. Hay varias herramientas disponibles para probar código .NET, incluidos MSTest, NUnit y xUnit. Para obtener más información sobre las pruebas de aplicaciones .NET, consulte Testing en .NET.

En Visual Studio, puede crear un nuevo proyecto para cualquiera de estas herramientas de prueba haciendo clic con el botón derecho en la solución en Explorador de soluciones, seleccione Agregar -> Nuevo proyecto en el menú contextual, eligiendo C# en el Todos los idiomas selector/Windows del Todos los idiomas selector/Test del Todos los tipos de proyecto, y, a continuación, seleccione la herramienta de prueba adecuada de la lista (MSTest Test Project, NUnit Test Project o xUnit Test Project).

Al crear un nuevo proyecto MSTest, NUnit o xUnit que haga referencia a un proyecto de WinUI 3, debe:

  1. Actualizar TargetFramework en el archivo .csproj del proyecto de prueba. Este valor debe coincidir con el TargetFramework en el proyecto WinUI 3. De forma predeterminada, los proyectos MSTest, NUnit y xUnit tienen como destino la gama completa de plataformas compatibles con .NET, pero un proyecto de WinUI 3 solo admite Windows y tiene un targetFramework más específico.

    Por ejemplo, si el destino es .NET 8, actualice TargetFramework del proyecto de prueba unitaria de <TargetFramework>net8.0</TargetFramework> a <TargetFramework>net8.0-windows10.0.19041.0</TargetFramework>.

  2. Actualice RuntimeIdentifiers en el proyecto de prueba.

    <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. Agregue la siguiente propiedad al PropertyGroup en el archivo .csproj del proyecto de prueba para asegurarse de que la prueba carga el entorno de ejecución de SDK de Aplicaciones para Windows: <WindowsAppSdkBootstrapInitialize>true</WindowsAppSdkBootstrapInitialize>

  4. Asegúrese de que el entorno de ejecución de SDK de Aplicaciones para Windows esté instalado en la máquina que ejecuta la prueba. Para obtener más información sobre la implementación de SDK de Aplicaciones para Windows, consulte SDK de Aplicaciones para Windows guía de implementación para aplicaciones dependientes del marco empaquetadas con ubicación externa (o sin empaquetar).

Automatización de pruebas de IU

Para las pruebas de un extremo a otro de la interfaz de usuario de la aplicación, puedes usar herramientas automatizadas de pruebas de IU que interactúen con la aplicación de la manera que haría un usuario, haciendo clic en botones, escribiendo texto y comprobando el estado visual.

Appium con WinAppDriver

WinAppDriver era la herramienta de Microsoft original para las pruebas de automatización de la interfaz de usuario de Windows, pero ya no está en desarrollo activo. El sucesor recomendado es Appium con el complemento Windows Application Driver (appium-windows-driver). Appium utiliza el mismo protocolo WebDriver y es compatible con las aplicaciones de escritorio de Windows a través del marco Windows Automatización de la interfaz de usuario.

Para configurar Appium para una aplicación de escritorio winUI 3:

Nota:

Estos pasos requieren Node.js (se recomienda LTS).

  1. Instale Appium: npm install -g appium
  2. Instale el controlador Windows:appium driver install windows
  3. Compruebe que el controlador está instalado: appium driver list (debe mostrarse windows como instalado)
  4. Inicie el servidor de Appium: appium
  5. Escriba pruebas mediante una biblioteca cliente de WebDriver (disponible para C#, Python, Java y JavaScript).

Sugerencia

Establezca la capacidad app en el identificador de modelo de usuario de la aplicación (AUMID) de su aplicación para las aplicaciones empaquetadas, o en la ruta de acceso del ejecutable para las aplicaciones no empaquetadas.

Accessibility Insights y Automatización de la interfaz de usuario

Accessibility Insights for Windows ayuda a inspeccionar y validar el árbol de Automatización de la interfaz de usuario de la aplicación. Los elementos expuestos a través de Automatización de la interfaz de usuario son los mismos elementos con los que interactúan las herramientas de prueba automatizadas. Asegurarse de que la aplicación tiene un árbol de automatización bien estructurado mejora tanto la accesibilidad como la capacidad de prueba.

Microsoft Playwright (interfaz de usuario web en WebView2)

Si la aplicación usa WebView2 para el contenido web, puede usar Microsoft Playwright para probar las partes web. Playwright admite pruebas automatizadas del explorador y puede conectarse a instancias de WebView2 para la validación de escenarios de un extremo a otro.

Calidad del código y análisis estático

Las herramientas de análisis estático detectan errores, problemas de seguridad y problemas de calidad del código antes del tiempo de ejecución. Integre estos elementos en el flujo de trabajo de desarrollo y las canalizaciones de CI para lograr una calidad coherente.

analizadores de .NET (Roslyn)

.NET proyectos incluyen analizadores integrados de Roslyn que comprueban si hay problemas de corrección, rendimiento, confiabilidad y seguridad. Para habilitar todas las reglas recomendadas en el proyecto:

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

Puede configurar los niveles de gravedad de las reglas en un archivo .editorconfig o usando <NoWarn> en el archivo de proyecto. Para obtener más información, consulte Introducción al análisis de código fuente de .NET.

Análisis estático de C++ (/analyze)

Para los proyectos de C++ SDK de Aplicaciones para Windows y Win32, habilite el análisis estático de Microsoft estableciendo /analyze en las propiedades del proyecto o MSBuild:

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

El Comprobador de directrices principales de C++ aplica los procedimientos recomendados modernos de C++. Para los patrones de uso de la API Win32, las anotaciones SAL y el indicador /analyze detectan problemas habituales de tiempo de vida, búfer y concurrencia.

Integración de CI

Agregue análisis estáticos al flujo de trabajo de CI para que las comprobaciones de calidad del código se ejecuten en cada solicitud de incorporación de cambios. En un flujo de trabajo de Acciones de GitHub:

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

Para proyectos de C++ mediante MSBuild:

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

Telemetría e informes de errores

Recopilar datos de telemetría y de fallos del entorno de producción te ayuda a comprender cómo se comporta tu aplicación en el mundo real, identificar regresiones y priorizar las correcciones.

Application Insights

Aplicación de Azure Insights proporciona informes de errores, supervisión del rendimiento y analítica de uso para aplicaciones de escritorio. Para agregarlo a un proyecto de SDK de Aplicaciones para Windows:

Nota:

Necesita una suscripción Azure y un recurso de Application Insights. Consulte Crear un recurso de Application Insights para obtener la cadena de conexión.

  1. Instale el paquete NuGet: Microsoft.ApplicationInsights
  2. Inicialice TelemetryClient al iniciar la aplicación con la cadena de conexión
  3. Seguimiento de excepciones, eventos y vistas de página

Para obtener instrucciones detalladas sobre la configuración, consulte Application Insights para .NET aplicaciones de escritorio y consola.

OpenTelemetry

OpenTelemetry es un estándar independiente del proveedor para recopilar registros, métricas y seguimientos distribuidos. El SDK de .NET OpenTelemetry se integra con Azure Monitor y otros back-end.

Instale los paquetes necesarios:

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

A continuación, configure el proveedor de seguimiento:

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 es el enfoque recomendado para los nuevos proyectos que necesitan compatibilidad con varios back-end o seguimiento distribuido. Application Insights sigue siendo una buena opción si usa Azure Monitor exclusivamente y quiere paneles llave en mano.

Informe de errores de Windows (WER)

Para la recopilación nativa de fallos, Informes de errores de Windows captura automáticamente volcados por fallo cuando tu aplicación finaliza inesperadamente. Los datos de errores de las aplicaciones empaquetadas (MSIX) se muestran a través de los informes de calidad de Partner Center. En el caso de las aplicaciones organizativas (LOB), puede configurar la recopilación de volcados locales de WER para guardar minivolcados para el análisis local.

Recursos adicionales