Lo que he aprendido: tests en Matlab

He contado más veces que programo a diario sin saber programar. Esto me lleva a situaciones absurdas y unas pérdidas de tiempo sin igual a las que me gustaría poner remedio. Por ese motivo, estoy intentando aprender tácticas que me aligeren el trabajo. Los tests son una de ellas, así que he estado jugando un poco con los tests de Matlab.

Os cuento lo que he hecho y provecho para hacer propaganda de mi campo de estudio: las vibraciones.

Definir la función

Imaginemos que queremos comprobar que una determinada función se comporta de una determinada manera. Voy a usar como ejemplo el MAC (Modal Assurance Criterion), un número que nosotros los ingenieros mecánicos usamos para ver cuánto se parecen dos modos. Dicho así suena muy complejo, pero simplemente es una multiplicación escalar entre dos vectores que previamente hemos normalizado, es decir, que hemos dividido entre su magnitud. Visto en dos dimensiones consiste simplemente en calcular la sombra que un vector proyectará sobre el otro cuando situamos ambos en el mismo origen.

En fin, para dos vectores cualquiera (¡que pueden ser hasta complejos!) se puede calcular el MAC mediante la siguiente función:

function MAC = mac(a,b)
% Calcula el MAC entre los modos a y b
%
% MAC = MAC(a,b)
%
% donde a y b son vectores columna de tamaño Nx1

MAC = abs(a'*b)^2/((a'*a)*(b'*b));

end

Definir los tests

Hemos dicho que el MAC indica cuánto se parecen dos vectores y que representa la sombra de uno sobre el otro. Así, se me ocurren dos manera de comprobar si la función hace lo que debe:

  • Cuando los dos vectores son perpendiculares, el MAC tiene que ser cero porque la longitud de la proyección de uno sobre el otro (la sombra) es cero.

  • Cuando los dos vectores son iguales, el MAC tiene que ser uno porque son lo máximo de parecidos que pueden ser y al ser unitarios la máxima proyección solo puede medir uno.

Ahora toca definir esas condiciones en lenguaje matlabiano. Yo he ido por lo sencillo y he usado vectores bidimensionales:

% TESTS
% Vectores perpendiculares --> MAC = 0
aOrt = [1 0]';
bOrt = [0 1]';

% Vectores iguales --> MAC = 1
aSame = [1 1]';
bSame = [1 1]';

%% Test 1: vectores perpendiculares
assert(mac(aOrt, bOrt) == 0)

%% Test 2: vectores iguales
assert(mac(aSame, bSame) == 1)

El primer trocico son las definiciones, luego viene cada test en una celda de Matlab, un trozo que comienza por dos porcentajes. Este cachito de código lo he guardado como testMac.m y será el archivo que Matlab usará para poner a prueba mi función.

Testar la función

Para lanzar los tests ejecutamos runtest dándole como argumento el ficherillo donde hemos definido los tests:

result = runtests('testMac');

que nos dirá si han fallado los test o no y nos guardará la información que luego podemos ver en una simpática tabla haciendo:

rt = table(result)

Y, hala, ya sé testar. Ahora me falta aprender a definir tests con un mínimo de lógica. Lo próximo será investigar esto mismo en Julia. Os contaré.

Referencias

Testing Frameworks en la documentación de Matlab

Write Script-Based Unit Tests en la documentación de Matlab

Modal space articles de Pete Avitabile

¡Opina sin miedo! (Puedes usar Markdown)

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s