Las pruebas unitarias (Unit Testing) son parte fundamental del proceso de desarrollo de software. Son pruebas desarrolladas y ejecutadas por los developers (desarrolladores).
Una prueba unitaria (o prueba de componente, de acuerdo con el ISTQB) es un trozo de código (método o función) diseñado para comprobar que el código principal está funcionando como esperábamos.
Generalmente, las pruebas unitarias se hacen de manera aislada del resto del sistema. Las pruebas unitarias pueden hacer uso de mocks, servicios de virtualización, harnesses, stubs y drivers (controladores). Las pruebas unitarias pueden cubrir aspectos funcionales (por ejemplo, exactitud de cálculos matemáticos) o aspectos no funcionales (por ejemplo, búsqueda de fugas de memoria)
Objetivos del Unit Testing
- Reducir el riesgo en la calidad del producto.
- Verificar si los comportamientos funcionales y no funcionales del componente funcionan de acuerdo a lo especificado por el cliente.
- Generar confianza en la calidad del componente probado.
- Encontrar defectos en el componente.
- Prevenir que los defectos se escapen a los más altos niveles de pruebas.
Test Basis
De acuerdo con el ISTQB, son todos los documentos de los cuales se pueden inferir todos los requisitos de un componente o sistema. En otras palabras, es la documentación sobre la cual se basan los test cases (casos de prueba).
¿Qué podemos probar? (Test Objects)
- Componentes, unidades o módulos.
- Código y estructuras de datos.
- Clases.
- Módulos de base de datos.
Nota: Cuando se realicen pruebas unitarias, es muy importante considerar que éstas deben simular comportamientos esperados. Por ninguna razón deben hacer modificaciones a bases de datos o algún servicio.
¿Qué defectos y fallas podemos encontrar al hacer Unit Testing?
- Funcionalidad incorrecta del componente probado (por ejemplo, algo no descrito en las especificaciones del diseño del código o algún requerimiento perdido).
- Problemas en el flujo de datos.
- Código y lógica incorrectos.

¿Cuáles son los beneficios del Unit Testing?
- Hace el proceso de desarrollo de software más ágil.
- Mejora la calidad del código.
- Encuentra bugs (errores) en el software de forma temprana.
- Facilita los cambios en el código y simplifica su integración.
- Provee documentación.
- Nos ayuda a debuggear (analizar paso a paso) nuestro código.
- Nos ayuda también a diseñar mejor nuestros sistemas.
- Reduce los costos y el tiempo de desarrollo.
¿Cómo puedo empezar a crear pruebas unitarias?
Los siguientes pasos forman parte de la documentación Unosquare Labs Best Practices (repositorio público) que alguna vez creé cuando trabajé con ellos como intern (becario) de Software Developer. Agradezco a Geovanni Pérez el permitirme compartir esta información con la comunidad.
- Crea una clase abstracta para la clase que será probada. El nombre de esta clase debe tener el sufijo Test (por ejemplo, YourAwesomeClassTest). Esta clase solamente contendrá miembros compartidos (propiedades, atributos, variables, constantes, etcétera) que serán usados por nuestras pruebas unitarias, además de contener los métodos SetUp() y TearDown() (los cuales pueden ser opcionales si no se requiere inicializar algún objeto, por ejemplo).
- Crea las clases de prueba con el nombre de los métodos que serán probados (por ejemplo, MyAwesomeMethodToTest). Estas clases deberán heredar de la clase base (la clase abstracta), si es necesario, para hacer uso de los miembros compartidos.
- El nombre de la clase debe ser descriptivo y fácil de entender.
- Dentro de la clase que contendrá tus pruebas, crea los métodos con el nombre de los posibles escenarios que podrán ocurrir. ¿Cuáles serán tus InitialConditions y tus ExpectedConditions?
- De ser necesario, usa mocks o stubs en tus pruebas
- Si trabajas con algún lenguaje de programación que haga uso de namespaces, cambia el nombre de éste (por ejemplo, YourAwesomeWorkspace.Test.ClassTests, en plural).
- Si no hay nada que configurar o compartir, puedes omitir la creación de la clase abstracta.
A continuación, muestro el siguiente patrón desarrollado en base a los pasos descritos arriba:
using NUnit.Framework;
namespace YourWorkspace.Test.YourAwesomeClassTest
{
public abstract class YourAwesomeClassTest
{
// Your setup
}
[TestFixture]
public class SomeMethodToTest : YourAwesomeClassTest
{
[Test]
public void OnePossibleScenarioOfTheMethod_ExpectedResult()
{
// Your code
}
// Other methods
}
// Other classes
}
Veamos un ejemplo (escrito en C#):
using NUnit.Framework;
namespace YourWorkspace.Test.CalculatorTests
{
public abstract class CalculatorTest
{
protected double x = 234.12, y = 134;
protected string xString = "Hi", yString = "Something";
}
[TestFixture]
public class Addition : CalculatorTest
{
[Test]
public void SumTwoNumbers_ReturnsTrue()
{
var calc = new Calculator();
Assert.AreEqual(calc.Addition(x, y), 368.12);
}
[Test]
public void SumTwoNumbers_ReturnsFalse()
{
var calc = new Calculator();
Assert.AreEqual(calc.Addition(x, y), 5);
}
[Test]
public void SumTwoRandomVariables_ThrowsException()
{
var calc = new Calculator();
Assert.Throws<Exception>(() => {
calc.Addition(xString, y);
});
}
//Other possible scenarios
}
//Your other classes to test
}
Entre las ventajas que podemos destacar encontramos que nuestro código de pruebas se encuentra bien organizado y estructurado, los nombres de los métodos son más descriptivos y el mantenimiento de nuestras pruebas es más fácil de hacer.
Espero esta información haya sido de su utilidad. ¡Nos vemos!
Bibliografía.-
- ¿Qué es el Unit Testing y por qué es importante? Platzi. Consultado el 21 de diciembre de 2020 en: https://platzi.com/blog/que-es-unit-testing/
- Defining unit testing, step by step. The Art of Unit Testing (with examples in C#). Roy Osherove. Manning Publications Co. 2014
- 8 benefits of Unit Testing. DZone. Consultado el 21 de diciemre de 2020 en: https://dzone.com/articles/top-8-benefits-of-unit-testing
- Unit Testing. The C# Unosquare Labs Best Practices. 2017. Consultado el 21 de diciembre de 2020 en: https://github.com/unosquare/best-practices/tree/master/C%23#unit-testing
_____________________________________________________________
Síguenos en: Facebook, Instagram, Twitter y LinkedIn
¡No olvides seguirme en Twitter!: @_ArCiGo