Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Las pruebas de iu comprueban que la interfaz de usuario de la aplicación se comporta correctamente mediante la automatización de interacciones como pulsar botones, escribir texto y navegar entre páginas. Mientras que las pruebas unitarias validan métodos y clases individuales de forma aislada, las pruebas de iu ejercen la aplicación completa en un dispositivo real o emulador para detectar regresiones que solo se muestran a través de la interacción real del usuario.
Appium es un marco de pruebas de iu de código abierto que funciona con aplicaciones web, híbridas y nativas en varias plataformas. Dado que Appium funciona en el nivel de plataforma, prueba la aplicación de la misma manera independientemente de si se creó con herramientas nativas de .NET MAUI o plataforma. Appium usa controladores específicos de la plataforma para enviar interacciones a la aplicación:
| Plataforma | Controlador de Appium | Sistema operativo del host |
|---|---|---|
| Android | UIAutomator2 | Windows, macOS, Linux |
| Ios | XCUITest | Solo macOS |
| Mac Catalyst | Mac2 | Solo macOS |
| Windows | Windows | sólo para Windows |
Nota:
Lo que puede probar depende de su máquina de desarrollo. En Windows, puede probar aplicaciones Android y Windows. En macOS, puede probar aplicaciones Android, iOS y Mac Catalyst.
Sugerencia
Para obtener un ejemplo de trabajo completo, consulte el Basic Appium NUnit Sample en GitHub.
Prerrequisitos
Para poder escribir y ejecutar pruebas de IU, instale los siguientes requisitos previos:
Node.js y Appium
Appium se basa en Node.js. Instale Node.js (se recomienda la versión LTS) y, a continuación, instale Appium y los controladores para las plataformas que desea probar:
# Install Appium
npm install -g appium
# Install platform drivers (install only the ones you need)
appium driver install uiautomator2 # Android
appium driver install xcuitest # iOS (macOS only)
appium driver install mac2 # Mac Catalyst (macOS only)
appium driver install windows # Windows
Compruebe la instalación mediante la ejecución appium en un terminal. El servidor debe iniciarse y mostrar un mensaje que indique que está escuchando en el puerto 4723.
controlador de aplicación de Windows (solo Windows)
El controlador appium Windows usa Windows Application Driver (WinAppDriver) para automatizar aplicaciones Windows. Descargue e instale WinAppDriver versión 1.2.1.
Importante
Utilice específicamente la versión 1.2.1 de WinAppDriver. Es posible que otras versiones no funcionen correctamente con el controlador appium Windows.
Android SDK (solo Android)
Asegúrese de que android SDK está instalado y de que la ANDROID_HOME variable de entorno apunta a su ubicación. Si ya ha configurado la máquina para el desarrollo de Android con .NET MAUI, esto ya debería estar configurado.
Preparación de la aplicación de .NET MAUI para pruebas
Todos los elementos de interfaz de usuario con los que desea interactuar desde las pruebas deben tener la AutomationId propiedad establecida en un valor único. Esta propiedad se asigna a identificadores de accesibilidad específicos de la plataforma que Appium usa para buscar elementos.
<Button
x:Name="CounterBtn"
AutomationId="CounterBtn"
Text="Click me"
SemanticProperties.Hint="Counts the number of times you click"
Clicked="OnCounterClicked"
HorizontalOptions="Fill" />
Registro de actividad de Android
Para Android, Appium debe conocer el nombre completo de la actividad para iniciar tu aplicación. Agregue un [Register] atributo a la MainActivity clase con un valor que coincida con el nombre del paquete de la aplicación:
[Register("com.companyname.myapp.MainActivity")]
public class MainActivity : MauiAppCompatActivity
{
}
Asegúrese de que el valor del Register atributo coincida con el ApplicationId en su archivo de proyecto y la capacidad de la AppActivity en su configuración de prueba.
Creación de los proyectos de prueba
Una estructura de proyecto probada usa proyectos de prueba independientes por plataforma, con código de prueba compartido en un proyecto NoTargets. Este es el mismo patrón que se usa en el ejemplo official y el código base de .NET MAUI:
MySolution/
├── MauiApp/ # Your .NET MAUI app
├── UITests.Shared/ # Shared test code (NoTargets project)
├── UITests.Android/ # Android-specific setup
├── UITests.iOS/ # iOS-specific setup
├── UITests.Windows/ # Windows-specific setup
└── UITests.macOS/ # macOS-specific setup
Cada proyecto de plataforma compila el código compartido mediante la vinculación a los archivos del proyecto compartido. Esto significa que todas las pruebas del proyecto Compartido se ejecutan en todas las plataformas que se prueban. El propio proyecto compartido no se puede ejecutar directamente. Ejecute siempre uno de los proyectos de prueba específicos de la plataforma.
Importante
Mantenga el mismo espacio de nombres en todos los proyectos de prueba (por ejemplo, UITests). El atributo [SetUpFixture] de NUnit ejecuta métodos de setup para todos los fixtures de prueba del mismo espacio de nombres. Si los espacios de nombres no coinciden, el controlador de Appium no se inicializará cuando se ejecuten las pruebas.
Paquetes NuGet del proyecto de prueba de plataforma
Cada proyecto de prueba específico de la plataforma necesita los siguientes paquetes NuGet:
<ItemGroup>
<PackageReference Include="Appium.WebDriver" Version="8.0.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
<PackageReference Include="NUnit" Version="3.14.0" />
<PackageReference Include="NUnit3TestAdapter" Version="4.5.0" />
</ItemGroup>
Sugerencia
En lugar de crear proyectos de prueba desde cero, puede instalar plantillas mantenidas por la comunidad que estructuran la estructura completa del proyecto para usted. Para obtener más información, consulte el repositorio Template.Maui.UITesting GitHub.
Escritura de una clase de prueba base
Cree un archivo BaseTest.cs en el proyecto compartido. Esta clase base proporciona acceso al controlador de Appium y a un método auxiliar que controla una diferencia en cómo se encuentran los elementos en Windows frente a otras plataformas:
using OpenQA.Selenium.Appium;
using OpenQA.Selenium.Appium.Windows;
namespace UITests;
public abstract class BaseTest
{
protected AppiumDriver App => AppiumSetup.App;
protected AppiumElement FindUIElement(string id)
{
if (App is WindowsDriver)
{
return App.FindElement(MobileBy.AccessibilityId(id));
}
return App.FindElement(MobileBy.Id(id));
}
}
En Windows, se accede a AutomationId a través de MobileBy.AccessibilityId. En Android, iOS y macOS, use MobileBy.Id.
Iniciar el servidor de Appium
El servidor de Appium debe ejecutarse antes de ejecutar pruebas. El enfoque más sencillo es iniciarlo manualmente desde un terminal:
appium
El servidor se inicia en http://127.0.0.1:4723 de forma predeterminada. Déjelo ejecutándose mientras realiza las pruebas.
Iniciar el servidor mediante programación (opcional)
Para que el conjunto de pruebas sea independiente, puede iniciar y detener el servidor de Appium como parte de la ejecución de pruebas. Cree un AppiumServerHelper.cs archivo en el proyecto compartido:
using OpenQA.Selenium.Appium.Service;
namespace UITests;
public static class AppiumServerHelper
{
private static AppiumLocalService? _appiumLocalService;
public const string DefaultHostAddress = "127.0.0.1";
public const int DefaultHostPort = 4723;
public static void StartAppiumLocalServer(
string host = DefaultHostAddress,
int port = DefaultHostPort)
{
if (_appiumLocalService is not null)
return;
var builder = new AppiumServiceBuilder()
.WithIPAddress(host)
.UsingPort(port);
_appiumLocalService = builder.Build();
_appiumLocalService.Start();
}
public static void DisposeAppiumLocalServer()
{
_appiumLocalService?.Dispose();
}
}
Configuración de Appium para cada plataforma
Cada proyecto de plataforma contiene un AppiumSetup.cs archivo que configura el controlador de Appium con opciones específicas de la plataforma. Esta clase usa el atributo de [SetUpFixture] NUnit para inicializar el controlador una vez antes de que se ejecuten todas las pruebas.
Android
using NUnit.Framework;
using OpenQA.Selenium.Appium;
using OpenQA.Selenium.Appium.Android;
using OpenQA.Selenium.Appium.Enums;
namespace UITests;
[SetUpFixture]
public class AppiumSetup
{
private static AppiumDriver? driver;
public static AppiumDriver App => driver
?? throw new NullReferenceException("AppiumDriver is null");
[OneTimeSetUp]
public void RunBeforeAnyTests()
{
AppiumServerHelper.StartAppiumLocalServer();
var androidOptions = new AppiumOptions
{
AutomationName = "UIAutomator2",
PlatformName = "Android",
};
// For debug builds, use NoReset to preserve Fast Deployment libraries
androidOptions.AddAdditionalAppiumOption(
MobileCapabilityType.NoReset, "true");
androidOptions.AddAdditionalAppiumOption(
AndroidMobileCapabilityType.AppPackage,
"com.companyname.myapp");
androidOptions.AddAdditionalAppiumOption(
AndroidMobileCapabilityType.AppActivity,
"com.companyname.myapp.MainActivity");
driver = new AndroidDriver(androidOptions);
}
[OneTimeTearDown]
public void RunAfterAnyTests()
{
driver?.Quit();
AppiumServerHelper.DisposeAppiumLocalServer();
}
}
Nota:
Para las compilaciones de depuración en Android, establezca NoReset en true. Las compilaciones de depuración utilizan "Fast Deployment", y el comportamiento de restablecimiento predeterminado de Appium elimina las bibliotecas que requiere "Fast Deployment". En el caso de las compilaciones de versión, puede establecer la App propiedad en la ruta de acceso completa del archivo firmado .apk .
Ios
using NUnit.Framework;
using OpenQA.Selenium.Appium;
using OpenQA.Selenium.Appium.iOS;
namespace UITests;
[SetUpFixture]
public class AppiumSetup
{
private static AppiumDriver? driver;
public static AppiumDriver App => driver
?? throw new NullReferenceException("AppiumDriver is null");
[OneTimeSetUp]
public void RunBeforeAnyTests()
{
AppiumServerHelper.StartAppiumLocalServer();
var iOSOptions = new AppiumOptions
{
AutomationName = "XCUITest",
PlatformName = "iOS",
PlatformVersion = "17.0",
DeviceName = "iPhone 15 Pro",
App = "com.companyname.myapp",
};
driver = new IOSDriver(iOSOptions);
}
[OneTimeTearDown]
public void RunAfterAnyTests()
{
driver?.Quit();
AppiumServerHelper.DisposeAppiumLocalServer();
}
}
Windows
using NUnit.Framework;
using OpenQA.Selenium.Appium;
using OpenQA.Selenium.Appium.Windows;
namespace UITests;
[SetUpFixture]
public class AppiumSetup
{
private static AppiumDriver? driver;
public static AppiumDriver App => driver
?? throw new NullReferenceException("AppiumDriver is null");
[OneTimeSetUp]
public void RunBeforeAnyTests()
{
AppiumServerHelper.StartAppiumLocalServer();
var windowsOptions = new AppiumOptions
{
AutomationName = "windows",
PlatformName = "Windows",
App = "com.companyname.myapp_9zz4h110yvjzm!App",
};
driver = new WindowsDriver(windowsOptions);
}
[OneTimeTearDown]
public void RunAfterAnyTests()
{
driver?.Quit();
AppiumServerHelper.DisposeAppiumLocalServer();
}
}
Mac Catalyst
using NUnit.Framework;
using OpenQA.Selenium.Appium;
using OpenQA.Selenium.Appium.Enums;
using OpenQA.Selenium.Appium.Mac;
namespace UITests;
[SetUpFixture]
public class AppiumSetup
{
private static AppiumDriver? driver;
public static AppiumDriver App => driver
?? throw new NullReferenceException("AppiumDriver is null");
[OneTimeSetUp]
public void RunBeforeAnyTests()
{
AppiumServerHelper.StartAppiumLocalServer();
var macOptions = new AppiumOptions
{
AutomationName = "mac2",
PlatformName = "Mac",
App = "/path/to/MyApp/bin/Debug/net10.0-maccatalyst/maccatalyst-x64/MyApp.app",
};
macOptions.AddAdditionalAppiumOption(
IOSMobileCapabilityType.BundleId,
"com.companyname.myapp");
driver = new MacDriver(macOptions);
}
[OneTimeTearDown]
public void RunAfterAnyTests()
{
driver?.Quit();
AppiumServerHelper.DisposeAppiumLocalServer();
}
}
Importante
Para Mac Catalyst, debe establecer la BundleId opción. Sin ella, Appium automatizará Finder en lugar de tu aplicación.
Escribe pruebas de IU
Agregue clases de prueba al proyecto Compartido para que se ejecuten en todas las plataformas. Cada clase de prueba debe heredar de BaseTest. En el ejemplo siguiente se prueba el botón contador de la plantilla de .NET MAUI predeterminada:
using NUnit.Framework;
namespace UITests;
public class MainPageTests : BaseTest
{
[Test]
public void AppLaunches()
{
App.GetScreenshot().SaveAsFile($"{nameof(AppLaunches)}.png");
}
[Test]
public void ClickCounterTest()
{
// Arrange
var element = FindUIElement("CounterBtn");
// Act
element.Click();
Task.Delay(500).Wait();
// Assert
App.GetScreenshot().SaveAsFile($"{nameof(ClickCounterTest)}.png");
Assert.That(element.Text, Is.EqualTo("Clicked 1 time"));
}
}
El FindUIElement método localiza los controles por su AutomationId valor. También puede usar otros selectores:
| Selector | Método | Notas |
|---|---|---|
| AutomationId |
MobileBy.Id() o MobileBy.AccessibilityId() |
Preferido. Use el FindUIElement asistente para abstraer la diferencia de la plataforma. |
| XPath | MobileBy.XPath() |
Más lento, pero útil para consultas complejas. |
| Nombre de la clase | MobileBy.ClassName() |
Busca elementos por su nombre de clase nativo. |
Sugerencia
Establezca AutomationId en cada elemento que quiera probar. Es la manera más confiable y eficaz de localizar elementos en todas las plataformas.
Ejecutar pruebas de IU
Antes de ejecutar pruebas, asegúrese de:
- La aplicación .NET MAUI se implementa en el dispositivo o emulador de destino.
- Para Android, se arranca un emulador o se conecta un dispositivo físico.
- Para iOS, se ejecuta un simulador o se aprovisiona un dispositivo.
- Para Windows, la aplicación se instala (por ejemplo, ejecutándola desde Visual Studio primero).
- Para macOS, el
.apppaquete se compila y está disponible en la ruta especificada enAppiumSetup.cs.
Ejecute pruebas desde Visual Studio mediante Test Explorer o desde la línea de comandos:
dotnet test UITests.Android/UITests.Android.csproj
Reemplace la ruta de acceso del proyecto por la plataforma que desea probar.
Consulte también
- Pruebas unitarias
- Introducción a las pruebas de interfaz de usuario .NET MAUI aplicaciones con Appium (entrada de blog)
- Usa BrowserStack App Automate con Appium UI Tests para aplicaciones .NET MAUI (entrada de blog)
- Documentación de Appium
- Template.Maui.UITesting (plantillas de proyecto)