无需.robot/.txt脚本运行Robot Framework及JSON生成用例咨询
直接通过代码/JSON运行Robot Framework的实现方案
完全不需要强制生成.robot/.txt格式的脚本文件,Robot Framework原生提供Python API支持全内存动态组装测试逻辑并执行,天然支持步骤间依赖前置步骤输出的场景,适配你当前用JSON存储测试序列的需求。
核心实现逻辑
Robot Framework的执行内核本身不依赖磁盘上的.robot格式文件,所有脚本解析完成后最终都会转化为内存中的测试套件、测试用例、关键字调用结构,你可以跳过文件解析步骤,直接通过API组装这些结构后执行:
- 自定义步骤适配:你JSON中
step_type对应的公共函数库可以直接导入测试套件,不需要额外封装Robot格式的关键字,函数执行的返回值会自动纳入测试上下文,后续步骤可以直接通过变量名引用,不需要自己维护步骤间的传值逻辑。 - 流程控制适配:你JSON中定义的if/else、for、while等分支、循环逻辑,可以直接映射为Robot内置的对应流程控制关键字,不需要从零实现流程执行引擎。
- 执行输出无差异:内存组装的套件执行后,生成的日志、测试报告和通过
.robot文件执行的结果完全一致,支持所有Robot原生的断言、标签、监听器等特性。
最小实现示例
以下是不依赖任何.robot文件,直接在代码中组装测试并执行的示例,你可以基于这个逻辑对接自己的JSON结构:
from robot.api import TestSuite, ResultWriter # 初始化内存中的测试套件,无任何磁盘.robot文件依赖 suite = TestSuite(name="JSON序列驱动测试套件") # 导入你自己的步骤函数库,对应JSON中各个step_type的实现 suite.resource.imports.library("your_custom_step_lib.py") # 以下逻辑可替换为读取你的JSON结构,动态组装测试用例 test_case = suite.tests.create(name="seq_id_1 测试用例") # 组装普通顺序步骤,对应sequence_data中的节点 test_case.keywords.create(name="step_1", args=["param_a_val", "param_b_val"]) # 组装IF分支逻辑,对应flag_type=if的配置 if_block = test_case.keywords.create(name="IF", args=["${mid_val} > ${comparison_left_var}"]) if_block.keywords.create(name="分支满足时执行的步骤", args=[]) else_block = if_block.keywords.create(name="ELSE") else_block.keywords.create(name="分支不满足时执行的步骤", args=[]) # 组装FOR循环逻辑,对应flag_type=for的配置 for_block = test_case.keywords.create(name="FOR", args=["${idx}", "IN RANGE", "${loop_length}"]) for_block.keywords.create(name="循环内执行的步骤", args=["${idx}"]) # 直接执行测试套件 run_result = suite.run(output="test_output.xml") # 生成可视化测试报告 ResultWriter("test_output.xml").write_results(report="test_report.html", log="test_log.html")
适配你的JSON结构的注意事项
- 不需要调整现有JSON的存储结构,只需要写一层递归遍历的转换逻辑:遇到普通
sequence_data节点就生成对应普通关键字调用,遇到flag_data节点就根据flag_type生成对应的流程控制块,嵌套的步骤递归处理即可。 - 步骤间的变量传递不需要额外开发:你只需要在转换步骤时,把步骤的返回值赋值给指定变量名,后续步骤引用对应变量名即可拿到前置步骤的输出,比pytest/unittest通过fixture或者全局变量传值的方式更适配线性测试序列的场景。
- 如果你后续需要扩展重试、异常捕获等逻辑,直接映射Robot对应的内置关键字即可,不需要修改核心执行逻辑。
你当前存储测试序列的JSON结构参考:
{ "seq_id": 1, "seq_type": 1, "seq_len": 1, "flag_data": { "flag_name": "", "flag_type": "", "flag_length": 1, "mid_val": 1, "comparison_left_type": '>', "comparison_left_var": 1, "comparison_right_type": '<', "comparison_right_var": 1, "loop_length": 1 }, "sequence_data": [{ "step_name": 'step_1', "step_type": '', "step_variable_a": a, "step_variable_b": b }] }
内容的提问来源于stack exchange,提问作者Tracy Wang
相关产品推荐
相关产品推荐

