¿Configurando notificaciones automáticas rojas / verdes para pruebas continuas y TDD?

1

Nota: esto se publicó originalmente en stackoverflow y alguien lo ha votado de manera sensata, ya que realmente es específico de OS X. Así que lo estoy repostando aquí, ya que en general ha sido útil.

Me gusta hacer Test Driven Development (TDD), por lo que me gustaría que mi conjunto de pruebas se ejecute cada vez que realizo un cambio en un archivo fuente o en un archivo de prueba.

Además, me gustaría que los resultados de la prueba se muestren en una ventana de estilo "Growl" efímero en la esquina de mi pantalla, que muestre un icono verde si todas las pruebas pasaron y un icono rojo si una o más pruebas fallan. .

Sé que existe un mecanismo de este tipo para node.js en mocha, y para entornos ruby hay guard-rspec. Pero, ¿cómo puedo crear uno para mi [completar el entorno de prueba en blanco] en OS X?

    
pregunta fearless_fool 14.09.2016 - 19:50

1 respuesta

1

Bajo OS X, puede crear una solución simple usando dos utilidades listas para usar: fswatch y terminal-notifier y tres scripts bash simples. Aquí es cómo:

descargar fswatch y terminal-notifier

$ brew install fswatch
$ brew install terminal-notifier

configurar directorios de proyectos

Los directorios de mis proyectos se presentan de la siguiente manera, pero, por supuesto, puede elegir estrategias alternativas:

$PROJECT_ROOT/
  logs/
  lib/
  scripts/
    icons/
  tests/

crea tres scripts de bash

archivo: scripts / run-tests

Este es un script simple que invoca las pruebas de su marco. En este caso, ejecutamos python unittest , pero puede personalizarlo para que se adapte a sus necesidades:

#!/bin/bash
# Run unit tests over the test directory

PROJECT_ROOT=$( cd "$( dirname "${BASH_SOURCE[0]}" )/.." && pwd )

PYTHON=python                                                           # customize for your needs
export PYTHONPATH="$PROJECT_ROOT/lib"                                   # customize for your needs
${PYTHON} -m unittest discover --start-directory "$PROJECT_ROOT/tests"  # customize for your needs

archivo: scripts / growl-tests

Este script invoca run-tests y captura stdout y stderr en archivos de registro. Luego muestra un mensaje similar a un gruñido basado en los resultados de run-tests . Debe personalizar este script para analizar los resultados de run-tests y decidir si se muestra un icono rojo o verde. El ejemplo que se muestra aquí analiza la salida de unittest de Python. Si utiliza un sistema diferente, deberá realizar los cambios apropiados en el script.

#!/bin/bash
# Run tests and display results in a "growl"-like window.

PROJECT_ROOT=$( cd "$( dirname "${BASH_SOURCE[0]}" )/.." && pwd )
TEST_RUNNER="$PROJECT_ROOT/scripts/run-tests"
STDOUT_LOG="$PROJECT_ROOT/logs/unittest_stdout.log"
STDERR_LOG="$PROJECT_ROOT/logs/unittest_stderr.log"

# Run the tests, copy stdout and stderr to STDOUT_LOG and STDERR_LOG
# respectively
$TEST_RUNNER > >(tee "$STDOUT_LOG") 2> >(tee "$STDERR_LOG" >&2)

# Capture the exit status of TEST_RUNNER.  We will use this for the
# red / green distinction in our Growl display.
TEST_STATUS=$?

# The following lines are specific to the Python 'unittest' output,
# and aren't required for the red / green display.  We extract a few
# extra bits of info so the Growl window can display something like:
#     Ran 452 tests in 8.300s
#     FAILED (failures=3)

# extract "Ran n tests in n.nnns"
TEST_SUMMARY='tail -3 "$STDERR_LOG" | head -1'

# extract "OK" or "FAILED (failures=n)"
TEST_RESULT='tail -1 "$STDERR_LOG"'

# Compose the two strings to make the entire message
GROWL_MESSAGE="$TEST_SUMMARY
$TEST_RESULT"

# Pick a sound and an icon based on TEST_STATUS
if [ $TEST_STATUS -eq 0 ] ; then
    GROWL_SOUND="Submarine"
    GROWL_ICON="$PROJECT_ROOT/scripts/icons/GreenBead.png"
else
    GROWL_SOUND="Purr"
    GROWL_ICON="$PROJECT_ROOT/scripts/icons/RedBead.png"
fi

# Now display the results in a Growl-like window
echo "$GROWL_MESSAGE" | terminal-notifier -sound $GROWL_SOUND -contentImage $GROWL_ICON

archivo: scripts / autorun-tests

Esta secuencia de comandos invoca growl-tests una vez en el inicio, y luego nuevamente cuando se modifica algún archivo. En la mayoría de los casos, este archivo se puede usar literalmente sin ninguna modificación.

#!/bin/bash
# Run tests automatically whenever files change in the PROJECT_ROOT

PROJECT_ROOT=$( cd "$( dirname "${BASH_SOURCE[0]}" )/.." && pwd )
TEST_RUNNER="$PROJECT_ROOT/scripts/growl-tests"

# run tests once at startup
"$TEST_RUNNER"

# Run tests whenever anything under PROJECT_ROOT changes
# Note that we explicitly exclude the log files, since they get
# written as a result of running the tests.  If we didn't exclude
# them, fswatch would retrigger continuously.
fswatch --one-per-batch "$PROJECT_ROOT" --exclude logs | xargs -n1 -I{} "$TEST_RUNNER"

agrega íconos para hacerlo bonito

Coloque estos iconos en su directorio de scripts / iconos. Se usarán como iconos rojos y verdes en la ventana de crecimiento.

scripts / icons / GreenBead.png:

scripts/icons/RedBead.png:

para ejecutarlo

Simplemente abra una ventana de terminal e inicie las pruebas automáticas:

$ scripts/autorun-tests
    
respondido por el fearless_fool 14.09.2016 - 19:50

Lea otras preguntas en las etiquetas