[Robot Framework] Get Context Information 取得執行環境相關的資訊

在 keyword 裡,如果想要根據目前正在執行的 suite/case,或是某個變數的值,以做出不同的反應,可以透過 robot.libraries.BuiltIn.BuiltIn 來取得大部份的資訊。

  • get_variable_value(name, default=None)

  • get_variables()

除了使用者自訂的變數之外,執行期也有幾個 built-in variables 可以取用:

  • ${SUITE_NAME} – 目前 test case 所屬的 test suite 名稱。

  • ${SUITE_SOURCE} – 目前 test suite 檔案的絕對路徑。

  • ${TEST_NAME} – 目前正在執行的 test case 名稱。

    Tip ${SUITE_SOURCE}${TEST_NAME} 的 “組合" 可以用來識別不同的 test case。
  • ${TEST_STATUS} – 目前 test case 的狀態 – PASSFAIL

  • ${EXECDIR} – runner script 一開始執行的位置(絕對路徑)。

  • ${OUTPUT_DIR} – output directory 的絕對路徑;可以從命令列 –outputdir 自訂檔名(絕對路徑,或相對於 ${EXECDIR} 的路徑)。

  • ${OUTPUT_FILE} – output file (output.xml) 的絕對路徑或 NONE

    可以從命令列 –output 自訂檔名(絕對路徑,或相對於 output directory 的路徑)

  • ${LOG_FILE} – log file (log.html) 的絕對路徑或 NONE

    可以從命令列 –log 自訂檔名(絕對路徑,或相對於 output directory 的路徑)

  • ${REPORT_FILE} – report file (report.html) 的絕對路徑或 NONE

    可以從命令列 –report 自訂檔名(絕對路徑,或相對於 output directory 的路徑)

例如要取得 log file 所在的 directory 可以這麼做:

mylib.py
import logging, os.path as path
from robot.libraries.BuiltIn import BuiltIn

_log = logging.getLogger(__name__)
_builtin = BuiltIn()

def do_something():
    _log.warning('I have done something, log dir = [%s]', _get_log_dir())

def _get_log_dir():
    logfile = _builtin.get_variable_value('${LOGFILE}') # 1
    assert logfile is not None

    if logfile == 'NONE': # 2
        logdir = _builtin.get_variable_value('${OUTPUT_DIR}')
    else:
        logdir = path.dirname(logfile)
    return logdir
1 優先取用 ${LOGFILE} 的值。
2 但如果使用者用 –log NONE 來取消 log file 的輸出,改採 ${OUTPUT_DIR} 的值。

用一個簡單的 test case 來做測試:

$ ls -1 /tmp/test
mylib.py
test.txt

$ cat /tmp/test/test.txt
| *Setting* | *Value* |
| Library | mylib.py

| *Test Case* | *Action* | *Argument*
| Test | Do Something | # 1

$ pwd
/tmp/runtime

$ pybot --outputdir output --log /tmp/logs /tmp/test/test.txt | grep -E 'something|Output:|Log:'
[ WARN ] I have done something, log dir = [/tmp] 2
Output:  /private/tmp/runtime/output/output.xml
Log:     /tmp/logs.html

$ pybot --outputdir output --log none /tmp/test/test.txt | grep -E 'something|Output:|Log:'
[ WARN ] I have done something, log dir = [/private/tmp/runtime/output] 3
Output:  /private/tmp/runtime/output/output.xml
1 Do Something 會執行 mylib.py 裡的 do_something(),間接印出 log directory。
2 有自訂 log file 的位置時,取得 log file 所在的位置。
3 使用者取消 log file 的輸出時,取得 output directory。
廣告

發表迴響

Please log in using one of these methods to post your comment:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s