Hacia un framework de desarrollo guiado por pruebas para Vala - sexta parte - Primer Lanzamiento!

Posted on Thu 31 March 2016 in Vala

Pues bien, resulta que la gestión de una banda de Rock cuesta más tiempo que pensaba, sobre todo si el lanzamiento de su primer disco ya esta en marcha. Además, resulta que la construcción de paquetes de Debian es re-difícil, especialmente si uno quiere armar un sistema de Jenkins CI para automatizar el proceso. A pesar de todo esto, me emociona mucho anunciar que la Versión 1.0 de Valadate está lista para el consumo publico, retrasado por solo pocas semanas que lo previsto.

Voy a explicar el conjunto completo de funciones (con todas las verrugas que hay) en un ratito pero para ell@s que no pueden esperar más, se puede instalar así...

Desde el código fuente

Para los atrevidos, se puede descargar el código fuente y construir y instalarlo si mismos. Hay que tener la toolchain de automake instalada y configurada y las bibliotecas de desarrollo instaladas para los siguientes paquetes:

  • glib-2.0
  • libxml-2.0
  • libxslt
  • json-glib-1.0

Además, si quieres construir los documentos de la API, se necesitaran Gtk-Doc y Valadoc.

Agarrar el código fuente:

git clone https://github.com/chebizarro/valadate.git

En el directorio raíz del proyecto ejecutar:

./autogen.sh
make

Se puede pasar la flag --enable-docs al script de autogen.sh. Si Valadoc y Gtk-Doc están instalados, los documentos de la API serian construidos en el directorio de docs.

Para instalar, hay que ejecutar el siguiente con los privilegios del usuario root:

make install

Y ya esta! Listo! Por supuesto, tienes que hacer todo ese rollo cada vez que haya un nuevo lanzamiento, así que podría ser más fácil instalarlo mediante el gestor de paquetes del sistema. Dependiendo de lo que eso seria, se pueda hacer lo siguiente:

Debian

Añadir la clave del repositorio

curl https://www.valadate.org/jenkins@valadate.org.gpg.key | sudo apt-key add -

Añadir la siguiente linea a las Fuentes de Software:

deb https://www.valadate.org/repos/debian valadate main

Ahora se puede instalar Valadate con:

sudo apt-get update
sudo apt-get install valadate

Fedora 23

Añadir el siguiente al archivo /etc/yum.repos.d/valadate.repo

[valadate]
name=valadate
baseurl=http://www.valadate.org/repos/fedora/$releasever/$basearch
repo_gpgcheck=1
gpgcheck=1
enabled=1
gpgkey=http://www.valadate.org/jenkins@valadate.org.gpg.key

Y ejecutar el siguiente con los privilegios del usuario root:

dnf update
dnf install valadate

Esos son las distribuciones que están disponibles hasta ahora, pero hay un paquete de Homebrew que esta más or menos listo. Dada la forma en que funciona Valadate, una versión de Windows seria un poquito lejos ya que hay unos cuestiones de la plataforma que se quedan por resolver. Si tienes una plataforma preferida y querrías un paquete para ella, manda un asunto a GitHub y veremos que pueda hacer.

Pues nada, ya que tienes Valadate, como puedes usarlo?

La manera más fácil es crear una Sub Clase de la Clase Abstracta de TestCase y agregarle métodos de prueba, cuales son los que empiecen con test_, no tienen parámetro ninguno y devuelven void. Esos métodos serán detectados y ejecutados cuando el programa está en marcha.

namespace MyTest {
    public class BookTest : Valadate.Framework.TestCase {

        public void test_construct_book() {

            // Arrange ...

            // Act ...

            // Assert ...
        }
    }
}

Para compilar, pasa las siguientes flags y parámetros dado que mytest-0.vala es el archivo de código fuente que contiene la prueba arriba.

$ valac --library mytest-0 --gir mytest-0.gir --pkg valadate-1.0 -X -pie -X -fPIE mytest-0.vala

Para que todo funcione correctamente, el nombre de binario debería ser exactamente igual a lo del archivo de .gir (menos la extensión de archivo). Eso resultara en un ejecutable que se puede ejecutar por la Linea de Comando:

$ ./mtest-0

/LibraryBookTest/construct_book: ** Message: mytest-0.vala:15: running

OK

Para ejecutar el binario de prueba con producción de TAP pasarle la flag --tap:

$ ./mtest-0 --tap

# random seed: R02Sddf35dad90ff6d1b6603ccb68028a4f0

1..1

# Start of LibraryBookTest tests

** Message: mytest-0.vala:15: running

ok 1 /LibraryBookTest/construct_book

# End of LibraryBookTest tests

La anotación de [Test] y sus parámetros están disponibles también para dar nombres más legibles a los métodos y clases de prueba y para soportar pruebas asincrónicas.

namespace MyTest {

    [Test (name="Annotated TestCase with name")]
    public class MyTest : Valadate.Framework.TestCase {

        [Test (name="Annotated Method With Name")]
        public void annotated_test_with_name () {
            assert_true(true);
        }


        [Test (name="Asynchronous Test", timeout=1000)]
        public async void test_async () {
            assert_true(true);
        }

        [Test (skip="yes")]
        public void skip_test () {
            assert_true(false);
        }
    }
}

$ ./mtest-0 --tap

1..3
# Start of Annotated TestCase with name tests
ok 1 /Annotated TestCase with name/Annotated Method With Name
ok 2 /Annotated TestCase with name/Asynchronous Test
ok 3 /Annotated TestCase with name/skip_test # SKIP Skipping Test skip_test
# End of Annotated TestCase with name tests

Como se pone a prueba las aplicaciones de Gtk

Si quieres probar una aplicación basada en GTK, tienes que utilizar el paquete de valadate-gtk (disponible en el mismo repositorio). Su uso es casi igual:

$ valac --library mytest-0 --gir mytest-0.gir --pkg valadate-gtk-1.0 -X -pie -X -fPIE mytest-0.vala

El paquete de valadate-gtk asegura que el ambiente de Gtk está correctamente cargado y configurado, si no vas a encontrar muchos errores raros.

LEPM

El Wiki está bien flaco en este momento pero eventualmente se encontrara instrucciones para instalar y configurar tu cadena de herramientas con Valadate tal como integrarse con los sistemas de CI.

Además, hay unos proyectos de ejemplo disponible aquí que muestran su uso con otras cadenas de herramientas y plataformas. Esos proyectos serán actualizados cuando hay nuevas funciones disponibles en Valadate.

La referencia de la API para Vala se encuentra aquí y para C aquí. Esos documentos están generados por Jenkins cuando haya un nuevo lanzamiento, así que deberían ser actual.

Pasos siguientes...

Obviamente (se espera), habría un tsunami de informes de errores cada vez que la gente empiece usarlo y se los encuentran. Aparte de eso, tengo muchas ganas de empezar el trabajo necesario para añadir soporte para BDD y poco a poco remplazar las partes de GTest más crotosas y pesadas bajo el capo. Eso tendría que esperar hasta que pueda encontrar el tiempo entre mi trabajo de consultoría que recién se ha explotado y la gestión de una banda de Rock que está al punto de lanzar un disco. Que buen rollo!

We salute you