.. role:: name(emphasis) .. role:: setting(emphasis) .. Advanced features 高级特性 ======== .. contents:: :depth: 2 :local: .. _handling keywords with same names: 处理同名关键字 -------------- Robot Framework中的关键字分为 :ref:`库关键字 ` 和 :ref:`用户关键字 `. 前者来自 :ref:`standard libraries` 或 :ref:`external libraries`, 后者则要么在当前调用的文件中创建, 要么从 :ref:`resource files` 中导入. 当用到的关键字变得很多时, 难免会遇到重名的情况, 本节将说明如何处理这种冲突状况. .. Keyword scopes 关键字的范围 ~~~~~~~~~~~~ 当仅使用关键字名称时, 如果存在若干同名的关键字, Robot Framework将试图决定哪个关键字的优先级最高. 关键字的优先级将由关键字的创建方式决定: 1. 在调用关键字的相同文件中创建. 此关键字拥有最高的优先级. 2. 在资源文件中创建并引入(可以是直接引入,也可以是导入的别的资源文件). 此是第二高优先级. 3. 在外部库中创建. 只有在没有其它同名的用户关键字存在的情况下才会用到. 而且, 如果标准库中存在了同名的关键字, 将显示警告. 4. 标准库中创建关键字. 这些关键字的优先级最低. .. Specifying a keyword explicitly 显式指定关键字 ~~~~~~~~~~~~~~ 光靠作用域不能完美的解决重名问题, 因为相同作用域的若干库或者资源中也会有同名的关键字. 此时只能使用 *关键字全名*, 所谓全名就是在关键字名称的前面加上其所在的资源或库的名称作为前缀, 中间使用点(``.``)作为分隔. 对于库中的关键字, 长名称的格式是 :name:`LibraryName.Keyword Name`. 例如, 标准库 OperatingSystem_ 中的关键字 :name:`Run` 可以写作 :name:`OperatingSystem.Run`. 如果库是一个模块或者包, 则必须使用模块或包的全名(例如: :name:`com.company.Library.Some Keyword`). 如果在引用库的时候使用了 :ref:`WITH NAME syntax`, 则前缀名称必须是该自定义的名称. 资源文件中的关键字全名指定格式也是类似. 资源的名称取自资源文件的基础名称(basename)并去掉文件扩展名. 例如, 资源文件 :file:`myresources.html` 中的关键字 :name:`Example` 可以写作 :name:`myresources.Example`. 注意, 这种语法如果遇到多个资源文件的基础名称相同, 则必须修改文件名或者关键字名. 关键字的全名和关键字的普通名称一样, 同时忽略大小写, 空格和下划线. .. Specifying explicit priority between libraries and resources 为库和资源显式指定优先级 ~~~~~~~~~~~~~~~~~~~~~~~~ 如果重名冲突的情况比较多, 全部使用全名称格式可能需要不少的工作量. 同时, 全名称格式将难以创建动态的(依赖可用库或资源的)测试用例和用户关键字. 一个针对这两个问题的解决方案是通过一个内置的关键字 :name:`Set Library Search Order` 显式地指定关键字的优先级. .. note:: 虽然该关键字的名字中包含了 *library*, 但是它不仅作用于库, 还对资源文件有效. :name:`Set Library Search Order` 接受一个有序列表作为参数, 列表中是库和资源的名称. 当关键字名称遭遇到重名的情况, 将依次在这个列表中的库或资源中查找, 一旦找到即被采用. 如果列表内指定的库和资源没有找到关键字, 则重名冲突造成的执行失败和正常情况一样. 更多的信息和示例请参阅该关键字的文档. .. Timeouts 超时处理 -------- 关键字有可能会遇到执行时间超长或者执行被挂起的情况. Robot Framework允许为 :ref:`测试用例 ` 和 :ref:`用户关键字 ` 设置超时时长, 如果用例或者关键字没有在指定时长内结束, 则当前还在执行的关键字会被强行终止. 这种情况有可能会导致测试库或系统进入不稳定的状态, 因此, 超时设置只在没有其它更好更安全的办法下才推荐使用. 通常用户在设计和实现库时, 应该仔细设计以避免出现关键字挂起的情况, 或者实现自身的超时处理机制. .. Test case timeout 测试用例的超时 ~~~~~~~~~~~~~~ 测试用例的超时设置可以通过设置表格中的 :setting:`Test Timeout` 设置项, 或者用例表格中的 :setting:`[Timeout]` 设置项. 前者是为当前用例集下的所有的测试用例设定一个默认的超时时长, 而后者则只应用当前单个用例, 并且会覆盖可能存在的默认值. 使用空白的 :setting:`[Timeout]` 设置意味着测试永不超时, 即使已经设置了 :setting:`Test Timeout`. 除了空白还可以使用 `NONE`, 结果一样. 不管在哪里定义超时, 跟在设置项名称后面的第一个格子中包含的就是超时的时长. 该时长必须使用Robot Framework中的 :ref:`time format`, 可以是直接的秒数, 也可以是诸如 ``1 minute 30 seconds`` 这种格式. 值得注意的是, 框架本身总是会有时间消耗的, 所以不建议将超时时长设置短于1秒. 当超时发生时, 默认的错误提示信息是 ``Test timeout