¿Cómo se prueba el software que es sensible al tiempo?

9

Por sensible al tiempo me refiero, por ejemplo, a un script que solo se ejecuta una vez al mes o un script que se ejecuta de forma continua, pero da un cierto resultado solo una vez al mes. Obviamente, puede realizar pruebas unitarias para muchos casos, pero hay excepciones (según tengo entendido).

Un ejemplo reciente con el que me topé fue configurar un trabajo cron para que se ejecutara del segundo al último día de cada mes. Esto requería usar un script de shell con la pestaña cron para obtener el día correcto del mes para cron, algo así como:

1 0 [shell command] * * [my script]

No estaba familiarizado con el script y no estaba familiarizado con los scripts de shell en general, por lo que no tenía una buena manera de probarlo aparte de esperar a que llegara el final del mes y ver si el script se ejecutaba correctamente (en realidad, mi solución fue encontrar un co- trabajador que sabía mucho más sobre cron y scripts de shell que yo).

Así que tengo curiosidad por saber si existen soluciones prácticas para probar scripts sensibles al tiempo.

DanLeaningphp
fuente
3
Puede ejecutar esto en una máquina virtual y establecer la hora del sistema en una conveniente, como la medianoche anterior al día en que se debe ejecutar el script, o algo así.
Vitor Py
2
crontab ejecuta scripts de shell regulares, simplemente puede ejecutar el script a mano (en un sandbox o vm si tiene miedo de lo que hará) sin esperar a crontab
crasic
2
Mi respuesta es quizás exagerada para su caso específico: simplemente ejecute el script. Pero la pregunta más importante necesitaría soluciones como virtualización e instrumentación.
Macneil

Respuestas:

7

Además de las pruebas unitarias, existen otras dos estrategias para configurar pruebas automatizadas para tratar un problema específico del sistema operativo:

  • Virtualización : configura varias imágenes del sistema operativo (por ejemplo, usando VMWare ) con las configuraciones exactas que necesita, configura una forma de extraer automáticamente el binario para probar (generalmente montando un directorio especial en el espacio de la VM) y luego ejecuta el prueba.

O:

  • Instrumentación : agregue manualmente ifcondiciones especiales a su programa que harán que el programa se comporte de manera diferente. En Unix, esto se haría comprobando si se establece una determinada variable de entorno, como FOOBAR_TEST_TIME_WITH_T=500. Sus pruebas automatizadas utilizarán diferentes configuraciones de las variables de entorno y diferentes variables de entorno para ejecutar lo que necesita.

También puede vincular a diferentes bibliotecas, si sus interacciones se pueden expresar a nivel de biblioteca, lo que puede considerar como una virtualización (si la "biblioteca" es el núcleo del sistema operativo) o como una técnica de instrumentación. Se pueden usar ambos términos, aunque el término virtualización como se usa hoy en día casi siempre significa algo así como VMWare. Una biblioteca específicamente para devolver valores fijos o volver a ejecutar interacciones específicas sería un enfoque simulado o de código auxiliar .

También hay herramientas de instrumentación automática, que pueden reescribir sus archivos binarios para obtener otros efectos deseados, como que el sistema de archivos esté lleno.

En general, su objetivo es encontrar errores. Para verificar casos extraños, como que el sistema de archivos esté demasiado lleno, es más fácil y efectivo simplemente instrumentar manualmente su programa, siguiendo la ruta de virtualización o configuración manual de la máquina rara vez o nunca.

Macneil
fuente
Creo que su 'virtualización de bibliotecas' es mejor conocida como burlarse, o más bien, usar una biblioteca simulada.
Javier
10

El más efectivo: cambie la fecha de la máquina en la que está probando. Configúrelo un poco antes cuando necesite ejecutarse, y verifique cuándo se inicia y si funciona correctamente. Sin embargo, esto no siempre es posible si hay varias máquinas involucradas o si se requieren recursos sobre los cuales su empresa no tiene control. Sin embargo, asegúrese de hacerlo durante varios meses, y asegúrese de cambiar el año un par de veces para evaluar febrero.

Lyndon Vrooman
fuente
1
Si tiene un software instalado con una licencia (de evaluación) por un tiempo limitado, jugar con el reloj puede hacer que bloqueen su ejecución.
Marjan Venema
En algunas empresas, todas las estaciones de trabajo conectadas a la red no deben desviarse del tiempo del "servidor" en 5 minutos, de lo contrario, la estación de trabajo se bloqueará. Me pasó a mí :-)
OnesimusUnbound
1

No sé acerca de su secuencia de comandos, pero trato de usar algún tipo de parámetro donde pueda establecer la fecha. En su caso, si no se da una fecha, el valor predeterminado es fin de mes. En su código, tome el parámetro de fecha y ejecútelo si hoy es dos días antes. No solo podrá probarlo (pasar una fecha dentro de dos días a partir de ahora), sino también ejecutarlo al día siguiente en caso de que algo impida que se ejecute en circunstancias normales (falla de energía, caída del servidor, etc.).

JeffO
fuente
1

Como mencionó crontab, supongo que se está ejecutando en un entorno nix. En ese caso, creo que valdría la pena echarle un vistazo a libfaketime:
http://www.code-wizards.com/projects/libfaketime/

Mediante la magia de LD_PRELOAD, podemos cargar versiones personalizadas de funciones de biblioteca siempre que coincidan con la interfaz. Lo que libfaketime hace es cargar versiones de las llamadas al sistema de tiempo que le permiten personalizar su comportamiento a través de variables de entorno. Puede forzar a time () a devolver un valor codificado o un desplazamiento de la hora actual, todo sin afectar a nadie más en el cuadro.

frankc
fuente
0

No hay mucha necesidad de probar cron, ya que ha sido probado ("prueba de producción") durante muchas generaciones. Por supuesto, si está trabajando con un script de shell, puede establecer la fecha / hora en una máquina virtual.

La forma preferida de lidiar con esto es "burlarse del reloj", usando un truco de programación u otro para fingir la hora. En los scripts de shell, puede usar la sintaxis $ {: -} para usar una fecha establecida en una variable de entorno y retroceder en el tiempo real si no se ha forzado.

En otros idiomas usamos bibliotecas simuladas o construimos una abstracción sobre el reloj.

El simulacro de reloj es bueno porque puede automatizarlo en lugar de tener que configurar manualmente su prueba. Este es un gran beneficio cuando se trata de modificar el script / código más adelante y puede saber fácilmente si aún funciona o no.

Tim Ottinger
fuente