Robot Framework中的自定义执行状态

1 投票
5 回答
4802 浏览
提问于 2025-04-18 18:02

在Robot Framework中,每个测试用例的执行状态可以是通过(PASS)或失败(FAIL)。但是我有一个特别的需求,就是当某些测试因为依赖关系而失败时,要把它们标记为未执行(NOT EXECUTED)。

我不太确定该怎么做到这一点。希望能得到专家的建议,以便我能继续进行。

5 个回答

-1

其实,你可以设置标签来运行你喜欢的任何关键词(比如用来做 sanity 测试、回归测试等等)

只需去你的测试脚本配置里设置标签就可以了

当你想要运行测试时,只需去运行选项卡,勾选“仅运行带有这些标签的测试”或“跳过带有这些标签的测试”

然后点击开始按钮 :) Robot framework 会选择任何匹配的关键词并运行它。

抱歉,我没有足够的声望来发布图片 :(

0

我这样解决的:

如果 ${blabla} 等于 ${True},就执行这个任务;否则,就在控制台记录 ${PREV_TEST_STATUS}${yellow}| NRUN |

测试没有执行,所以标记为 NRUN

在这里输入图片描述

1

如果你只想对日志/报告文件进行修改,可以看看这里,了解如何为--prerebotmodifier选项实现一个SuiteVisitor。正如Bryan Oakley所说,如果不注意,这可能会影响你的通过/失败计数。

目前在生成output.xml之前,似乎无法真正改变测试状态,不过有计划在RF 3.0中实现这个功能。同时也在讨论跳过状态

另一个更复杂的解决方案是通过实现一个监听器,来创建你自己的输出文件,配合--listener选项使用,这样可以生成符合你需求的输出文件(可能还会有原始的output.xml)。

还有一种可能是在测试执行期间设置标签,但我对此还不太熟悉,所以现在不能详细说明。这可能是处理那些依赖失败的另一种方法,因为有选项可以在生成日志/报告时忽略某些带标签的关键字。

1

你没办法,Robot 这个工具只支持两种测试状态:通过和失败。你可以把某个测试标记为非关键,这样它就不会影响构建,但在日志和报告中仍然会显示这个测试已经运行过。

Robot 的核心团队表示他们不会支持这个功能。想了解更多信息,可以查看 issue 1732

虽然 Robot 不支持跳过测试的概念,但你可以写一个脚本,扫描 output.xml 文件,删除那些你标记为跳过的测试(比如通过给测试加个标签)。你还需要调整 xml 文件中失败测试的数量。一旦你修改了 output.xml 文件,就可以使用 rebot 来重新生成日志和报告文件。

2

在实现 SKIP 状态之前,你可以使用 exitonfailure 这个选项来停止后续的测试执行,如果有一个关键测试失败了。然后,你可以修改 output.xml(和测试结果的 results.html),把那些测试显示为 "NOT_RUN"(灰色),而不是 "FAILED"(红色)。

这里有个例子(在 RobotFramework 3.1.1 和 Python 3.6 上测试过):

首先,创建一个新的类,继承抽象类 ResultVisitor

class ResultSkippedAfterCritical(ResultVisitor):

    def visit_suite(self, suite):
        suite.set_criticality(critical_tags='Critical')
        for test in suite.tests:
            if test.status == 'FAIL' and "Critical failure occurred" in test.message:
                test.status = 'NOT_RUN'
                test.message = 'Skipping test execution after critical failure.'

假设你已经创建了测试套件(比如用 TestSuiteBuilder()),然后运行它时 不要 创建 report.html 和 log.html:

outputDir = suite.name.replace(" ", "_") 
outputFile = "output.xml"

logger.info(F"Running Test Suite: {suite.name}", also_console=True)
result = suite.run(output=outputFile, outputdir=outputDir, \
         report=None, log=None, critical='Critical', exitonfailure=True)

注意,我使用了 "Critical" 作为关键测试的标识标签,并且使用了 exitonfailure 选项。

接着,重新查看 output.xml,并从中创建 report.html 和 log.html:

revisitOutputFile = os.path.join(outputDir, outputFile)
logger.info(F"Checking skipped tests in {revisitOutputFile} due to critical failures", also_console=True)
result = ExecutionResult(revisitOutputFile) 
result.visit(ResultSkippedAfterCritical())
result.save(revisitOutputFile)

reportFile = 'report.html'
logFile = 'log.html'
logger.info(F"Generating {reportFile} and {logFile}", also_console=True)
writer = ResultWriter(result)
writer.write_results(outputdir=outputDir, report=reportFile, log=logFile)

这样应该会显示所有在关键失败之后的测试状态为灰色的 "NOT_RUN":

enter image description here

撰写回答