Autour du codeDevelopper toujours mieux
Posté le

Ecrire des tests fonctionnelles avec Robot Framework

C'est quoi Robot Framework ?

Robot Framework est un outil qui permet d'écrire des tests fonctionnels en les présentant sous forme de tableau en faisant abstraction de toute logique. Pour faire simple, on ne programme plus des tests, mais on écrit un cahier de recette. Dans cet article, on va donc écrire des tests en dessinant des tableau au format texte.

Sachez néanmoins que Robot Framework permet aussi l'utilisation d'autre format comme html avec des balises table, tsv que l'on pourra éditer avec un tableur, ou reStructuredText.

Ecriture des premiers tests

Imaginons que l'on souhaite écrire des tests pour la commande GNU Linux sort.

Voici deux exemples de test que l'on pourrait écrire en utilisant le format texte.

*** Test Cases ***

Trier Des Mois En Français
    Prendre un fichier contenant
    ...    mai    févr.    nov.    mars    sept.    juin
    ...    août    janv.    juil.    oct.    avril    déc.
    Trier le fichier avec l'option -M et la local fr_FR.UTF-8
    La sortie doit être
    ...    janv.    févr.    mars    avril    mai    juin    juil.
    ...    août    sept.    oct.    nov.    déc.


Trier Des Mois En Anglais
      Prendre un fichier contenant
      ...    September    March    July    January    April    October    June
      ...    August     February     December    May    November
      Trier le fichier avec l'option -M et la local en_EN.UTF-8
      La sortie doit être
      ...    January    February     March    April    May    June    July
      ...    August    September     October    November    December

Ce test contient deux tableaux Trier Des Mois En Français et Trier Des Mois En Anglais

Chaque cellule d'un tableau est séparée par 4 espaces. Les lignes d'un même tableau n'ont pas forcement le même nombre de cellules ainsi dans l'exemple, la première ligne du tableau contient 13 cellules, les ... servent à couper une ligne en 2 lorsqu'elle est trop longue. La seconde ligne contient une seule cellule.

Les mots clés

Si l'on souhaite exécuter ce test on va avoir le message d'erreur suivant: No keyword with name 'Prendre un fichier contenant' found.

Un mot-clé est une instruction que robot framework va tenter d'exécuter. Ainsi, dans notre exemple, si un humain peut tout à fait comprendre le mot-clé Prendre Un Fichier Contenant Ce n'est pas encore le cas de Robot Framework, on va donc lui donner un petit coup de main en définissants ce mot-clé via des mots-clés déjà définis dans Robot Framework.

*** Keywords ***

Prendre un fichier contenant
    # On stocke les arguments de ce mot-clé dans la variable ligne de type list
    [Arguments]    @{lignes}
    # On joint chaque élément dans lignes avec un '\n' et on stocke
    # le résultat dans la variable `content_file`.
    ${content_file}=    Catenate     SEPARATOR=\n    @{lignes}
    Create File    ${TEMPDIR}${/}input.txt    ${content_file}

Ainsi quand une cellule d'un tableau de test contiendra le mot-clé Prendre un fichier contenant, les cellules suivantes de la ligne seront jointes entre elles par un saut de ligne et le tous sera inscrit dans un fichier dans le répertoire temporaire.

Robot Framework permet aussi de faire des mots-clés ou les arguments, au lieu d'être passé via les cellules suivantes seront passées en étant intégrées au mot-clé.

Ainsi, on peut définir un mot-clé comme ceci:

Trier le fichier avec l'option ${option} et la local ${local}
    Run Process     sort    ${option}    ${TEMPDIR}${/}input.txt
    ...    -o    ${TEMPDIR}${/}output.txt    env:LC_TIME=${local}

Le mot-clé Run Process permet d'exécuter une commande. Pour exporter une variable d'environnement vers la commande exécutée, on va utiliser la syntaxe env:nom_de_la_variable:valeur.

Il nous reste plus qu'a définir le mot-clé La sortie doit être

La sortie doit être
    [Arguments]    @{lignes}
    ${fichier}=    Get File     ${TEMPDIR}${/}output.txt
    ${expected}=    Catenate     SEPARATOR=\n    @{lignes}
    Should Be Equal    ${fichier}    ${expected}\n

La définition des mots-clés peuvent être placés dans le même fichier, mais on va plutôt les mettre dans un fichier séparé que l'on va appeler testSortResource.robot on indiquera dans notre fichier principal qu'il doit utiliser le fichier testSortResource.robot via le mot-clé resource. On va également avoir besoin d'importer les librairies OperatingSystem et Process pour pouvoir utiliser les mots-clés Create File ou Run Process

*** Settings ***
Resource    testSortResource.robot


*** Test Cases ***
Trier Des Mois En Français
    Prendre un fichier contenant
    ...    mai    févr.    nov.    mars    sept.    juin
    ...    août    janv.    juil.    oct.    avril    déc.
    Trier le fichier avec l'option -M et la local fr_FR.UTF-8
    La sortie doit être
    ...    janv.    févr.    mars    avril    mai    juin    juil.
    ...    août    sept.    oct.    nov.    déc.


Trier Des Mois En Anglais
      Prendre un fichier contenant
      ...    September    March    July    January    April    October    June
      ...    August     February     December    May    November
      Trier le fichier avec l'option -M et la local en_EN.UTF-8
      La sortie doit être
      ...    January    February     March    April    May    June    July
      ...    August    September     October    November    December

*** Settings ***
Library           Process
Library           OperatingSystem


*** Keywords ***
Prendre un fichier contenant
    [Arguments]    @{lignes}
    ${fichier}=    Catenate     SEPARATOR=\n    @{lignes}
    Create File    ${TEMPDIR}${/}input.txt    ${fichier}


Trier le fichier avec l'option ${option} et la local ${local}
    Run Process     sort    ${option}    ${TEMPDIR}${/}input.txt
    ...    -o    ${TEMPDIR}${/}output.txt    env:LC_TIME=${local}


La sortie doit être
    [Arguments]    @{lignes}
    ${fichier}=    Get File     ${TEMPDIR}${/}output.txt
    ${expected}=    Catenate     SEPARATOR=\n    @{lignes}
    Should Be Equal    ${fichier}    ${expected}\n

On peut alors lancer les tests en invoquant la commande robot:

$ robot testSort.robot
==============================================================================
testSort
==============================================================================
Trier Des Mois En Français                                            | PASS |
------------------------------------------------------------------------------
Trier Des Mois En Anglais                                             | PASS |
------------------------------------------------------------------------------
testSort                                                              | PASS |
2 critical tests, 2 passed, 0 failed
2 tests total, 2 passed, 0 failed
==============================================================================
Output:  /home/autourducode/test_sort/output.xml
Log:     /home/autourducode/test_sort/log.html
Report:  /home/autourducode/test_sort/report.html

Voilà, j'espère que ça vous a plu, à vos cahier et bonne recette. laughing