超时处理
关键字有可能会遇到执行时间超长或者执行被挂起的情况. Robot Framework允许为 测试用例 和 用户关键字 设置超时时长, 如果用例或者关键字没有在指定时长内结束, 则当前还在执行的关键字会被强行终止. 这种情况有可能会导致测试库或系统进入不稳定的状态, 因此, 超时设置只在没有其它更好更安全的办法下才推荐使用.
通常用户在设计和实现库时, 应该仔细设计以避免出现关键字挂起的情况, 或者实现自身的超时处理机制.
测试用例的超时
测试用例的超时设置可以通过设置表格中的 Test Timeout 设置项, 或者用例表格中的 [Timeout] 设置项. 前者是为当前用例集下的所有的测试用例设定一个默认的超时时长, 而后者则只应用当前单个用例, 并且会覆盖可能存在的默认值.
使用空白的 [Timeout] 设置意味着测试永不超时, 即使已经设置了 Test Timeout. 除了空白还可以使用 NONE, 结果一样.
不管在哪里定义超时, 跟在设置项名称后面的第一个格子中包含的就是超时的时长. 该时长必须使用Robot Framework中的 time format, 可以是直接的秒数, 也可以是诸如 1 minute 30 seconds
这种格式. 值得注意的是, 框架本身总是会有时间消耗的, 所以不建议将超时时长设置短于1秒.
当超时发生时, 默认的错误提示信息是 Test timeout <time> exceeded
. 用户可以自定义错误消息, 只需要将错误消息跟在超时时长的后面格子中. 这里的消息设置和文档类似, 可以跨多个单元格.
超时值和错误消息中都可以包含变量.
如果有超时, 运行中的关键字被终止, 当前用例执行失败. 不过, 作为 Setup和Teardown 运行的关键字不会被中断, 因为teardown操作一般都是重要的清理动作. 如果有必要的话, 可以通过设置 用户关键字的超时 来中断这些关键字.
- *** Settings ***
- Test Timeout 2 minutes
- *** Test Cases ***
- Default Timeout
- [Documentation] Timeout from the Setting table is used
- Some Keyword argument
- Override
- [Documentation] Override default, use 10 seconds timeout
- [Timeout] 10
- Some Keyword argument
- Custom Message
- [Documentation] Override default and use custom message
- [Timeout] 1min 10s This is my custom error
- Some Keyword argument
- Variables
- [Documentation] It is possible to use variables too
- [Timeout] ${TIMEOUT}
- Some Keyword argument
- No Timeout
- [Documentation] Empty timeout means no timeout even when Test Timeout has been used
- [Timeout]
- Some Keyword argument
- No Timeout 2
- [Documentation] Disabling timeout with NONE works too and is more explicit.
- [Timeout] NONE
- Some Keyword argument
用户关键字的超时
在关键字表格中通过设置项 [Timeout] 可以为用户关键字设定超时. 使用的语法格式, 包括时长的值的格式和自定义错误都和 test case timeouts 完全一样.
稍有不同的地方在于当超时发生且没有自定义错误提示信息时, 默认的错误提示信息是 Keyword timeout <time> exceeded
.
从Robot Framework3.0版本开始, 超时设置可以由一个变量来指定, 既而该变量可以是由参数来指定. 以前的版本中已经支持使用全局变量来指定超时时长.
- *** Keywords ***
- Timed Keyword
- [Documentation] Set only the timeout value and not the custom message.
- [Timeout] 1 minute 42 seconds
- Do Something
- Do Something Else
- Wrapper With Timeout
- [Arguments] @{args}
- [Documentation] This keyword is a wrapper that adds a timeout to another keyword.
- [Timeout] 2 minutes Original Keyword didn't finish in 2 minutes
- Original Keyword @{args}
- Wrapper With Customizable Timeout
- [Arguments] ${timeout} @{args}
- [Documentation] Same as the above but timeout given as an argument.
- [Timeout] ${timeout}
- Original Keyword @{args}
用户关键字的超时可以在其执行的过程中应用. 如果整个关键字的执行时长长于指定的超时时长, 则当前正在执行的关键字会被终止. 用户关键字的超时在测试用例的teardown中同样生效, 而测试用例中的超时则不会影响teardown.
如果用例和关键字(包括嵌套调用的关键字)都设置了超时, 则其中所余时间最短的将首先触发超时.