5
votes

Analyser le fichier XML de sortie de Robot Framework

Le framework Robot crache un XML de sortie qui est ensuite utilisé pour construire les rapports HTML (avec rebot ), réexécuter les échecs, etc.

J'ai besoin d'analyser ce fichier pour générer d'autres rapports, en particulier, j'ai besoin d'analyser la documentation du cas de test pour un regex, d'obtenir le résultat du cas de test, puis de créer un rapport (c'est pour l'intégration avec un système hérité).

Est-ce que Robot Framework fournit des fonctionnalités pour analyser facilement le fichier XML de sortie ou nous utilisons simplement des bibliothèques d'analyse XML standard?


3 commentaires

Le framework Robot fournit des fonctionnalités pour analyser le XML de sortie - aux fins que vous avez répertoriées, créez les rapports HTML, réexécutez les échecs, etc. Vous semblez avoir besoin de données personnalisées - et il n'y a pas beaucoup d'outils qui le feront fournir "toute sortie personnalisée en xml", mais en programmation.


Vérifiez ceci: github.com/robotframework/DbBot


@LubosJerabek qui semble cool et bon pour ce dont j'ai besoin, merci!


3 Réponses :


5
votes

OK, j'ai trouvé 3 réponses viables:

  1. Utilisez DbBot et interrogez la base de données créée.
  2. Analysez directement le fichier XML. Utiliser xml.etree.ElementTree est assez simple.
  3. Utilisez le ExecutionResult de Robot Framework, qui suit le modèle Visiteur (dans ResultVisitor , que nous devons étendre) et qui vous permet de faire ce dont vous avez besoin dans la méthode visit_test .

Nous avons opté pour l'option 3 car elle fait partie de Robot Framework et est moins susceptible de se casser (ou plus facile à corriger) si le format du fichier XML change.


1 commentaires

Pouvez-vous expliquer comment vous avez étendu la méthode visit_test (que je ne vois pas dans le code ResultVisitor)?



5
votes

J'ai eu un problème similaire au vôtre et pour moi en utilisant le Listener du Robot Framework L'interface était la solution la plus pratique.

La méthode output_file de L'API de la version 3 de l'écouteur sera appelée lorsque l'écriture dans un fichier de sortie est prête. L'argument de la méthode est le chemin absolu vers le fichier XML de sortie, et tout cela est nécessaire pour créer tout type de nouveaux rapports.

Exemple:

D:\robot_framework>robot --listener my_listener.py my_test.robot
==============================================================================
My Test
==============================================================================
Some Test                                                             | PASS |
------------------------------------------------------------------------------
My Test                                                               | PASS |
1 critical test, 1 passed, 0 failed
1 test total, 1 passed, 0 failed
==============================================================================
Extra log: D:\robot_framework\extra.log
Output:  D:\robot_framework\output.xml
Log:     D:\robot_framework\log.html
Report:  D:\robot_framework\report.html

Journal de la console d'une exécution de test:

import os

"""Listener that parses the output XML when it is ready and creates a unique log."""

ROBOT_LISTENER_API_VERSION = 3

def output_file(path):
    # parse xml with etree or lxml
    log_dir = os.path.split(path)[0]
    print('Extra log: %s' % (log_dir + '\\extra.log'))

Le fichier journal supplémentaire est répertorié parmi les sorties par défaut.


0 commentaires

1
votes

Cette réponse emprunte à l'exemple de Bence, mais ajoute la fonctionnalité d'écho des lignes de résumé du total général.

Critical Tests: 3 tests, 1 passed, 2 failed, 33.3% pass rate (--listener summary)
All Tests: 7 tests, 3 passed, 4 failed, 42.9% pass rate (--listener summary)

Cette version imprime sur STDOUT au lieu d'écrire dans un fichier, insérant ainsi ces deux lignes près du fin de la sortie. Convient pour grep (en particulier pour une utilisation dans le plugin Jenkins job description-setter .)

#!/usr/bin/env python3

# invoke with robot --listener API-Libs/RF_Listener.py

import xml.etree.ElementTree as xmlElementTree

ROBOT_LISTENER_API_VERSION = 3

class RF_Listener:  # class should be same as filename

    def __init__(self):
        self.ROBOT_LISTENER_API_VERSION = 3

    def output_file(self, path):  # Listener that parses the output XML when it is ready
      root = xmlElementTree.parse(path).getroot()
      for type_tag in root.findall('./statistics/total/stat'):
      # <stat pass="1" fail="2">Critical Tests</stat>
      # <stat pass="3" fail="4">All Tests</stat>
        cntPassed = int(type_tag.attrib.get("pass"))  # attrib is dict-like (except for 'text')
        cntFailed = int(type_tag.attrib.get("fail"))
        cntTests = cntPassed + cntFailed
        pct_pass = cntPassed / cntTests * 100
        fmt_str = "{}: {} tests, {} passed, {} failed, {:.3g}% pass rate (--listener summary)"
        print(fmt_str.format(type_tag.text,cntTests, cntPassed, cntFailed,pct_pass))
      # optionally write grand total results summary to a file


0 commentaires