[Testing] Pruebas de acoplamiento

Por todos creo que son conocidas las pruebas unitarias, integración, aceptación y funcionales, pero no son tan conocidas las pruebas de acoplamiento. A ráiz de este post tenía pendiente escribir un post acerca de este tipo de pruebas y lo que pueden ayudarnos mantener nuestra aplicación desacoplada entre capas o tecnologías.

Vamos a ver todo esto con un ejemplo, que pienso que es la mejor manera de entenderlo.

Tenemos un proyecto que contiene nuestra lógica de negocio, con un servicio que se encargará de realizar todas las operaciones del carrito de la compra de un usuario.

image

Nuestra lógica de negocio tiene que ser agnóstica de las demas capas (Presentación, acceso a datos) por lo que en ningun caso deberíamos permitir por ejemplo que en nuestro proyecto se utilicen variables de sesión ¿No?

La clase Session está dentro de la assembly System.Web y  para acceder a ella necesitamos acceder al contexto web por medio de la clase HttpContext por lo tanto en nuestro test de acoplamiento vamos a controlar que cuando alguien añada una referencia a System.Web nuestro test falle lanzando un mensaje. Vamos a crear un proyecto de librería de clases para los tests y vamos a utilizat NUnit que podemos añadir las referencias con NuGet:

image

image

Vamos es escribir el test:

[TestFixture]

public class ShoppingCartServiceTests

{

    [Test]

    public void ShoppingCartService_Should_Not_Contains_System_Web_Reference()

    {

        var businessLogicAssembly = Assembly.GetAssembly(typeof (ShoppingCartService));

 

        var referencedAssemblies = businessLogicAssembly.GetReferencedAssemblies();

 

        Assert.IsFalse(referencedAssemblies.Any(a => a.Name == "System.Web"),

            "ShoppingCartService shouldn't contains a System.Web.dll reference. Please remove it ASAP!!!");

    }

}

Haciendo uso de System.Reflection, cargamos el ensamblado de nuestra lógica de negocio y comprobamos que en la assemblies referenciadas no este System.Web. Ejecutamos nuestro test y pasa correctamente:

image

Imaginar que tenemos todo montado con un servidor de integración continua para compilar y pasar los test de manera automática y un desarrollador que no entiende cual es el problema del acoplamiento, se dispone a codificar este servicio. Decide que va a almacenar el carrito de la compra en una variable de Session y para no empezar a meter variables de sesión por todos lados, se crea un helper para encapsular todas las variables de sesión y lo crea dentro de la clase de negocio, algo como esto:

public class SessionHelper

{

    public static string ShoppinCart

    {

        get

        {

            return System.Web.HttpContext.Current.Session["ShoppinCart"] == null ?

                System.Web.HttpContext.Current.Session["ShoppinCart"].ToString() : null;

        }

        set

        {

            System.Web.HttpContext.Current.Session["ShoppinCart"] = value;

        }

    }

}

¿Veis el problema?

Estamos acoplando nuestra lógica de negocio a una tecnología Web (ASP.NET 4.0) ¿Qué pasará cuando usemos esta lógica de negocio en un cliente Windows? Pues que fallará, por que el contexto web será nulo, pero como hemos creado un test especifico para revisar este acoplamiento, cuando suba el código a nuestro repositorio, se compilará correctamente y al pasar las pruebas fallará:

image

image

Si no queremos entrar en tanto detalle y estar revisando el acoplamiento a tecnologías, podemos hacer pruebas para controlar el acoplamiento entre capas, por ejemplo que la capa de presentación nunca debe tener una referencia con la capa de datos…

Un saludo.

2 comentarios en “[Testing] Pruebas de acoplamiento”

  1. Hola Cristhian,

    Gracias por tu comentario 🙂

    ¿Y si la versión que tienes de VS 2010 no es la Visual Studio 2010 Ultimate? ¿Como controlas en ese diagrama ciertas dependencias como System.Web?

    Un saludo

Deja un comentario

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