Saltar al contenido

Testing de software: Pruebas unitarias y de integración.

Compartir en:

En el desarrollo de software, es esencial asegurarse de que el código funciona correctamente y se comporta de la manera esperada. Una forma de lograr esto es mediante la creación de pruebas automatizadas que se ejecutan con cada cambio en el código. Las pruebas unitarias y las pruebas de integración son dos tipos de pruebas que son especialmente importantes para garantizar la calidad del software.

Pruebas unitarias

Las pruebas unitarias son una herramienta esencial para el desarrollo de software de calidad. Estas pruebas automatizadas se utilizan para verificar el comportamiento de una sola unidad de código, como una función o un método, y asegurar que estos componentes funcionan correctamente en aislamiento. Esto es importante porque permite detectar errores temprano en el proceso de desarrollo, antes de que el sistema completo se integre y sea probado.

La independencia entre las pruebas unitarias es otra característica importante de estas pruebas. Cada prueba debe ser capaz de ser ejecutada de forma independiente, sin depender de otros componentes del sistema. Esto garantiza que, si una prueba falla, no se verá afectado el resto del sistema y se podrá identificar fácilmente el componente que presenta problemas.

Además de detectar errores temprano, las pruebas unitarias también proporcionan una mayor confianza en el código y en los cambios realizados. Al tener un conjunto de pruebas automatizadas que cubren los diferentes casos de uso y escenarios, los desarrolladores pueden estar seguros de que los cambios realizados no afectarán negativamente al resto del sistema y mejorarán la calidad del software en general.

Veamos un ejemplo simple:

using Microsoft.VisualStudio.TestTools.UnitTesting;
[TestClass]
public class ExampleTest
{
    [TestMethod]
    public void TestAddition()
    {
        // Arrange
        int a = 2;
        int b = 3;
        int expectedResult = 5;
        // Act
        int result = Example.Add(a, b);
        // Assert
        Assert.AreEqual(expectedResult, result);
    }
}

En este ejemplo, estamos utilizando el framework de pruebas de unidad de Microsoft, llamado MSTest, para escribir nuestra prueba. La clase ExampleTest contiene un solo método de prueba llamado TestAddition. Este método se encarga de verificar el comportamiento de la función de suma de la clase Example.

En la sección «Arrange» del código, estamos estableciendo los valores de los operandos (a y b) y el resultado esperado (expectedResult) para la suma. En la sección «Act» llamamos a la función Example.Add con los valores de a y b y almacenamos el resultado en la variable result. Finalmente, en la sección «Assert» comprobamos si el resultado esperado es igual al resultado obtenido, usando el método Assert.AreEqual. Si el resultado esperado es igual al resultado obtenido la prueba pasa, de lo contrario falla.

Pruebas de integración

Las pruebas de integración pueden incluir una variedad de verificaciones, tales como la verificación de la integridad de la base de datos, la comunicación entre servicios, o la interacción de un componente con una API externa. Estas pruebas son esenciales para asegurar que el sistema completo funcione correctamente y proporciona una mayor confianza en el código y en los cambios realizados. Al tener un conjunto de pruebas de integración automatizadas que cubren los diferentes casos de uso y escenarios, los desarrolladores pueden estar seguros de que los cambios realizados no afectarán negativamente al resto del sistema y mejorarán la calidad del software en general.

Además de detectar problemas en la integración temprano, las pruebas de integración también proporcionan una mayor confianza en el sistema completo. Al tener un conjunto de pruebas automatizadas que cubren los diferentes casos de uso y escenarios, los desarrolladores pueden estar seguros de que el sistema completo funciona correctamente y proporcionará un servicio de calidad a los usuarios finales. Es importante mencionar que estas pruebas deben ser ejecutadas en ambientes similares a producción para garantizar la confiabilidad de los resultados obtenidos.

Veamos un ejemplo simple:

using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Net.Http;
[TestClass]
public class ExampleIntegrationTest
{
    [TestMethod]
    public async Task TestAPI()
    {
        // Arrange
        HttpClient client = new HttpClient();
        client.BaseAddress = new Uri("http://example.com/api/");
        
        // Act
        HttpResponseMessage response = await client.GetAsync("users");
        string responseContent = await response.Content.ReadAsStringAsync();
        
        // Assert
        Assert.IsTrue(response.IsSuccessStatusCode);
        Assert.IsNotNull(responseContent);
    }
}

Esta es una verificación sencilla de una API externa.

En la sección «Arrange» del código, estamos creando una nueva instancia de HttpClient y estableciendo la dirección base de la API. En la sección «Act» estamos haciendo una petición GET a la ruta «users» de la API y almacenando la respuesta en la variable response, y también leyendo el contenido de la respuesta y almacenando en responseContent. Finalmente, en la sección «Assert» comprobamos si la respuesta tuvo éxito y si responseContent no es nulo, usando el método Assert.IsTrue y Assert.IsNotNull respectivamente. Si ambas condiciones se cumplen, la prueba pasa, de lo contrario falla.

Esto es solo una parte, la imaginación en las pruebas es la clave para conseguir testear bien el software, aquí tenéis otro ejemplo con una base de datos:

using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Data.SqlClient;
[TestClass]
public class ExampleIntegrationTest
{
    [TestMethod]
    public void TestDatabase()
    {
        // Arrange
        string connectionString = "Server=localhost;Database=exampleDB;User Id=sa;Password=password;";
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();
            string query = "SELECT COUNT(*) FROM Users";
            using (SqlCommand command = new SqlCommand(query, connection))
            {
                // Act
                int userCount = (int)command.ExecuteScalar();
                
                // Assert
                Assert.AreEqual(5, userCount);
            }
        }
    }
}

Ambas tipos de pruebas son importantes para garantizar la calidad del software, ya que las pruebas unitarias ayudan a detectar errores temprano en el proceso de desarrollo, mientras que las pruebas de integración ayudan a detectar problemas de integridad en el sistema en su conjunto.

Conclusión

En conclusión, escribir pruebas automatizadas es como tener un superpoder para detectar errores antes de que se conviertan en monstruos de Halloween en tu sistema. Es especialmente importante tanto para las pruebas unitarias como para las pruebas de integración, ya que ambas son como Batman y Robin, un equipo inseparable para asegurar que tu software sea lo mejor posible.

Estas pruebas ayudan a garantizar que el código funcione como un reloj suizo y se comporte de la manera esperada, lo que reduce el riesgo de errores y facilita la detección y solución de problemas. Al tener un conjunto de pruebas automatizadas que cubren los diferentes casos de uso y escenarios, los desarrolladores pueden estar seguros de que los cambios realizados no afectarán negativamente al resto del sistema y mejorarán la calidad del software en general. Es importante mencionar que escribir pruebas automatizadas es una práctica esencial en el desarrollo de software, y es especialmente importante tanto para las pruebas unitarias como para las pruebas de integración. Así que no te olvides de escribir tus pruebas automatizadas!


Juan Ibero

Inmerso en la Evolución Tecnológica. Ingeniero Informático especializado en la gestión segura de entornos TI e industriales, con un profundo énfasis en seguridad, arquitectura y programación. Siempre aprendiendo, siempre explorando.

Compartir en:

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *