Tests et Intégration Continue

Tests

Pré-requis

Pour les tests, deux librairies sont utilisées :

Pour le tests d’envoi de courriel, un server STMP local est intégré à om-tests :

Avertissement

Il faut utiliser la version 2.7 de python.

Installation

Principe

Afin de ne pas pertuber l’environnement python système, et conserver la cohérence des dépendances, il est conseillé d’installer les librairies nécessaires et leur dépendances dans un environment cloisonné. Pour cela, on utilise Virtualenv. Les libraires et les binaires seront déployés en espace utilisateur, il faudra activer le Virtualenv pour pouvoir lancer les tests.

Pour la suite, les exemples de codes sont basés sur un environnement Ubuntu 16.04. On suppose également qu’il existe une copie locale de openmairie_exemple disponible dans ~/openmairie.

Installation des paquets de base

sudo apt install python python-dev python-pip libjpeg-dev
sudo -H pip install virtualenv

Création de l’environnement

virtualenv om-tests
cd om-tests
. bin/activate

Installation des librairies python

(om-tests) pip install -r ~/openmairie/tests/pip-requirements.txt

Installation de PHPUnit

Bien que ce ne soit pas une librairie python, on la déploie dans le virtualenv. L’activation du vitualenv va rajouter le chemin vers om-tests/bin dans la variable PATH de l’utilisateur.

(om-tests) cd bin
(om-tests) wget -O phpunit https://phar.phpunit.de/phpunit-5.7.phar
(om-tests) chmod +x phpunit

arborescence du répertoire tests

.
├── [drwxrwxr-x]  binary_files
├── [drwxrwxr-x]  doc
├── [drwxrwxr-x]  results
├── [drwxrwxr-x]  resources
│   ├── [drwxrwxr-x]  app
│   │   ├── [drwxrwxr-x]  gen
│   │   └── [-rw-rw-r--]  keywords.robot
│   ├── [-rw-rw-r--]  om-tests.cfg
│   └── [-rw-rw-r--]  resources.robot
├── [-rw-rw-r--]  config.xml
├── [-rw-rw-r--]  pip-requirements.txt
├── [-rw-rw-r--]  000_generation.robot
└── [-rw-rw-r--]  000_test_unitaire.php

tests/config.xml

<phpunit>
  <testsuites>
    <testsuite name="openmairie">
        <file>000_test_unitaire.php</file>
    </testsuite>
  </testsuites>
</phpunit>

tests/pip-requirements.txt

Liste des dépendances python (avec leur version) nécessaires à l’exécution des tests.

openmairie.devtools==0.4.0
openmairie.robotframework==4.8.10001
maildump==0.5.6
selenium==2.53.6
robotframework==3.0.4
robotframework-seleniumlibrary==3.1.1
robotframework-selenium2screenshots==0.8.1
requests==2.22.0
robotframework-requests==0.5.0
Pillow==6.1.0
robotframework-archivelibrary==0.4.0
psycopg2==2.8.3

tests/000_generation.robot

*** Settings ***
Resource  resources/resources.robot
Suite Setup  For Suite Setup
Suite Teardown  For Suite Teardown
Documentation  Le 'Framework' de l'application permet de générer
...  automatiquement certains scripts en fonction du modèle de données. Lors
...  du développement la règle est la suivante : toute modification du
...  modèle de données doit entrainer une regénération complète de tous les
...  scripts. Pour vérifier à chaque modification du code que la règle a bien
...  été respectée, ce 'Test Suite' permet de lancer une génération complète.
...  Si un fichier est généré alors le test doit échoué.


*** Test Cases ***
Génération complète

    Depuis la page d'accueil    admin    admin
    Générer tout

tests/000_test_unitaire.php

<?php
class General extends PHPUnit_Framework_TestCase {

    /**
     * Méthode lancée en début de traitement
     */
    public function setUp() {
    }

    /**
     * Méthode lancée en fin de traitement
     */
    public function tearDown() {
    }

    /**
     * Test Case n°01
     */
    public function test_case_01() {
        require_once "../obj/utils.class.php";
        @session_start();
        $_SESSION['collectivite'] = 1;
        $_SESSION['login'] = "admin";
        $_SERVER['REQUEST_URI'] = "";
        $f = new utils("nohtml");
        $f->disableLog();

        $this->assertEquals($year, 2015);

        $f->__destruct();
    }
}
?>

tests/doc/

Répertoire destiné à recevoir la génération de la documentation des mots clés Robot Framework.

tests/results/

Répertoire destiné à recevoir la génération des rapports et des captures d’écran produits pendant l’exécution des tests. Afin que ces nouveaux fichiers ne gênent pas l’utilisation des commandes Subversion, tous les fichiers à l’intérieur de ce dossier sont ignorés grâce à la propriété svn:ignore.

tests/binary_files/

Répertoire destiné à recevoir les fichiers de configuration ou d’initialisation de l’environnement de tests.

tests/resources/

Répertoire contenant les ressources utilisées par les tests suite.

tests/resources/resources.robot

*** Settings ***
# Keywords framework
Library  openmairie.robotframework.Library
# Keywords application
Resource  app${/}keywords.robot

