如何在使用Robot Framework时打印可用标签

4 投票
3 回答
8247 浏览
提问于 2025-04-18 06:30

如果我在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

撰写回答