Robot Framework源碼閱讀01——從案例執(zhí)行說起

源碼位置

閱讀源碼的第一步是什么?首先需要知道源碼在哪里。

一般來說,我們都是用pip將robotframework庫安裝到Python庫目錄中。安裝Robot Framework后,源碼就已經(jīng)在Python庫目錄中,我們要做的就是找到它。

不知道Python目錄的可以用sys.path輔助查看

import sys
print(sys.path)

在Python目錄中,找到site-packages文件夾,site-packages\robot目錄存放的就是Robot Framework的源碼。

案例執(zhí)行方式

源碼已經(jīng)找到里,那我們接下來回顧下我們的案例是怎么執(zhí)行的。

External Tools

在Pycharm中執(zhí)行RF案例為例,常用方式是在Preferences-Tools-External Tools里設(shè)置:

  • robot by case name(名字隨便?。?,根據(jù)選中的案例名稱執(zhí)行
    • Program: PyInterpreterDirectory/python
    • Arguments: -m robot -L DEBUG -d output -t "SelectedText" "FileDir/FileName"
    • Working directory: ProjectFileDir

設(shè)置好以后,這個(gè)robot by case name可在Pycharm里單擊右鍵-External Tools中找到。

假設(shè)在rf-reader/01/01_beginning.robot文件中有一條簡(jiǎn)單的案例:

*** Test Cases ***
計(jì)算一加一等于二
    ${和}    evaluate    ${1}+${1}
    should be equal    ${和}    ${2}

我們就可以通過鼠標(biāo)將案例名稱“計(jì)算一加一等于二”選中,再單擊右鍵,選擇robot by case name,這樣就執(zhí)行成功里。

python -m

那這個(gè)是怎么生效的呢?其實(shí)就是通過命令行的方式執(zhí)行。在上面的例子種,點(diǎn)擊完robot by case name后可以在控制臺(tái)里看到真正執(zhí)行的命令是:

python -m robot -L DEBUG -d output -t 計(jì)算一加一等于二 /Users/Tester/rf-reader/01/01_beginning.robot

注意,Python2里的pybot,在Python3里已經(jīng)沒有了,之前在Python安裝目錄里的Scripts可以找到,現(xiàn)在只能找到robot.exe。不過二者差別不大,不影響我們分析RF是怎么執(zhí)行案例的。

既然之前執(zhí)行案例是用的pybot,那看下pybot.bat文件的內(nèi)容:

@echo off
python -m robot.run %*

這里有個(gè)知識(shí)點(diǎn):

  • python package2/run.py,是直接運(yùn)行,是把py文件所在目錄加入path。假如run.py中要import一個(gè)跟package2平行的package1下的模塊module1,用這種方式會(huì)報(bào)錯(cuò)。
  • python -m package2.run,是相當(dāng)于導(dǎo)入了模塊,用模塊的方式來運(yùn)行,而且會(huì)把輸入執(zhí)行命令的目錄加入path中。假如run.py中也是要import一個(gè)跟package2平行的package1下的模塊module1,用這種方式可以正常導(dǎo)入,因?yàn)槲覀冚斎雸?zhí)行命令的目錄是package1和package2所在的那一層,被加入了path。

回到pybot.bat文件的內(nèi)容,其實(shí)就可以很容易的知道,執(zhí)行案例的秘密就在robot.run這個(gè)模塊里。

入口程序

run_cli

剛才已經(jīng)找到用命令行執(zhí)行案例的入口就在robot.run,看一下代碼:

if __name__ == '__main__':
    run_cli(sys.argv[1:])

調(diào)用的是run_cli這個(gè)函數(shù),并且把命令行中的參數(shù)都傳進(jìn)去。

run_cli函數(shù)的內(nèi)容令人難以置信的簡(jiǎn)單,就是在函數(shù)中,把命令行里的參數(shù)列表傳給RobotFramework().execute_cli

def run_cli(arguments, exit=True):
    return RobotFramework().execute_cli(arguments, exit=exit)

所以RobotFramework類才是RF處理的靈魂所在,run_cli函數(shù)只是提供命令行執(zhí)行案例的入口。

sys.argv

再回過頭來看看sys.argv[1:]具體是以什么形式傳的參數(shù),如果不熟悉sys.argv用法的可以打印出來感受下,比如新建個(gè)rf-reader/01/sysargv.py代碼文件:

import sys
print(sys.argv)

rf-reader目錄下執(zhí)行

python -m 01.sysargv  -L DEBUG -d output -t testcasename

可以看到結(jié)果是

['/Users/Tester/rf-reader/01/sysargv.py', '-L', 'DEBUG', '-d', 'output', '-t', 'testcasename']

sys.argv[0]是執(zhí)行的程序名

sys.argv[1:]是跟在程序名后的所有用空格間隔開的參數(shù),比如-L DEBUG,在列表中就是['-L', 'DEBUG']。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容