La mia soluzione era molto diversa. Invece della monkeypatching ho approfittato del fatto che tutti i miei test sono stati avviati tramite script di lancio appositamente predisposti. Raccoglie varie variabili di configurazione e ambiente di setup, quindi è stato abbastanza semplice aggiungere solo un'esportazione extra.
Potrebbe essere una soluzione ragionevole per i casi più generici, invece di eseguire test direttamente, creare test-runner.sh (o qualsiasi altra cosa) che farà esattamente la stessa chiamata di shell ma con un'esportazione extra prefissata.
Perché uno un'immagine vale migliaia di parole:
Questo è il mio test runner:
#!/usr/bin/env bash
VERBOSE=false
while getopts ":vt:" opt; do
case $opt in
t)
TEST_TO_RUN=$OPTARG
;;
v)
VERBOSE=true
;;
\?)
echo "Invalid option: -$OPTARG" >&2
exit 1
;;
:)
echo "Option -$OPTARG requires an argument." >&2
exit 1
;;
esac
done
ENVS=""
ENVS+=" PYTHONPATH=$PYTHONPATH:$PWD"
PARAMS=""
PARAMS+=" -s --nologcapture --with-id"
PARAMS+=" --cov-config=.apirc --cov-report html --with-cov"
SERVER_PRIMER="coverage run --rcfile=.apirc"
if [[ ! -z "$TEST_TO_RUN" ]]; then
PARAMS+=" $TEST_TO_RUN"
fi
if [[ "$VERBOSE" = true ]]; then
PARAMS+=" -v"
ENVS+=" TEST_VERBOSITY=2"
fi
eval "$ENVS nosetests $PARAMS"
RESULT_TEST=$?
E poi ho questo metodo su unit test:
@property
def verbosity(self):
return int(os.environ.get('TEST_VERBOSITY', 0))