Tests unitaires graphiques sans carte vidéo !

J'ai découvert aujourd'hui le serveur X virtuel xvfb et son wrapper xvfb-run. xvfb-run crée un environnement X tout à fait standard pour le client X qu'il lance hormis que dans les faits, tout se passe en mémoire et aucun affichage n'est produit (il n'est même pas nécessaire que la machine soit équipée d'une carte graphique). Je me suis immédiatement dit que xvfb pouvait être utile pour dérouler les tests unitaires du projet Orfeo Toolbox auquel je contribue modestement :

  1. Il n'est plus nécessaire de maintenir des sessions ouvertes sur les serveurs de test.
  2. Les tests automatisés de paquets que j'envisageais de faire via VirtualBox pourront être fait via libvirt et dans des VM ne disposant même pas d'environnement graphique (c'est intéressant car elles seront plus légères et parce que dans ce contexte, libvirt est plus performant que VirtualBox).
  3. À terme, nous pouvons même envisager de déployer des environnements de test sur des serveurs musclés mais ne disposant pas d'interface graphique.

Je me suis donc empressé de réaliser un test avec la bibliothèque Orfeo Toolbox. Pour limiter la batterie de tests aux tests graphiques, il faut habituellement lancer les commandes suivantes (nous utilisons les outils CMake et CTest) :

$ cd ~/otb/build/OTB
$ ctest -T test -R ^vr
  Site: vortex.dinot.net
  Build name: Debian-GNU-Linux-Wheezy-amd64-Debug
  Test project /home/sdinot/otb/build/OTB
        Start 1845: vrTuImageWidgetNew
   1/52 Test #1845: vrTuImageWidgetNew ........  Passed  0.08 sec
  [...]
        Start 1896: vrTuAmplitudeFunctorTest
  52/52 Test #1896: vrTuAmplitudeFunctorTest .  Passed  0.07 sec
 
  100% tests passed, 0 tests failed out of 52
  Total Test time (real) =  29.01 sec
$

Avec le wrapper xvfb-run, la commande devient :

$ cd ~/otb/build/OTB
$ xvfb-run -a -n 1 -s "-screen 0 1024x768x24 -dpi 96" \
    ctest -T test -R ^vr
  Site: yoda.isdi0.si.c-s.fr
  Build name: Ubuntu-GNU-Linux-12.10-x86_64-Debug
  Test project /home/sdinot/otb/build/OTB
        Start 1845: vrTuImageWidgetNew
   1/52 Test #1845: vrTuImageWidgetNew ........  Passed  0.07 sec
  [...]
        Start 1896: vrTuAmplitudeFunctorTest
  52/52 Test #1896: vrTuAmplitudeFunctorTest .  Passed  0.07 sec
 
  100% tests passed, 0 tests failed out of 52
 
  Total Test time (real) =  24.59 sec
$

Pas la moindre fenêtre de test n'est venue perturber ma session graphique ! Cerise sur le gâteau, ces tests sont bouclés plus rapidement lorsque la sortie graphique se fait en mémoire plutôt que sur l'écran. L'écart de 4 à 5 secondes - soit un gain de 15 % - que l'on peut constater dans les rapports ci-dessus est en effet parfaitement reproductible !