Os dejo aqui el mensaje y el código que ha subido:
Citar:
Hello everyone !
With the amount of features to test in my various gambas projects, I started feeling that it was a pain to write the tests, run *all* of them, and analyzing their output each time I had to make a change, thus leading to forget to run simple tests (see the last gb.xml issue...).
Therefore, in order to automate and simplify this whole process, I decided to start working on an Unit Testing component for Gambas.
It works quite simply : in your project, just create a class that inherits the UnitTest class, move it inside an "unit" folder in your project source directory, and implement your test in the _Run() method, using the different Assert() and Fail() methods, documented in the component's 'AssertionsTests' test.
To run all the tests at once, just use the _UnitTestLauncher module as the starting class instead of your project's default one (this can be achieved easily using 'gbx3 -s _UnitTestLauncher' inside your project's directory.
Each test is run inside a separate Task, therefore preventing a bad test to crash the whole test suite, and allowing you to easily multi-task it, using 'gbx3 -s _UnitTestLauncher -- -j <number>'.
Inside the attached component, I also made 3 tests, that show how the component handles the different scenarios :
- The 'MyGoodUnitTest' will run fine, but will sleep 0.5s before ending (to show that the component will use another thread to run the other tests, if there is any available, which is not the case by default).
- The 'MyBadUnitTest' will fail because of an (obvious) false assert. It will then show the stack trace of where the error raised, as well as a reason text (or just 'Assertion failed.' by default).
- The 'MyVeryBadUnitTest' will fail because of an error raised by the interpreter, here 'Division by zero'. Note that the result will be similar if the test completely crashes (Segfault...), you just won't have a stack trace available.
Of course this is just a proof of concept, there are a few things i would like to add to properly finish this component, such as a proper IDE integration, a standardized xUnit XML output, tweaking the archiver so the tests won't be in the final executable, maybe its own command (like gbt3) ...
What do you think ?
Esta tarde me lo miro, a ver si puedo hacer algunos ejemplo de como usarlo y hacer algunos test
gb.unit-0.0.1.tar.gz
Descripción:
Version subida el 9/12/2014, autor Adrien Prokopowicz
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
Re: Noticias Sobre Desarrollo: Test Unitarios En Gambas3
Tiene que ser interesante el procedimiento de realizar esto en Gambas.
Aun no he llegado a un tema para que trate el Test Unitario en Python.
Pero puedo comentar que existe un modulo o librería llamado doctest.
Lo curioso de este modulo es que aprovecha la documentación de una función "x", sobre todo
los ejemplos dentro de la función que se le añade para comprobar el funcionamiento correcto de cada función.
La ejecución de los test es semiautomático.
Así dicho de alguna manera en un ejemplo en gambas. Si tuviéramos una función como esta:
''Devuelve el número de grados celsius equivalentes a grados fahrenheit PublicFunction convertirAcelsius(gfarenheit AsFloat)AsFloat '>>> convertirAcelsius(32) '0 '>>> convertirAcelsius(212) '100
Incluimos en la propia función un test de la misma para comprobar si funciona.
Ese modulo se encargaría de probar esos ejemplos. Si le añadimos un símbolo detrás del comentario seria
una forma de que el modulo reconociera donde se encuentra el test de la función.
Supongo que las pruebas unitarias pueden ir mas allá de esto. Lograríamos testear cada función que tenga nuestro
modulo correspondiente, de una forma aparentemente sencilla.
Para nosotros sería ejecutar manualmente esas llamadas a las funciones con los valores que están en los ejemplos para testear el comportamiento.
Cosa que haría el modulo por nosotros.
Saludos
=================== Gambas Básico
"No es un bug, es una característica no documentada"
Registrado: Septiembre 2009
Mensajes: 4175
Edad: 51 Ubicación: dos hermanas, sevilla
Re: Noticias Sobre Desarrollo: Test Unitarios En Gambas3
Bueno, ya me he mirado (por encima) como funciona. Os comento:
La idea de los test unitario, (hablando en plan general) es probar nuestras funciones y/o metodos.
Esto se hace pasandoles unos valores y comprobando que lo que develven es lo correcto, en el caso contrario, paramos el test y podemos decir que nos muestre algun mensaje personalizado.
Por ejemplo:
Tengo una funcion sumaEnteros en el módulo ModuleOperaciones definida de la siguiente manera:
Quiero comprobar que hace la suma bien,... voy a hacer un test para probarla.
La prueba va a ser que le paso dos valores: 5 y 8, comprobar que la suma de ambos es 13, y si no es asi, que muestre un mensaje.
Pues la forma de crear el test seria:
0) Copiamos las clases UnitTest, UniTestTask y el módulo _UnitTestLauncher y creamos una carpeta llamada unit en las fuente de nuestro proyecto
1) Creamos una clase que herede de UnitTest, ya que esta tiene los método _Run y varios del tipo _Assert que son lo que comprueban los test, dentro de la carpeta unit.
Me.AssertEquals(ModuleOperaciones.sumaEnteros(5, 8), 13, "fallo al calcular la suma de enteros")
2) Ahora seleccionamos el módulo _UnitTestLauncher.module y hacemos que este sea la "clase de inicio" de nuestro proyecto
3) Ejecutamos el proyecto.
El módulo _uniTestLauncher, tiene la "capacidad" de ejecutar el método _Run de las clases que esten en el directorio unit y que sean herederas de la clase UnitTest.
4) Se muestra el resultado en la consola:
Citar:
----- Test PruebaModuloOperadorSumaEntero (#1) succeeded -----
Standard output :
1 tests finished. 1 sucessful tests, 0 failed tests.
Osea todo ha ido bien...
Ahora si escribrimos la siguiente prueba, usando decimales:;
Me.AssertEquals(ModuleOperaciones.sumaEnteros(5, 8.6), 13.6, "fallo al calcular la suma de decimales")
Y ejecutamos el programa, obtenemos el siguiente mensaje:
Citar:
----- Test PruebaModuloOperadorSumaEntero (#1) failed -----
Reason: fallo al calcular la suma de decimales
Stack trace :
PruebaModuloOperadorSumaEntero._Run.10
Standard output :
Vemos que nuestro test no se cumple, con el mensaje que hemos especificado y la linea dentro del código de nuestro test.
Nota:
El modulo _uniTestLauncher, tiene la ventaja de que podemos crear tantos test como necesitemos, ya que se van ejecutar todos, informandonos via consola cuales esta correctos y cuales al fallado.
Os dejo aqui mi mini proyecto donde he probado el ejemplo, y ademas estan los ejemplos y documentación de gb.unit.
Tenemos el siguiente esquema del proyecto gb.unit:
PruebasUnit-0.0.1.tar.gz
Descripción:
Pequeña prueba sobre test unitarios en un simple funcion
Registrado: Septiembre 2009
Mensajes: 4175
Edad: 51 Ubicación: dos hermanas, sevilla
Re: Noticias Sobre Desarrollo: Test Unitarios En Gambas3
Shell:
Citar:
doctest.
Lo curioso de este modulo es que aprovecha la documentación de una función "x", sobre todo
los ejemplos dentro de la función que se le añade para comprobar el funcionamiento correcto de cada función.
Como ves, Adrien lo hace de otro modo, creo que es mucho más limpio tener independizado los test del código de la función.
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
Re: Noticias Sobre Desarrollo: Test Unitarios En Gambas3
Julio:
Citar:
Como ves, Adrien lo hace de otro modo, creo que es mucho más limpio tener independizado los test del código de la función.
De la primer forma no es necesario crear un test unitario si ya compruebas al comienzo que los resultados son los deseados
cuando has terminado de crear la función.
Cuando vi por primera vez como se documentaba la función, ya se añadía un test de la misma.
Este es un vídeo del curso de aprender los fundamentos de programación con Python que trata en este caso
en el diseño del cuerpo de una función.
Es otra forma, a medida que avanzas te van enseñando unas técnicas o buenas costumbres a la hora de programar
con este lenguaje.
Es muy curioso las formas y los cambios que hay de un lenguaje a otro. Nosotros estamos obligados a declarar el tipo
variables que va recibir los parámetros de la función, en cambio en Python no lo es. (cabecera)
A pesar de todo en la documentación se hace referencia el tipo de valores que la función recibe y va a devolver (contrato).
A medida que construimos la aplicación sería una forma rápida de comprobar si la función devuelve lo que pensamos que
tiene que devolver.
Saludos
=================== Gambas Básico
"No es un bug, es una característica no documentada"
Registrado: Septiembre 2009
Mensajes: 4175
Edad: 51 Ubicación: dos hermanas, sevilla
Re: Noticias Sobre Desarrollo: Test Unitarios En Gambas3
Shell:
Citar:
[gambas] estamos obligados a declarar el tipo variables que va recibir los parámetros de la función, en cambio en Python no lo es.
A mi eso no me gusta eso de Python, tampoco me gusta que deje crear variables sin especificar de que tipo es (hay otros lenguajes que tambien hacen lo mismo: javascript por ejemplo) ......deja abierta la puerta futuros errores o malas interpretaciones del código.
Y lo peor es que cuando sea un proyecto grande, y miras su código la primera vez, no sabes (sino esta bien documentado), que valores admite..... y no te digo nada cuando quieras traducir el programa a otros lenguajes que necesitan que esten fijados los tipos.
La ventaja de trabajar "sin especificar tipos" es que:
- te ahorras varias lineas de código, al no tener que definir que tipo de variable es. Ideal para hacer pequeños programas.
- te ahorras las clases "interfaces", ya que los métodos admiten "todo lo que le pongan" como valor del parámetro.
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
Re: Noticias Sobre Desarrollo: Test Unitarios En Gambas3
Julio:
"Lo ideal" es documentar el programa, pero luego muchos no lo hacemos. Somos muy comodones.
Vamos a hacerlo funcionar y a veces no pasamos de ahí. Todo depende de si queremos compartir ese
código. Como es normal habrá que documentarlo o en caso contrario estar abierto a las personas que lo usen.
Saludos
=================== Gambas Básico
"No es un bug, es una característica no documentada"
Fecha y hora actual: Lunes, 29 Abril 2024, 15:26 • Todas las horas son UTC + 1 Hora
Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado Usuarios registrados conectados: Ninguno
Lista de permisos
Lista de permisos
No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas No puede adjuntar archivos Puede descargar archivos No puede publicar eventos en el calendario