负责加载测试脚本文件,模块代码路径./src/robot/parsing/
一、解析逻辑
我们以keyword_driven.robot测试脚本为例,入口点是./src/robot/parsing/model.py的TestData()函数,分析其中的解析过程。
1.1 表格解析器
-
TestCaseFile构造函数中会实例化四个表格对象:设置表格、变量表格、测试用例表格、用户关键字表格,并在populate()函数中调用FromFilePopoulator(self).populate(self.source); - 打开脚本文件,并从路径中获取后缀名,再到
READERS字典获取到对应的文件格式读取器; -
TxtReader继承了TsvReader,读取出文件中的每一行; -
TxtReader根据定义的格式将一行字符划分成列(cells),其分隔符为两个既以上的空格,“|”也是分隔符; -
DataRow会区分cells中的注释部分和与非注释部分; -
TsvReader中判断cell[0]是否为星号“*”字符开始,以此解决用解析到时的关键字去获取相应的表格对象; - 通过表格对象type属性查找出对应的解析器,赋值给
FromFilePopulator._populator,作为当前表格解析器; - 如果
cell[0]不是星号“*”字符开始,则调用当前表格解析器的add()方法。
1.2 表格内解析器
- 文件格式读取器解析出每一行的每一列;
-
DataRow判断第一列不为连续行标识“…”,便用名称从ResourceFileSettingTable找到Documentation相应对象; -
Documentation对象创建的表格内解析器DocumentationPopulator; - 本行后续列调用
DocumentationPopulator.add()方法添加; - 若第一列为连续行标识,则继续使用上一次的解析器,调用
add()方法,直到不是连续行标识为止; - 解析到设置项Library,同样从
ResourceFileSettingTable找到相应对象ImportList; - 创建相应的表格内解析器
SettingPopulator,替换成为当前解析器; - 同时,调用原解析器对应的设置项对象的
Documentation.populate()方法,将其解析器收集到的所有列合并成为Documentation对象的value。
此时,完整的表格内设置项的内容读取完成,其中的设置项类似。
二、组织结构
脚本文件会生成TestCaseFile对象,根据脚本中各区域形成四个表对象,顶级解析器是FromFilePopulator,包含了对应的四个解析器,见下表
| 区域块 | 表对象 | 解析器 |
|---|---|---|
| Setting | Settings | TestCaseFileSettingTable | SettingTablePopulator |
| Variable | Variables | VariableTable | VariableTablePopulator |
| Test Case | Test Cases | TestCaseTable | TestTablePopulator |
| Keyword | Keywords | KeywordTable | KeywordTablePopulator |
2.1、设置表
| 关键字 | 对象 | 解析器 |
|---|---|---|
| Documentation | Documentation | DocumentationPopulator |
| Library | Library | SettingPopulator |
| Resource | Resource | SettingPopulator |
| Variables | Variables | SettingPopulator |
| Metadata | MetadataList | MetadataPopulator |
| Suite Setup | Fixture | SettingPopulator |
| Suite Teardown | Fixture | SettingPopulator |
| Force Tags | Tags | SettingPopulator |
| Default Tags | Tags | SettingPopulator |
| Test Setup | Fixture | SettingPopulator |
| Test Teardown | Fixture | SettingPopulator |
| Test Template | Template | SettingPopulator |
| Test Timeout | Timeout | SettingPopulator |
2.2、变量表
表对象为VariableTable,解析器为VariableTablePopulator,表内的解析器VariablePopulator将脚本中的每个变量解析成Variable对象添加到VariableTable的variables列表。这里对$变量、@列表、&字典类型并无区别处理。
2.3、测试用例表
表对象为TestCaseTable,解析器为TestTablePopulator,表内的解析器TestCasePopulator将脚本中的每个测试用例解析成TestCase对象添加到TestCaseTable的tests列表。其中测试用例中的每个action会组合成数据一块放入同一个TestCase对象。表内解析器会调用TestCasePopulator
- 根据“[]”字符选择不同的关键字解析器,如下表,复用了设置表中的类
- 根据“:FOR”字符会选择
ForLoopPopulator解析器,解析循环语句,在TestCase对象的steps列表中添加ForLoop对象:拆分为变量、FOR和集合部分,FOR后续语句需要用”\“字符使DataRow对象解析成缩进 - 否则使用
StepPopulator解析器,解析后续语句为Step对象添加到steps列表:拆分为赋值变量列表、关键字和参数列表,解析过程:如果第一列是变量(除掉赋值符)则把该列添加到赋值变量列表里,并弹出该列后迭代判断,接下来的一列为关键字,后面的放入参数列表。
| 关键字 | 对象 | 解析器 |
|---|---|---|
| [Documentation] | Documentation | DocumentationPopulator |
| [Template] | Template | SettingPopulator |
| [Tags] | Tags | SettingPopulator |
| [Setup] | Fixture | SettingPopulator |
| [Teardown] | Fixture | SettingPopulator |
| [Timeout] | Timeout | SettingPopulator |
2.4、关键字表
表对象为KeywordTable,解析器为KeywordTablePopulator,表内的解析器UserKeywordPopulator将脚本中的每个测试用例解析成UserKeyword对象添加到KeywordTable的keywords列表。表内解析器调用UserKeywordPopulator,与测试用例逻辑一样,因为都继承于_TestCaseUserKeywordPopulator,支持“[]”、“:FOR”、普通语句,其中支持的关键字如下表
| 关键字 | 对象 | 解析器 |
|---|---|---|
| [Documentation] | Documentation | DocumentationPopulator |
| [Arguments] | Arguments | SettingPopulator |
| [Return] | Return | SettingPopulator |
| [Timeout] | Timeout | SettingPopulator |
| [Teardown] | Fixture | SettingPopulator |
| [Tags] | Tags | SettingPopulator |