Documentos de Académico
Documentos de Profesional
Documentos de Cultura
F!+N3zz3 3s !D3mp!3r3 PDF
F!+N3zz3 3s !D3mp!3r3 PDF
iDempiere FitNesse
Marco de pruebas para software ERP de excelencia
Por:
Redhuan D. Oon alias red1.
(Documento iniciado en principios de septiembre de 2015 in
Mexico City, a una hora de Victor Pérez, en Pachuca, quien tomó
ofensiva de mis feroces revisiones de sus módulos Libero al grado
de remover mi nombre de la página wiki del historial de ADempiere
y se puso él mismo en mi lugar. Él me llamó por teléfono cuando
escucho que yo había arribado, para decir: "¡Hola soya amigo!").
October 6, 2015
version 0.7
Este documento es parte de una serie de pruebas que cubre varios
plugins como Localización en Alemania, Pronóstico, Presupuesto,
Manufactura, Integración con punto de venta, Integración móvil y
administración de almacenes.
patrocinado por
BANGLADESH
Hacerlo oficialmente se
llaman pruebas.
Contenido
Omisión 6
Intenta los ejemplos ahora 6
Algunas cosas sobre mí 7
Mejor aplicación de código abierto (open source) 9
Importancia de las pruebas de software 10
Características 12
Mi mejora para la Restauración (Roll Back) 13
Creación de grabación automática (Record Auto) 14
Manejo de la ventana de información (Info Window) 15
Omisión
http://red1.org/adempiere/viewtopic.php?f=28&t=1813
SYSNOVA, BANGLADESH
Como se puede ver, incluso me da la autoridad para usar una insignia de certificador.
Haré una y la llevaré al camina siempre que haya un fallo de software en la ciudad. El
CTFL tiene bastante tiempo y puede haber expirado. Pero la última vez que lo revisé, la
doctrina para las pruebas (testing) es la misma.
De todos modos, ¿Qué aprendí durante el curso antes de pasar los exámenes para este
certificado?. Así que aquí está, las cosas más importantes que me sorprendieron
durante el curso.
1. Piensa por qué se debe probar. ¿Te subirías abordo de un avión que no ha sido
probado? Por supuesto se prueba, todo el mundo lo asume. De lo contrario no volaría.
2. Las pruebas son más costosas que el desarrollo. Sí, me oyes bien. O yo he oído mal
al conferencista. En Microsoft, hay 5 ingenieros de pruebas (testers) por cada
desarrollador, y en Adobe, hay 20 ingenieros de pruebas por cada desarrollador.
5. No probarse a sí mismo. Sí, me oyes bien. Un código no debe ser probado por ti
mismo porque, obviamente existe tendencia y prejuicio, pero por otra persona que
definitivamente tiene mayor tendencia y prejuicio (en contra tuya). De hecho, la
misma empresa no debe ser quien ponga a prueba el código hecho dentro de la
empresa. Esto debe ser realizado por una empresa de terceros. Mejor aún, si esa
empresa se encuentra fuera del país y es especializada y enfocada únicamente en
las pruebas de software.
Así que por favor, ahora, responde esta pregunta. ¿Alguna vez, has pensado dejar que
tu software se utilice en tu negocio o fábrica, sin que alguien como yo lo pruebe?
iDempiere, ahora es declarado por una fuente externa independiente de código, sin
ningún tipo de solicitud comercial de nuestra parte, ser una aplicación ERP de calidad
superior, sobre Odoo y xTuple y dentro de nuestra pista de poderosas aplicaciones
claramente venciendo a Openbravo, ADempiere y Comiere. Teniendo en cuenta que los
otros son fuertemente financiandos con oficinas corporativas, campañas en los medios,
mercenarios pagados y código semicerrado debido a los modelos de negocios bien
pensados y excluyentes.
Algunos de mis contactos personales en el proyecto también son culpables y han sufrido
gravemente por no realizar una prueba instantánea del software desarrollado. Por
supuesto ahora cada vez que hablo con ellos están de acuerdo y asienten con la
cabeza, pero los viejos hábitos tardan en morir. Es mejor parar el resto del trabajo e ir a
probar, probar, probar el software.
Las pruebas no mienten. Son calculadas por máquinas tontas, sin duda, pero no se
desvían de lo que están programadas para hacer. Y lo hacen a velocidades increíbles.
En realidad, ahorran dinero, y desastres, como el que sucedió en
http://red1.org/BlackPaper.pdf.
Page 10 of 45 Copyright (C) 2015 Redhuan D. Oon
iROSES iDempiere FitNesse
Tal vez esta imagen que elijo de los cientos de gráficos y estadísticas en la Web ilustra
mejor para algunos de ustedes, el temor de lo que puede pasar antes de que ocurra.
También hay un camino equivocado para probar el software y es probar lo que hace
usted mismo. Usted no quiere probar que está equivocado la mayor parte del tiempo.
Las pruebas de software tampoco deben hacerse en el mismo equipo o en la misma
empresa. Esto es mejor realizado por una empresa o entidad profesional externa que es
medida por el número de errores que encuentran en el software. Lo sé porque lo he
aprendido al obtener el CTFL (Certificado de pruebas a nivel de fundamentos)
entrenando y pasando los exámenes hacer varios años.
Por supuesto, tener una comunidad global de código abierto nos otorga pruebas
gratuitas en todo el mundo durante todo el día. Pero los costos de pruebas de software
son 5 veces más que el desarrollo, de acuerdo con la nómina a puerta cerrada de
Microsoft de dicho personal. En Adobe, contratan a 20 probadores de software por cada
desarrollador. Las pruebas de software son una actividad permanente muy costoso y
extensa. Relegando la prueba a herramientas como FitNesse e incorporando esto
dentro de la suite Jenkins CI es el mejor camino para tomar las pruebas fuera del punto
ciego y enfoque de uno mismo hacia un enfoque disciplinado y estricto que puede
garantizar una mejor eficiencia como más adelante demostraremos.
En este docmento, debo ir a través de cada prueba, para mirar debajo de la cubierta de
su código fuente, entonces podrás entender más fácilmente y podrás modificar o
mejorar el código para compartir con la comunidad. Esto está de acuerdo con las
características de Software Libre y de Código Abierto (FLOSS) de este proyecto. Otros
que no entienden o no son capaces de leer el código podrán querer marcharse. Esto
garantiza la seguridad de mi trabajo.
Características
Si únicamente piensas en ti
sólo te destruirás a ti mismo
Como se puede ver desde mi Skype con la mano grande, parece que le gusta.
Esta mejora es importante porque sin ella, cualquier prueba comprometería a la base de datos y
afectaría los planes de pruebas de datos los cuales ya son fijos y que se asumen en una base
de datos limpia. Esto requerirá constante regreso para restaurar la base de datos para ejecutar
el conjunto de prueba nuevamente. La incorporación del manipulador trxName en la mayor parte
del análisis de código también abre posibilidades futuras. También yo incorporo una etiqueta
Commit en caso de que el probador de software realmente quiera que la prueba sea en la base
de datos para una revisión más a fondo. Tome el plugin para reemplazar el servidor iDempiere
aquí: Plugin:_FitNesse_RollBack
Page 13 of 45 Copyright (C) 2015 Redhuan D. Oon
iROSES iDempiere FitNesse
Creación de grabación automática (Record Auto)
También he contribuido con un código
que permite la creación más rápida de
nuevos registros sin especificar los
campos y sus valores. Sólo con una línea
en blanco permitirá que el código busque
los tipos de datos correctos e ingrese
datos en la tabla en tantos campos como
sea posible. El usuario puede aún
especificar sus propios valores debajo de
la línea en blanco. Un ejemplo para crear
una orden de venta se da aquí. El otro
código permanece igual. El resultado se
muestra debajo.
Un ejemplo para la mezcla de líneas en la
orden de compra se da aquí en texto sin
formato.
|*Table* | C_Order! |
| | |
|c_doctypetarget_id | @Ref= c_doctype
[Name='Purchase Order’].c_doctype_id |
| C_Currency_ID | 100 |
| isSOTRX | N |
|*Save* | |
Este script muestra en su primer cuadro que accesará a la Info Window nombrada "General Sales
Forecast" en la tabla AD_InfoWindow, y accesará su AD_InfoProcess a través del siguiente cuadro
para ejecutrar GenerateBudget2SalesForecast el cual lee el resultado del primer cuadro. A
continuación se muestra el resultado.
La lectura exitosa anterior es evidente ya que devuelve la respuesta completa del proceso
prescrita por el código del proceso. Esta adición no cambia el proceso del script ejecutado y es
compatible con versiones anteriores (retrocompatible).
El único error que tuve fue que la ID de la PInstance no persiste y en consecuencia hice un
solución incremental para poder regresar el camino. Para la mayoría de los propósitos esto debe
funcionar e incluso permitir que se especifique un proceso secundario de la InfoWindow. La
lectura de la Info Window solo extrae el primer registro y por lo tanto el proceso siempre
manejará una línea del conjunto de resultados. Esto es suficiente para probar que funcionan de
acuerdo a lo establecido. El código script se da en el módulo de pronóstico (Forecast)
posteriormente.
Page 15 of 45 Copyright (C) 2015 Redhuan D. Oon
iROSES iDempiere FitNesse
Guía de Usuario para Desarrolladores
Como la guía wiki en línea debe ser suficiente, está guía tiene la intensión de realmente entrar
en la prueba exacta de los scripts de prueba de software o las historias de los módulos que son
llamados por los autores de FitNesse y seguir la pista exacta a los segmentos de código Java
que los manipulan. Se puede aprender mucho y ahorrar más tiempo.
Configuración para Desarrollador
Estoy usando mi configuración como desarrollador por ello durante la prueba de FitNesse, el
modo de depuración se puede utilizar para comprobar el código analizado actualmente dentro
del módulo. La contribución del trabajo original puede ser leído directamente en línea desde el
wiki realizado por Heng Sin http://wiki.idempiere.org/en/NF001_Fitnesse_Integration.
Establezca el tipo de prueba. Coloque un nombre como se muestra arriba. No altere el valor del
contenido y de clic en agregar (Add).
!include -c TestLoginGardenAdmin
!|Create Record|
|*Table* |AD_User |
|NAME |@random_string(Red1,6)|
|Value |@random_number(,,8)|
|Email |red1@red1.org|
|Password|@random_string(aaa,6)|
|Phone|@random_number(,,8)|
|*Save* | |
!|Roll Back|
|*RollBack*|TRUE|
Luego en el navegador de iDempiere, puedo ver que se crea un nuevo registro similar a esta
prueba.
La prueba funciona con la acción commit para rápidamente crear lo que quería.
Basta con solo mirar la gran velocidad de 0.026 segundos. Aquí vemos que no devuelve los
mismos valores por lo tanto esta prueba es un éxito rotundo. Tenga en cuenta que tenemos la
misma ID para @AD_User.AD_User_ID@ que obtiene la misma memoria durante la prueba.
Tampoco hay rastro del registro durante mi normal inicio de sesión (login) para comprobar ya
que no está en Commit. Sin embargo, esto también descubre un hoyo en la versión vanilla de
iDempier. ¡Podemos obtener la contraseña!. ¡Qué hemos atrapado!. De todos modos ahora
puede guardar la historia del fixture.
http://sourceforge.net/projects/red1/files/Testing/ !
Los nombres de las clases de Java son obvios y se refieren a los títulos de los bloques de texto
wiki. Así, para crear un nuevo título simplemente se quitan los espacios a la clase Java
correspondiente. Observe como he hecho con mi nueva clase, RollBack.java.
Prueba rápida
El propósito de la prueba rápida es asegurarse que tu motor FitNesse está trabajando bien
además de comprobar si la base de datos está viva y respondiendo. También demuestra el uso
de Set Variable y de Read Record.
Usted puede encontrar los dos códigos fuente SetVariable.java y ReadRecord.java. de las
clases que los manejan. Las @InventoryLevelBefore@ son variables arbitrarias que se
establecen posteriormente en el script wiki para referenca del tiempo de ejecución. No están
reservadas o codificación fija (hard-coded). Este es un mecanismo poderoso que Carlos Ruiz ha
introducido para permitir la captura o paso de valores durante las pruebas.
Esta última prueba ahora toma la variable anterior y confirma esto a la SQL que extrae el total
QtyOnHand de la tabla M_Storage.
Aquí está el resultado que se muestra en la página de prueba. Sin embargo, antes de esto, la
confirmación estaba comparando el valor de la cadena y por lo tanto 28 no era igual a 28.0.
Muestro un parche para solucionarlo aquí.
https://idempiere.atlassian.net/browse/IDEMPIERE-2859
Sin embargo, Carlos Ruiz ha remarcado el ciertamente se debe evaluar el valor de la cadena, y
así he añadido un nuevo código “AssertString” estrictamente para cadenas y AssertVariable para
ambos valores alfabéticos y numéricos si se puede deducir tal situación durante la confirmación.
Pronóstico (Forecasting)
El pronóstico de compra es una aproximación para acortar funcionalmente la cadena de
suministro en el ERP evitando el reabastecimiento del inventario y la requisición manual.
Los pronósticos de compra son generados durante el pronóstico de venta (Sales Forecast)
e incluso ordenes de compra (Sales Order) cuando el plugin está activo. Recibirás esta
línea en el historial de la consola:
INFO: <EVENT VALIDATOR FOR SALES ORDER TO GENERATE PURCHASING FORECAST> .. IS NOW INITIALIZED!
La ilustración de arriba muestra con el área coloreada la posición de todo el plugin, este
recorte es parte del núcleo subyacente que no invade o infringe. El módulo del programa
de presupuesto (Budget Plan), junto con el pronóstico de ventas (Sales Forecast), las
ordenes de compra (Sales Orders) y las ordenes de compra (Purchase Orders) permanecen
intactas y fuera del plugin. El plugin del presupuesto (Budget plugin) es también
actualizado para incluir la contribución de Deepak Pansheriya - http://logilite.com/budget-
journal-enhanced-budget-module/
Como se ha visto anteriormente, el detalle de compra reutilizará la pestaña de línea (Line tab),
pero la pestaña del proceso (Process tab) mostrada en el fondo, indicará si se trata de un
pronóstico de compra. Un detalle de proceso en blanco significa que no es un pronóstico PO
sino solo el habitual pronóstico de venta. Si hay un detalle como ocurre en este caso, entonces
es un pronóstico PO. Usted puede ir a la pestaña "Forecast" para revisar la información de su
encabezado.
Debajo de la pestaña de línea, ya está indicado el producto (Product), cantidad (Quantity), tiempo
(Period) y fecha (Date) prometida. En la pestaña del pronóstico del proceso (Forescast Process),
almacenará el tiempo de anticipo (LeadTime) el cual es parcialmente oculto hacia el lado
derecho de la fila plazo de ejecución (LeadTime) que es calculado a partir del tiempo de entrega
(DeliveryTime) del vendedor del producto.
La pestaña del proceso de pronóstico también conserva el historial del origen del pronóstico de
compra como si, por ejemplo se tratara de una orden de venta y OrderLine, o un pronóstico de
venta y ForecastLine. En este caso se trata de un pronóstico de ventas (Sales Forecast) . (La
columna de pronóstico es bastante redundante ya que es una repetición de la pestaña principal.
Por lo tanto, se puede ocultar fácilmente utilizando la pestaña del editor [Tab Editor]. Esto se
puede quitar cuando se realice la próxima subida [upload] ).
La pestaña de pronóstico del proceso también guarda el historial junto con la ID de referencia de
la OrderLine generada, si este pronóstico PO ha sido procesado,
En la ventana de información (Info Window) del Pronóstico General de Ventas (Generate Sales
Forecast) puede mostrar este registro para la selección para procesarse en un Pronóstico de
Ventas (Sales Forecast).
Ahora será bueno para la prueba de FitNesse leer esta ventana de información, su contenido, y
activar ese botón de proceso. De hecho con mi mejora agregada lo hace. Ahora podemos leer la
ventana de información y pasar al proceso de ejecución predominante para hacer eso.
Tenga en cuenta que el Programa de Presupuesto de Ventas Objetivo puede estar en un nivel
alto del programa o un objetivo general el cual requiere una planificación más exacta en la etapa
de pronóstico.
Este Pronóstico de Ventas, puede entonces ser procesado como se ha mostrado anteriormente
para el Pronóstico de Compra y así sucesivamente hasta las Ordenes de Compra. Por lo tanto
este es un eslabón completo de la cadena de suministro desde la planeación presupuestaria
hasta la decisión final de compra.
Siendo una ventana de información (creada por Heng Sin y entonces mejorada por mí, Anthony
Soosah, Hiep LeQ y otros) esto puede modificarse o configurarse fácilmente en el Diccionario de
la Aplicación (AD) del Sistema como se muestra en las columnas del panel de selección.
También permite una selección de las filas para ser procesadas por el botón Genera Orden de
Compra (Generate Purchase Order).
Ahora vemos nuevamente otra prueba que hace lo anterior para obtener la ventana de
información del Pronóstico de Compra y Generar la Orden de Compra. La ejecución y
resultados se muestran en la página siguiente.
|*InfoWindow*|Purchasing Forecast|
!|Run Process|
|*ProcessValue*|InfoForecastGeneratePO|
|*Run*||
!|Roll Back|
|*RollBack*|TRUE|
Lo anterior es la historia en
bruto del script y el correcto es
el wiki guardado a partir de
esto. Una nota para los
probadores de software de
como determinar el valor del
Proceso es examinando la
pestaña del proceso
InfoWindow y copiando y
pegando el valor de la clave de
búsqueda (Search Key) como se
ha visto anteriormente, esto es
el InfoForecastGeneratePO.
La C_OrderLine toma el ID de la
tabla madre de arriba, C_Order a través
de la variable
@C_Order.C_Order_ID@.
Probando el Modelo de
Procesamiento para el
Pronóstico
Entonces hay una forma manual a través de la
ventana de Pronóstico. Aquí hay un código para
crear un encabezado para el Pronóstico de Ventas y
línea y luego procesar todo en la DB.
De hecho tras ejecutar pruebas, detecté muchos errores en mi código por no establecer
los datos mandatorios correctamente o condiciones faltantes. Después de corregir eso
en mis módulos, las pruebas confirmaron nuevamente que todo está en orden.
<en curso>
Fabricación
Tal vez esta es la parte más difícil que realmente necesita pruebas para que todo trabaje
para el módulo de fabricación Libero, yo lo he revisado personalmente algunas veces
durante aproximadamente 5 años y he descubierto algunas características incompletas
y código de interrupción (breaking code). Es un proyecto ambicioso tratar de cubrir un gran
espacio del horizonte de fabricación y distribución. Podría esto estar mejor organizado
dentro de módulos claramente separados con mejores interfaces. Otro desafío es la falta
de expertos en la materia involucrados en este proyecto o publicando un buen modelo a
seguir.
Sin embargo, las pruebas anteriores fueron capaces de asegurar ciertas partes de lo
mencionado trabajando de acuerdo a la intención para la que fueron codificados. Mi
revisión y mejora de Libero está aún en curso, para hacerla más saludable me he
involucrado en un viaje a Dinamarca para obtener datos de fabricantes de turbinas y de
carrocería de camiones. Se necesitan más pruebas completas así como pruebas de
regresión para asegurar que nada previo a esto ha sido interrumpido o roto.
<en curso>
(Mientras escribo esto aquí en México, tengo prevista una reunión con el creador original
de Libero y Pronóstico (Forecasting), quien me ha llamado por teléfono y me platicó sobre
su última mejora de Pronóstico. Examinaré eso y veré si este modelo se sostiene sin
impacto cruzado y donde lo necesite, lo ajustaré para aprovechar los beneficios que
contenga.)
Almacenamiento
Originalmente también dentro de Libero, pero esta vez en Muiltimage de Eslovaquia por
Norbert Bed quien ha hecho grandes mejoras a esto y ahora es una gran tarea
documentar todo su trabajo, y al mismo tiempo, configurar un buen motor de prueba.
<en curso>
<en curso>
Aplicaciones Móviles
Hay un número considerable de fuertes aplicaciones móviles emergiendo tal y como
SpinSuite Android y iUIMobile.
<en curso>