Dedicado a mis proyectos en Gambas ,un lenguaje de programación parecido al Visual Basic + Java pero ampliamente mejorado y...¡¡para gnu/linux!!.La potencia del gnu/linux sumada a la facilidad del Basic



Consultas, Desarrollo de programas y petición de presupuestos:



miércoles, 24 de diciembre de 2014

Pruebas unitarias en gambas3 / Gambas Unit Testing




Pruebas Unitarias en gambas3

Gambas Unit Testing



Una de las cosas que se echaban de menos en gambas3, es la posibilidad de hacer pruebas unitarias  de nuestros programas. Pues ya existe un componente (en pruebas), desarrollado por Adrien Prokopowicz hilo de las listas de desarrolladores ) que es capaz de hacerlas y que seguramente pronto lo veamos integrado en el IDE de Gambas3.

 En este articulo os explico como usar una versión modificada por mi de la que presentó Adrien, ya que la mia muestra los resultados en un formularios que admite copiar los resultados de las pruebas al portapapeles para pegarlos en otras aplicaciones (ejemplo hojas de cálculos, procesadores de texto).

Empezamos desde el principio:

¿que son pruebas unitarias?
Una prueba unitaria es una forma de comprobar el correcto funcionamiento de un módulo de código (función o método). Esto sirve para asegurar que cada uno de los módulos funcione correctamente por separado. (http://es.wikipedia.org/wiki/Prueba_unitaria)


Por ejemplo:
Tenemos una función que se encarga de sumar números. La prueba sería usar la función para sumar los números 8 y 5, y como sabemos cual es el resultado (13), la prueba unitaria comprobaría esto y si no funciona, nos informa del error.

Las pruebas unitarias nos permite:
1) Comprobar si el módulo (función/método) devuelve el resultado esperado.
2) Si hacemos un cambio en el código, podemos volver a repetir la prueba, sin necesidad de cambiar nada.
3) El componente de pruebas unitarias, nos permitirá poder añadir tantas pruebas como necesitemos a una misma función o a varias funciones.
4) Ahorrar mucho tiempo en el testeo de nuestro programa.

-----------------------------------------------------------------------------------

Vamos a usar el componente unitForm que he creado.  
Existen 3 variantes según usemos gb.qt4, qb.gtk o gb.gui. Os descargais (del enlace que viene al final del articulo) los 3 archivos .deb  y lo instaláis en vuestro sistema.

Pasos a seguir:

1) Abrir nuestro proyecto de gambas3, y añadir el componente. Menu: Proyecto/Propiedades/Pestaña Componentes

Dependiendo de libreria gráfica esteis usando (gb.qui, qb.gtk o gb.qt4) activais uno de los UnitForm.

2) Crear una nueva carpeta en "Fuentes", llamandola "unit". Alli crearemos las clases de pruebas unitarias.

3) En esa carpeta, crearemos las clases de pruebas (podemos definir varias)
Estas clases deben ser exportables y que hereden de la clase "UnitTest". Hay que poner al inicio del código de la clase:
' Gambas class file
Inherits UnitTest
Export

4) Dentro del evento _Run(), definimos las pruebas.
Public Sub _Run()
5) Ejemplo de una prueba, seria:
Me.assert(funcion()=4,"error prueba")
Se traduciría en: Si la función() devuelve 4, la prueba se pasa con éxito, sino, mostrará la frase "error en prueba"

Podemos definir tantas pruebas como deseemos.

6) Para ejecutar las pruebas, creamos una clase que herede de _UnitTestLauncher
' Gambas class file  Inherits _UnitTestLauncher
E indicamos que sea la clase de inicio:


7) Si ejecutamos la aplicación, se realizan  los test, y se mostrará el resultado



Os dejo un video donde explico visualmente todo el proceso:



Enlaces:
Enlace de descarga del componente y el ejemplo: componente UnitForm
Carpeta de ejemplo: carpeta de ejemplo

Nota:
Esta es la lista completa de métodos disponiles de la clase UnitTest es:
Public Sub Assert(expression As Boolean, Optional failureText As String) ''Asserts that the given boolean is true

Public Sub AssertFalse(expression As Boolean, Optional failureText As String) ''Asserts that the given boolean is false

Public Sub AssertEquals(arg1 As Variant, arg2 As Variant, Optional failureText As String) ''Asserts that the two given variants are equal

Public Sub AssertNotEquals(arg1 As Variant, arg2 As Variant, Optional failureText As String) '''Asserts that the two given variants are not equal

Public Sub AssertSame(obj1 As Object, obj2 As Object, Optional failureText As String) ''Asserts that the two given objects are the same (i.e. they are at the same address in memory)

Public Sub AssertNotSame(obj1 As Object, obj2 As Object, Optional failureText As String) '' Asserts that the two given objects are not the same
Public Sub AssertNull(arg1 As Variant, Optional failureText As String) ''Asserts that the given variant equals null

Public Sub AssertNotNull(arg1 As Variant, Optional failureText As String) ''Asserts that the given variant does not equals null