如何在使用Robot Framework时打印可用标签
如果我在Robot Framework中有一个很大的测试套件,并且有很多标签,是否可以知道这个套件中有哪些标签名呢?
比如说,有没有类似于pybot --listtags这样的命令?
这对实际要运行测试的人来说会很有帮助。
举个例子,在发布新闻文章的场景中,测试用例可能会被标记为“publish”、“published”或“publishing”。
而测试人员可能没有RIDE这个工具,所以他们可能不知道确切的标签名。
在这种情况下,我觉得提取可用的标签并显示出来会很有用——而不需要运行任何测试。这样他们就可以选择用想要的标签来运行测试。
我查阅了Robot Framework的用户指南,但没有找到可以实现这个功能的命令行选项。
3 个回答
1
在机器人3.2版本中,API(应用程序接口)是不同的,以下是我所做的:
from robot.api import get_model
import ast
def _check_tags(self, file):
class TestTagPrint(ast.NodeVisitor):
def visit_File(self, node):
print(f"{node.source}")
# to get suite level force tags
for section in node.sections:
for sect in section.body:
try:
if sect.type == 'FORCE_TAGS':
print(sect.values)
except AttributeError as ae:
pass
self.generic_visit(node)
def visit_TestCase(self, node):
for statement in node.body:
# to get tags at test case level
if statement.type == "TAGS":
print(statement.values)
model = get_model(file)
printer = TestTagPrint()
printer.visit(model)
这两个打印语句会返回一个元组。
在这个API中可能有更简单或更好的方法。
我发现机器人框架4的API也不同。
1
我使用了一个Robot Framework的输出文件监听器,来列出当前测试套件的所有标签。
from lxml import etree as XML
"""Listener that prints the tags of the executed suite."""
ROBOT_LISTENER_API_VERSION = 3
tags_xpath = ".//tags/tag"
def output_file(path):
root = XML.parse(path).getroot()
tag_elements = root.xpath(tags_xpath)
tags = set()
for element in tag_elements:
tags.add(element.text)
print("\nExisting tags: " + str(tags) + "\n")
你可以把这个监听器和干运行模式结合使用,这样可以快速获取一个测试套件的标签数据。
robot --listener get_tags.py --dryrun ./tests
这些标签会在控制台日志的输出文件部分列出来。
==============================================================================
Existing tags: {'Tag1', 'a', 'Tag3.5', 'Feature1', 'b', 'Tag3', 'Feature2'}
Output: D:\robot_framework\output.xml
Log: D:\robot_framework\log.html
Report: D:\robot_framework\report.html
10
机器人并没有提供任何方法来获取这些信息。不过,写一个使用机器人解析器的Python脚本来获取所有标签信息其实很简单。这里有一个我认为是正确的快速解决方案(虽然我只测试过很短的时间):
from robot.parsing import TestData
import sys
def main(path):
suite = TestData(parent=None, source=path)
tags = get_tags(suite)
print ", ".join(sorted(set(tags)))
def get_tags(suite):
tags = []
if suite.setting_table.force_tags:
tags.extend(suite.setting_table.force_tags.value)
if suite.setting_table.default_tags:
tags.extend(suite.setting_table.default_tags.value)
for testcase in suite.testcase_table.tests:
if testcase.tags:
tags.extend(testcase.tags.value)
for child_suite in suite.children:
tags.extend(get_tags(child_suite))
return tags
if __name__ == "__main__":
main(sys.argv[1])
需要注意的是,这个方法不会获取通过设置标签这个关键词创建的标签,也不会考虑通过移除标签删除的标签。
把代码保存到一个文件里,比如叫get_tags.py,然后这样运行它:
$ python /tmp/get_tags.py /tmp/tests/
a tag, another force tag, another tag, default tag, force tag, tag-1, tag-2