源码位置
阅读源码的第一步是什么?首先需要知道源码在哪里。
一般来说,我们都是用pip
将robotframework库安装到Python库目录中。安装Robot Framework后,源码就已经在Python库目录中,我们要做的就是找到它。
不知道Python目录的可以用sys.path
辅助查看
import sys
print(sys.path)
在Python目录中,找到site-packages
文件夹,site-packages\robot
目录存放的就是Robot Framework的源码。
案例执行方式
源码已经找到里,那我们接下来回顾下我们的案例是怎么执行的。
External Tools
在Pycharm中执行RF案例为例,常用方式是在Preferences-Tools-External Tools里设置:
- robot by case name(名字随便取),根据选中的案例名称执行
- Program: /python
- Arguments: -m robot -L DEBUG -d output -t "" "/"
- Working directory:
设置好以后,这个robot by case name可在Pycharm里单击右键-External Tools中找到。
假设在rf-reader/01/01_beginning.robot
文件中有一条简单的案例:
*** Test Cases ***
计算一加一等于二
${和} evaluate ${1}+${1}
should be equal ${和} ${2}
我们就可以通过鼠标将案例名称“计算一加一等于二”选中,再单击右键,选择robot by case name,这样就执行成功里。
python -m
那这个是怎么生效的呢?其实就是通过命令行的方式执行。在上面的例子种,点击完robot by case name后可以在控制台里看到真正执行的命令是:
python -m robot -L DEBUG -d output -t 计算一加一等于二 /Users/Tester/rf-reader/01/01_beginning.robot
注意,Python2里的pybot,在Python3里已经没有了,之前在Python安装目录里的Scripts可以找到,现在只能找到robot.exe。不过二者差别不大,不影响我们分析RF是怎么执行案例的。
既然之前执行案例是用的pybot,那看下pybot.bat
文件的内容:
@echo off
python -m robot.run %*
这里有个知识点:
- python package2/run.py,是直接运行,是把py文件所在目录加入path。假如run.py中要import一个跟package2平行的package1下的模块module1,用这种方式会报错。
- python -m package2.run,是相当于导入了模块,用模块的方式来运行,而且会把输入执行命令的目录加入path中。假如run.py中也是要import一个跟package2平行的package1下的模块module1,用这种方式可以正常导入,因为我们输入执行命令的目录是package1和package2所在的那一层,被加入了path。
回到pybot.bat
文件的内容,其实就可以很容易的知道,执行案例的秘密就在robot.run
这个模块里。
入口程序
run_cli
刚才已经找到用命令行执行案例的入口就在robot.run
,看一下代码:
if __name__ == '__main__':
run_cli(sys.argv[1:])
调用的是run_cli
这个函数,并且把命令行中的参数都传进去。
而run_cli
函数的内容令人难以置信的简单,就是在函数中,把命令行里的参数列表传给RobotFramework().execute_cli
def run_cli(arguments, exit=True):
return RobotFramework().execute_cli(arguments, exit=exit)
所以RobotFramework类才是RF处理的灵魂所在,run_cli
函数只是提供命令行执行案例的入口。
sys.argv
再回过头来看看sys.argv[1:]具体是以什么形式传的参数,如果不熟悉sys.argv
用法的可以打印出来感受下,比如新建个rf-reader/01/sysargv.py
代码文件:
import sys
print(sys.argv)
在rf-reader
目录下执行
python -m 01.sysargv -L DEBUG -d output -t testcasename
可以看到结果是
['/Users/Tester/rf-reader/01/sysargv.py', '-L', 'DEBUG', '-d', 'output', '-t', 'testcasename']
sys.argv[0]是执行的程序名
sys.argv[1:]是跟在程序名后的所有用空格间隔开的参数,比如-L DEBUG
,在列表中就是['-L', 'DEBUG']
。