Impostazione di notifiche automatiche rosse / verdi per test continui e TDD?

1

Nota: questo è stato originariamente pubblicato sotto StackOverflow e qualcuno lo ha drasticamente ridimensionato perché è specifico per OS X. Quindi sto ripubblicando qui, dato che è stato generalmente utile.

Mi piace fare Test Driven Development (TDD), e quindi vorrei un modo per far funzionare la mia suite di test ogni volta che apporto una modifica a un file sorgente oa un file di test.

Inoltre, mi piacerebbe che i risultati del test venissero visualizzati in una finestra di stile "Growl" nell'angolo dello schermo, mostrando un'icona verde se tutti i test sono passati e un'icona rossa se uno o più test falliscono .

So che esiste un tale meccanismo per node.js in mocha, e per gli ambienti ruby c'è guard-rspec. Ma come posso crearne uno per il mio ambiente di test [compilare lo spazio vuoto] sotto OS X?

    
posta fearless_fool 14.09.2016 - 19:50
fonte

1 risposta

1

Sotto OS X, puoi creare una soluzione semplice usando due utility disponibili: fswatch e terminal-notifier e tre semplici script di bash. Ecco come:

scarica fswatch e terminale-notificatore

$ brew install fswatch
$ brew install terminal-notifier

imposta le directory del progetto

Le mie directory di progetto sono strutturate come segue, ma ovviamente puoi scegliere strategie alternative:

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

crea tre script bash

file: script / run-test

Questo è un semplice script che richiama i test del tuo framework. In questo caso stiamo eseguendo python unittest , ma puoi personalizzarlo in base alle tue esigenze:

#!/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

file: script / growl-test

Questo script richiama run-tests e cattura stdout e stderr nei file di registro. Quindi visualizza un messaggio simile a un ringhio basato sui risultati di run-tests . È necessario personalizzare questo script per analizzare i risultati di run-tests e decidere se visualizzare un'icona rossa o verde. L'esempio mostrato qui analizza l'output di% co_de di Python. Se si utilizza un sistema diverso, è necessario apportare le modifiche appropriate allo 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

file: script / test automatici

Questo script richiama unittest una volta all'avvio, e poi di nuovo ogni volta che un file viene modificato. Nella maggior parte dei casi, questo file può essere utilizzato letteralmente senza alcuna modifica.

#!/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"

aggiungi icone per renderlo carino

Inserisci queste icone nella directory degli script / icone. Questi saranno usati come icone rosse e verdi nella finestra di Growl.

scripts / icone / GreenBead.png:

scripts/icons/RedBead.png:

per eseguirlo

Apri semplicemente una finestra di terminale e avvia i test di autorun:

$ scripts/autorun-tests
    
risposta data 14.09.2016 - 19:50
fonte

Leggi altre domande sui tag