robot-framework 源码阅读 之 suite name 搜索匹配

robot-framework 源码阅读 之 suite name 搜索匹配

引言

现有一个robot suite file: /xx/suite-dir/suite1.robot
下面有6句pybot命令,除了第一个能够运行,您是否了解其他5个也能正常运行

$ pybot --suite "suite1" /xx/suite-dir
$ pybot --suite "SUIte1" /xx/suite-dir
$ pybot --suite "sui te1" /xx/suite-dir
$ pybot --suite "sui_te1" /xx/suite-dir
$ pybot --suite "s u i t e 1" /xx/suite-dir
$ pybot --suite "s_u_i_t_e_1" /xx/suite-dir

如果您对此感到惊讶,那么请跟我一起来了解robot suite name搜索匹配的过程及原理吧!

前言

pybot命令,其中有一种用法是指定–suite,最后面的data sources参数为suite所在的目录
Sample:
第1句pybot命令,最后面的data sources参数是test suite file
第2, 3两句,最后的/xx/suite-dir为目录

$ pybot -t testcase1 /xx/suite-dir/testsuite.robot
$ pybot --suite suite1 /xx/suite-dir
$ pybot -A suite-args.txt /xx/suite-dir

现在需要根据suite-args.txt获取到所有的suite file
Sample

$ cat suite-args.txt
--suite Features.AP-802.11ACFeature.11ac_Function_80MHZ
--suite Features.AP-802.11ACFeature.11ac_Function_MCS
$
$ ls -1 Features/AP-802.11ACFeature/*.robot
Features/AP-802.11ACFeature/11ac_Function_80MHZ.robot
Features/AP-802.11ACFeature/11ac_Function_MCS.robot
$

惊奇于robot是如何正确解析Features.AP-802.11ACFeature到Features/AP-802.11ACFeature/,而不是Features/AP-802/11ACFeature/,遂对robot源码进行了阅读

阅读结果

关于suite name搜索原理

匹配要点:file name <= suite long name
robot递归遍历data source dir 下的所有子目录,并生成一串匹配成功的目录树(采用iterator结构保存)
注意:此处匹配,只要遍历到的文件,file name被suite long name(含有多个”.”号的一串字符) 包含,就算匹配成功。
Sample:

$ pybot --suite aa.bb.testsuite1 ./dir1

下面这4个suite文件,因为文件名都能匹配aa.bb.testsuite1,在这个阶段会都会被当作匹配成功

./dir1/dx/testsuite1.robot   # tessuite1 被 aa.bb.tessuite1 包含
./dir1/dx/bb.testsuite1.txt  # bb.tessuite1 被 aa.bb.tessuite1 包含
./dir1/aa/bb.testsuite1.txt  # bb.tessuite1 被 aa.bb.tessuite1 包含
./dir1/aa.bb.testsuite1.txt  # aa.bb.tessuite1 被 aa.bb.tessuite1 包含

注意:上述4个文件,只有最后2个文件是真匹配

问题:
当data source dir有很多很深的子目录层次(比如 “/”),robot递归遍历将耗时巨大

建议:
data sources dir应尽量接近目标suite,以提高搜索效率

关于suite name全匹配原理

匹配要点:suite long name <= file full path
在解析suite文件之前,需要遍历上述生成的目录树,并逐个与suite long name进行匹配,如果suite long name被目录树所包含,则匹配成功

判断suite long name 被文件及其所在的目录树所包含

robot将file path与suite long name(含有多个”.”号的一串字符),两者都进行了以下4个操作:
转换为小写,去掉空格,去掉下划线,去掉指定的扩展名(.txt, .robot, ..)
对于file path,
将所有的”/”替换为”.”
上述操作完成后,如果suite long name被file path包含,则匹配成功,相应的file path被记下作为suite name对应的实体suite file

Sample:
以下几个suite name,本质的suite name都是testsuite1

testsuite1    # suite name
test suite1   # 含一个空格
test_suite1   # 含一个下划线
TestSuite1    # 含两个大写字母
te sts uit e1 # 中间有任意空格
te_sts_uit_e1 # 中间有任意下划线

你可能感兴趣的:(Robot-framework,Automation,robot,framework,automation,test,suite-name)