源碼位置
閱讀源碼的第一步是什么?首先需要知道源碼在哪里。
一般來說,我們都是用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:
/python
- Arguments: -m robot -L DEBUG -d output -t "
" "
/
"
- Working directory:
- Program:
設(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']。