超时处理

关键字有可能会遇到执行时间超长或者执行被挂起的情况. 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操作一般都是重要的清理动作. 如果有必要的话, 可以通过设置 用户关键字的超时 来中断这些关键字.

  1. *** Settings ***
  2. Test Timeout 2 minutes
  3.  
  4. *** Test Cases ***
  5. Default Timeout
  6. [Documentation] Timeout from the Setting table is used
  7. Some Keyword argument
  8.  
  9. Override
  10. [Documentation] Override default, use 10 seconds timeout
  11. [Timeout] 10
  12. Some Keyword argument
  13.  
  14. Custom Message
  15. [Documentation] Override default and use custom message
  16. [Timeout] 1min 10s This is my custom error
  17. Some Keyword argument
  18.  
  19. Variables
  20. [Documentation] It is possible to use variables too
  21. [Timeout] ${TIMEOUT}
  22. Some Keyword argument
  23.  
  24. No Timeout
  25. [Documentation] Empty timeout means no timeout even when Test Timeout has been used
  26. [Timeout]
  27. Some Keyword argument
  28.  
  29. No Timeout 2
  30. [Documentation] Disabling timeout with NONE works too and is more explicit.
  31. [Timeout] NONE
  32. Some Keyword argument

用户关键字的超时

在关键字表格中通过设置项 [Timeout] 可以为用户关键字设定超时. 使用的语法格式, 包括时长的值的格式和自定义错误都和 test case timeouts 完全一样.

稍有不同的地方在于当超时发生且没有自定义错误提示信息时, 默认的错误提示信息是 Keyword timeout <time> exceeded.

从Robot Framework3.0版本开始, 超时设置可以由一个变量来指定, 既而该变量可以是由参数来指定. 以前的版本中已经支持使用全局变量来指定超时时长.

  1. *** Keywords ***
  2. Timed Keyword
  3. [Documentation] Set only the timeout value and not the custom message.
  4. [Timeout] 1 minute 42 seconds
  5. Do Something
  6. Do Something Else
  7.  
  8. Wrapper With Timeout
  9. [Arguments] @{args}
  10. [Documentation] This keyword is a wrapper that adds a timeout to another keyword.
  11. [Timeout] 2 minutes Original Keyword didn't finish in 2 minutes
  12. Original Keyword @{args}
  13.  
  14. Wrapper With Customizable Timeout
  15. [Arguments] ${timeout} @{args}
  16. [Documentation] Same as the above but timeout given as an argument.
  17. [Timeout] ${timeout}
  18. Original Keyword @{args}

用户关键字的超时可以在其执行的过程中应用. 如果整个关键字的执行时长长于指定的超时时长, 则当前正在执行的关键字会被终止. 用户关键字的超时在测试用例的teardown中同样生效, 而测试用例中的超时则不会影响teardown.

如果用例和关键字(包括嵌套调用的关键字)都设置了超时, 则其中所余时间最短的将首先触发超时.