Pruebas unitarias
Las aplicaciones multiplataforma deben probarse como se usarían en el mundo real para mejorar su calidad, fiabilidad y rendimiento. Se deben realizar muchos tipos de pruebas en una aplicación, incluidas las pruebas unitarias, las pruebas de integración y las pruebas de interfaz de usuario. Las pruebas unitarias son la forma más común y son esenciales para crear aplicaciones de alta calidad.
Una prueba unitaria toma una pequeña unidad de una aplicación, normalmente un método, la aísla del resto del código y comprueba que se comporta según lo previsto. Su objetivo es comprobar que cada unidad de funcionalidad funciona según lo previsto, para que los errores no se propaguen en toda la aplicación. Detectar un error allí donde se produce es más eficaz que observar el efecto de un error indirectamente en un punto secundario de error.
Las pruebas unitarias normalmente deben usar el patrón AAA:
Paso | Descripción |
---|---|
Organizar | Inicializar objetos y establecer el valor de los datos que se pasan al método en prueba. |
Acción | Invocar el método en prueba con los argumentos necesarios. |
Assert | Comprobar que la acción del método en prueba se comporta según lo previsto. |
Este patrón garantiza que las pruebas unitarias sean legibles, autodescriptivas y coherentes.
Las pruebas unitarias tienen el efecto más significativo en la calidad del código cuando son una parte integral del flujo de trabajo de desarrollo de software. Las pruebas unitarias pueden actuar como documentación de diseño y especificaciones funcionales para la aplicación. En cuanto se haya escrito un método, se deben escribir pruebas unitarias que comprueben el comportamiento del método en respuesta a casos de datos de entrada estándar, límites e incorrectos, y que comprueben las suposiciones explícitas o implícitas realizadas por el código. Como alternativa, con el desarrollo controlado por pruebas, las pruebas unitarias se escriben antes que el código.
Importante
Las pruebas unitarias son muy eficaces frente a la regresión. Es decir, una funcionalidad que solía funcionar, pero que ha sido perturbada por una actualización incorrecta.
xUnit es el marco de pruebas recomendado para aplicaciones .NET MAUI.
Adición de pruebas xUnit a una solución .NET MAUI
Para agregar pruebas xUnit a la solución .NET MAUI:
Use Visual Studio para agregar un nuevo proyecto de prueba de xUnit a la solución.
O BIEN
Use la CLI de .NET para crear un nuevo proyecto de prueba de xUnit y agregarlo a la solución. Para obtener más información, consulte Pruebas unitarias de C# en .NET mediante dotnet test y xUnit.
El archivo de proyecto (.csproj) para el proyecto de prueba de xUnit será similar al ejemplo siguiente:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
<IsTestProject>true</IsTestProject>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="coverlet.collector" Version="6.0.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
<PackageReference Include="xunit" Version="2.5.3" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.3" />
</ItemGroup>
<ItemGroup>
<Using Include="Xunit" />
</ItemGroup>
</Project>
La propiedad de compilación $(TargetFramework)
especifica el marco de trabajo de destino del proyecto de prueba. Esta será la versión más reciente de .NET instalada en el equipo.
El paquete xunit
incluye paquetes secundarios que incluyen el propio marco de pruebas y analizadores de Roslyn que detectan problemas comunes con pruebas unitarias. Los paquetes xunit.runner.visualstudio
y Microsoft.NET.Test.Sdk
son necesarios para ejecutar las pruebas unitarias en Visual Studio, así como con el comando dotnet test
. Los paquetes coverlet.collector
permiten recopilar cobertura de código. Si no pretende recopilar cobertura de código, puede quitar esta referencia de paquete. Para obtener más información sobre la cobertura de código para las pruebas unitarias, consulte Uso de la cobertura de código para pruebas unitarias.
Hay dos enfoques principales para estructurar la aplicación para las pruebas unitarias:
- El código que probará está en un proyecto de biblioteca de clases .NET MAUI.
- El código que probará se encuentra en un proyecto de aplicación .NET MAUI.
Cada enfoque requiere una configuración específica.
Configuración de un proyecto de biblioteca de clases .NET MAUI para pruebas unitarias
Con este enfoque, el código que quiere probar está en un proyecto de biblioteca de clases .NET MAUI que consume el proyecto de aplicación .NET MAUI. Para escribir pruebas unitarias en la biblioteca de clases .NET MAUI será necesario actualizar las plataformas de destino usadas por el proyecto. Esto se puede conseguir agregando el valor de la propiedad de compilación $(TargetFramework)
del archivo de proyecto de prueba xUnit (.csproj) a la propiedad de compilación $(TargetFrameworks)
en el archivo de proyecto de la biblioteca de clases .NET MAUI:
<TargetFrameworks>net8.0;net8.0-android;net8.0-ios;net8.0-maccatalyst</TargetFrameworks>
En este ejemplo, se ha agregado un valor de net8.0
a la propiedad de compilación $(TargetFrameworks)
en el archivo de proyecto de biblioteca de clases .NET MAUI.
A continuación, debe agregar una referencia al proyecto de biblioteca de clases .NET MAUI desde el proyecto de prueba de xUnit.
Configuración de un proyecto de aplicación.NET MAUI para pruebas unitarias
Con este enfoque, el código que quiere probar está en un proyecto de aplicación .NET MAUI. Para escribir pruebas unitarias en el proyecto de aplicación .NET MAUI será necesario actualizar las plataformas de destino usadas por el proyecto. Esto se puede conseguir agregando el valor de la propiedad de compilación $(TargetFramework)
del archivo de proyecto de prueba xUnit (.csproj) a la propiedad de compilación $(TargetFrameworks)
en el archivo de proyecto de la aplicación .NET MAUI:
<TargetFrameworks>net8.0;net8.0-android;net8.0-ios;net8.0-maccatalyst</TargetFrameworks>
En este ejemplo, se ha agregado un valor de net8.0
a la propiedad de compilación $(TargetFrameworks)
en el archivo de proyecto de aplicación .NET MAUI.
También es necesario modificar el proyecto de aplicación .NET MAUI para que no produzca un archivo ejecutable para el marco de trabajo de destino usado por el proyecto de prueba xUnit. Esto se puede lograr agregando una condición a la propiedad de compilación $(OutputType)
en el archivo de proyecto de aplicación .NET MAUI:
<OutputType Condition="'$(TargetFramework)' != 'net8.0'">Exe</OutputType>
En este ejemplo, el proyecto de aplicación .NET MAUI solo genera un archivo ejecutable cuando la plataforma de destino no es net8.0
.
A continuación, debe agregar una referencia al proyecto de aplicación .NET MAUI desde el proyecto de prueba de xUnit.
Escribir pruebas unitarias
xUnit admite dos tipos diferentes de pruebas unitarias:
Tipo de prueba | Atributo | Descripción |
---|---|---|
Hechos | Fact |
Pruebas que siempre son verdaderas, que prueban condiciones invariables. |
Teorías | Theory |
Pruebas que solo son verdaderas para un conjunto determinado de datos. |
Las pruebas unitarias deben colocarse en el proyecto de prueba de xUnit y estar decoradas con el atributo [Fact]
o [Theory]
. En el ejemplo siguiente se muestran las pruebas unitarias que usan el atributo [Fact]
:
namespace MyUnitTests
{
public class MyTests
{
[Fact]
public void PassingTest()
{
Assert.AreEqual(4, 2+2);
}
[Fact]
public void FailingTest()
{
Assert.AreEqual(5, 2+2);
}
}
}
En este ejemplo, las pruebas representan una prueba deliberadamente superada y otra con errores.
En el ejemplo siguiente se muestran las pruebas unitarias que usan el atributo [Theory]
:
namespace MyUnitTests
{
public class MyTests
{
[Theory]
[InlineData(3)]
[InlineData(4)]
[InlineData(5)]
public void MyTheoryTest(int value)
{
Assert.True(value % 2 == 1);
}
}
}
En este ejemplo, aunque solo haya un método de prueba, en realidad hay tres pruebas porque la teoría se ejecutará una vez para cada elemento de datos.
Sugerencia
Pruebe una operación con cada prueba unitaria. A medida que se expande la complejidad de una prueba, hace que la comprobación de esa prueba sea más difícil. Al limitar una prueba unitaria a un solo problema, puede asegurarse de que sus pruebas son repetibles, aisladas y tienen un tiempo de ejecución más corto. Para más información, consulte los Procedimientos recomendados de pruebas unitarias.
Ejecutar pruebas unitarias
Las pruebas unitarias se pueden ejecutar en el Explorador de pruebas en Visual Studio o con el comando dotnet test
. Para obtener información sobre el explorador de pruebas, consulte Ejecutar pruebas unitarias con el explorador de pruebas. Para obtener información sobre el comando dotnet test
, consulte Pruebas unitarias de C# en .NET mediante dotnet test y xUnit y dotnet test.
Ejecución de pruebas unitarias mediante ejecutores de dispositivos
Las pruebas unitarias también se pueden ejecutar en un dispositivo con un ejecutor de dispositivos. Un ejecutor de dispositivos es una aplicación de ejecutor de pruebas que proporciona un shell de ejecutor visual y algunos enlaces para ejecutarse desde la CLI mediante XHarness. Para obtener más información, consulte la documentación de la wiki de Ejecutores de dispositivos de prueba.