tests_paheko/runtest.sh

256 lines
5.2 KiB
Bash
Executable File

#!/bin/bash
# ------------------------------------------------------------------------
#
# Exécuter un ou plusieurs tests d'un fichier selenium
# au préalable :
# - convertir le fichier généré par l'IDE dans le format attendu par le runner
# - copier « au bon endroit » (/tmp) les fichiers pour les tests d'import
#
# Remarque : je tue le processus quand le message de fin apparait
# pour essayer de contourner le bug qui envoie le message ci-dessous :
#
# Jest did not exit one second after the test run has completed.
# 'This usually means that there are asynchronous operations that
# weren't stopped in your tests. Consider running Jest with
# `--detectOpenHandles` to troubleshoot this issue.
# voir aussi https://github.com/SeleniumHQ/selenium-ide/issues/1819
#
# TODO :
# - si zenity n'est pas disponible, faire un menu en mode texte
# voir du côté de jq (bôf)
# ------------------------------------------------------------------------
aide()
{
cat <<EOF >& 2
Exécuter un, plusieurs ou tous les tests d'un fichier de test Selenium
Appel : $(basename $0) -f fichier [-a] [-c] [-n] [-v] [-z répertoire] [-h] [-t timeout] [test ..]
-f fichier : fichier de test
-a : exécuter tous les tests du fichier
-c : afficher la fenêtre de chrome
-n : ne pas tuer le processus en fin de test
-v : afficher la ligne de commande
-z répertoire : sauver une copie d'écran dans le répertoire en cas d'échec
-t timeout : définir une attente max (défaut : 200000 ms)
-h : afficher cette aide
test : nom (partiel ou complet) d'un test ou d'une suite à exécuter
si absent, affiche un sélecteur pour choisir une des suites du fichier
EOF
}
traiter_test()
{
motif="^Ran all test suites.*"
while read line
do
if
echo "$line" | grep -q -e "Playback._executionLoop"
then
continue
else
echo "$line"
if
echo $line | grep -q -E -e "$motif"
then
echo "** Fini ***"
pids=$(pgrep --full selenium-side-runner)
if [[ -n "$pids" ]]
then
kill $pids
fi
ps faux | grep selenium-side-runner | grep -v grep
fi
fi
done
}
# les constantes
CHROME_OPTIONS=disable-search-engine-choice-screen,disable-infobars
JEST_OPTIONS='"\"--detectOpenHandles\""'
TIMEOUT=200000
# les options
IMGDIR=""
KILL=1
declare -A options=(
[--jest-timeout]=${TIMEOUT}
[--jest-options]=${JEST_OPTIONS}
)
# Traiter les arguments
ARGS=""
while [[ $# -gt 0 ]]
do
case "$1" in
-f )
# nom du fichier de test
shift
TESTFILE="$1"
if
! echo "$TESTFILE" | grep -q -e "_v3"
then
TESTFILE=${TESTFILE/.side/_v3.side}
fi
shift
;;
-a )
# exécuter tous les tests
TESTS=tous
shift
;;
-c )
# afficher la fenêtre de chrome
CHROME=yes
shift
;;
-n )
# ne pas tuer le processus en fin de test
KILL=0
shift
;;
-t )
# timeout
shift
TIMEOUT="$1"
shift
;;
-v )
# afficher la ligne de commande
AFFCOMM=1
shift
;;
-z )
shift
IMGDIR="$1"
mkdir -p $IMGDIR
shift
;;
-h | -? )
aide
exit
;;
-* )
# autres arguments de selenium-side-runner (+-)
ARGS+=" $1"
shift
;;
* )
# exécuter les tests fournis en argument
break
;;
esac
done
# vérifier si on a un nom de fichier
if [[ -z "$TESTFILE" ]]
then
printf "\n*** Erreur : il manque le nom du fichier de test ***\n\n" >& 2
aide
exit
fi
if [[ -z "$CHROME" ]]
then
CHROME_OPTIONS="${CHROME_OPTIONS},headless"
fi
options[-c]+="goog:chromeOptions.args=[${CHROME_OPTIONS}]"
if [[ -n "$IMGDIR" ]]
then
options[-z]+=${IMGDIR}
fi
options[--timeout]=${TIMEOUT}
# la commande
COMMANDE="selenium-side-runner $ARGS"
for elem in ${!options[@]}
do
COMMANDE="${COMMANDE} $elem ${options[$elem]}"
done
# S'assurer que le script de test est à jour
make ${TESTFILE}
if [[ $? -ne 0 ]]
then
exit $?
fi
# copier les fichiers à envoyer dans /tmp
rm -f Membres*.csv *membres.csv
cp -p fichiers/* /tmp
# exécuter les tests
if [[ "$TESTS" == "tous" ]]
then
# exécuter tous les tests
COMMEXEC="${COMMANDE} ${TESTFILE}"
if [[ -n "$AFFCOMM" ]]
then
printf "%s\n\n" "$COMMEXEC"
fi
if [[ $KILL -eq 1 ]]
then
eval ${COMMEXEC} 2>&1 | traiter_test
else
eval ${COMMEXEC}
fi
elif [[ $# -gt 0 ]]
then
# exécuter les tests passés en arguments
for test in "$@"
do
echo "Tester « $test »"
COMMEXEC="${COMMANDE} -f \"$test\" ${TESTFILE}"
if [[ -n "$AFFCOMM" ]]
then
printf "%s\n\n" "$COMMEXEC"
fi
if [[ $KILL -eq 1 ]]
then
eval ${COMMEXEC} 2>&1 | traiter_test
else
eval ${COMMEXEC}
fi
done
else
# Afficher les noms des suites de tests
lesTests=$(awk \
'/"suites"/ { suite=1 } ; \
$1 ~ /"name":/ && suite { print gensub(/^.*: "(.+)",$/, "\\1", "g")}' \
${TESTFILE} | \
sort | \
zenity \
--width=440 --height=500 \
--title "Suites" \
--text "Choisir au moins une suite" \
--list \
--multiple \
--column "Test"
)
OLDIFS=$IFS
IFS="\|"
for test in $lesTests
do
COMMEXEC="${COMMANDE} -f \"$test\" ${TESTFILE}"
if [[ -n "$AFFCOMM" ]]
then
printf "%s\n\n" "$COMMEXEC"
fi
CURIFS=$IFS
IFS=$OLDIFS
if [[ $KILL -eq 1 ]]
then
eval ${COMMEXEC} 2>&1 | traiter_test
else
eval ${COMMEXEC}
fi
IFS=$CURIFS
done
IFS=$OLDIFS
fi