*** Variables ***
${SERVER}           localhost
${PROJECT_NAME}     openexemple
${BROWSER}          firefox
${DELAY}            0
${ADMIN_USER}       admin
${ADMIN_PASSWORD}   admin
${PROJECT_URL}      http://${SERVER}/${PROJECT_NAME}/
${PATH_BIN_FILES}   ${EXECDIR}${/}binary_files${/}
${TITLE}            :: openMairie :: openexemple

*** Keywords ***
For Suite Setup
    Reload Library  openmairie.robotframework.Library
    # Les keywords définit dans le resources.robot sont prioritaires
    Set Library Search Order    resources
    Ouvrir le navigateur
    Tests Setup

For Suite Teardown
    Fermer le navigateur

tests/resources/om-tests.cfg

[om-tests]
database_name=openexemple
instance_name=openexemple

tests/resources/app/

Répertoire contenant les fichiers de déclaration de mots clé dédiés à l’application.

tests/resources/app/gen/

Répertoire destiné à recevoir des fichiers de mots clé générés à partir du modèle de données.

tests/resources/app/keywords.robot

*** Settings ***
Documentation   Keywords openexemple.

*** Keywords ***
Depuis le listing
    [Documentation]
    [Arguments]  ${listing_obj}
    Go To  ${PROJECT_URL}${OM_ROUTE_TAB}&obj=${listing_obj}

Fonctionnement et Utilisation

Pré-requis

Toute les opérations suivantes vont faire appel aux binaires et libraires déployés dans l’environnement de test. Il faut donc qu’il soit activé :

cd om-tests
. bin/activate

Les tests doivent être joués dans un environnement balisé et reproductible à l’identique. Pour ce faire il est nécessaire avant chaque lancement de test, de dérouler une routine qui permet de mettre en place un environnement de tests. Un script permet de dérouler cette routine de manière automatisée :

(om-tests) om-tests -c initenv

Ce script permet de :

  • supprimer la base de données
  • créer la base de données
  • initialiser la base de données grâce au script data/pgsql/install.sql
  • redémarrer apache pour prendre les traductions en compte
  • donner les droits à apache pour les dossiers dans lequel il peut écrire
  • faire un lien symbolique vers le dossier de l’applicatif pour que les tests puisse y accéder depuis le dossier /var/www/
  • appliquer les opération d “initialisation précisées dans resources/om-tests.cfg

Les tests sont prévus pour être exécutés sur le navigateur Firefox. Il est possible d’utiliser une version spécifique automatiquement lors de l’execution des tests. Pour définir une version de navigateur spécifique il faut :

  • télécharger le navigateur Firefox conseillé :

  • extraire l’application dans le dossier souhaité

  • créer un lien symbolique, vers le binaire firefox, dans votre répertoire om-tests/bin

  • lancer une fois firefox depuis l’envirronement virtuel python

  • verifier que la version 45.9 est bien utilisé

firefox --version

Tous les tests

Lancer tous les tests avec initialisation de l’environnement de tests

(om-tests) om-tests -c runall

Un seul TestSuite

Lancer un TestSuite avec initialisation de l’environnement de tests

(om-tests) om-tests -c runone -t 000_testsuite_a_executer.robot

Lancer un TestSuite sans initialisation de l’environnement de tests

(om-tests) om-tests -c runone -t 000_testsuite_a_executer.robot --noinit

Serveur SMTP local

Le server STMP local (maildump) est intégré à om-tests. A chaque lancement de tests, il est démarré, puis arrêté à la fin de l’exécution de ceux-ci. La configuration mail adéquate est gérée par le initenv.

Il peut également être lancé à la demande.

Avertissement

Le serveur SMTP tourne sur le port 1025, il doit donc être disponible sur la machine.

Démarrage
(om-tests) om-tests -c startsmtp
Arrêt
(om-tests) om-tests -c stoptsmtp
Interface web

maildump fourni également un interface web, dans laquelle les courriels envoyés peuvent être consultés. Cette interface est accessible dans un navigateur à l’URL suivante

http://localhost:1080

Développement et bonnes pratiques

Il est prévu de consigner ici les bonnes pratiques et les consignes pour le développement des tests.

Documentation RobotFramework

Librairie du framework openMairie Core.

Cette documentation de la librairie du framework openMairie a été générée avec la commande suivante :

(om-tests) om-tests -c gendoc

La commande est automatiquement exécutée lorsque l’on lance un ou tous les TestSuite. La documentation est générée au format HTML dans le répertoire tests/doc. Il y a une documentation par dossier de ressources :

  • tests/resources/apptests/doc/app.html
  • tests/resources/coretests/doc/core.html

RobotFramework :

Librairies :

Convention de nommage

  • Un fichier de test par thème fonctionnel, une TestCase par fonctionnalité.
  • Convention de nommage :
    • des fichiers : mon_theme_fonctionnel.robot
    • des testcase : Saisir un nouvel élément

Génération

Pré-requis : créer le dossier “gen” dans “../tests/resources/core/gen/”.

Lancer une génération complète à chaque modification de la structure de la base de données permet de créer les mots-clefs basiques de chaque table : « depuis le contexte », « ajouter », « modifier », « supprimer » et « saisir ».

Bonnes pratiques

  • Éviter d’utiliser les sélecteurs XPATH, les sélecteurs CSS ou par ID sont largement préférables.
  • Isolation des tests : chacun des tests ajouté doit être indépendant de ceux existants (consitution de son propre jeu de données, accès aux éléments par recherche, éventuellement nettoyage des données crées, etc).

Intégration continue