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 Réponses :
OK, j'ai trouvé 3 réponses viables:
DbBot
et interrogez la base de données créée. xml.etree.ElementTree
est assez simple. 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.
Pouvez-vous expliquer comment vous avez étendu la méthode visit_test
(que je ne vois pas dans le code ResultVisitor)?
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.
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
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!