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.
Respuestas:
Además de las pruebas unitarias, existen otras dos estrategias para configurar pruebas automatizadas para tratar un problema específico del sistema operativo:
O:
if
condiciones 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, comoFOOBAR_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.
fuente
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.
fuente
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.).
fuente
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.
fuente
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.
fuente