RobertFramework源码解析(一)-- 如何读取robot文件
导读
对的,我又开了个系列。实在惭愧,写着写着就感觉想写的很多,但是又不能兼顾,像前面写的PMP系列还没有正式上菜呢。。。
言归正传,RoboertFramework是自动化测试领域一个应用广泛的框架,它以关键字驱动的模式帮助大家更简单的开发自动化测试用例。它提供了非常多的Library,可以用它完成接口自动化测试、UI自动化测试、App自动化测试等。最为重要的是,RF的二次开发门槛也不高,适合各位测试开发以此为基础框架,创建适合自己公司的自动化测试工具。为了能更好的理解RF,本系列从不同层面帮助使用者了解RF原理。
当然本人水平有限,有些代码可能也不是理得很清楚,只介绍大概的代码执行流程。
本篇主要介绍RF如何读取Robot用例文件。
获取RF执行命令行
平时用RF的时候都是通过ride 这个IDE完成自动化用例的设计及执行,因此,可以通过执行ride获取RF的执行命令行:
pybot.bat --loglevel DEBUG:INFO --argumentfile c:\users…appdata\local\temp\RIDEhvqq0l.d\argfile.txt --listener D:\Setup\Python27\lib\site-packages\robotide\contrib\testrunner\TestRunnerAgent.py:27239:False D:\Setup\Python27\Scripts\LearnRF.robot
如上所述,loglevel主要是打印RF的日志,默认是INFO级别。argumentfile主要存取执行参数,如下所示:
--outputdir
c:\users\....\appdata\local\temp\RIDEhvqq0l.d
-C
off
-W
126
--suite
LearnRF
--test
LearnRF.Demo
--suite
LearnRF
--test
LearnRF.Demo1
listener 是一个监听器,主要是获取脚本的运行信息以完成console日志的输出,这个到时候可以再拿出一篇来详细讲解。最后一个参数就是我们今天要研究的对象,即这个测试用例的文件是如何被读取并应用的。
执行入口
首先我们找到pybot.bat, 这个文件在python的安装路径scripts文件夹下,
在脚本里面直接执行了robot下面的run.py, 从python下Lib/site-packages下面找到run.py。
从run方法中调用RobotFramework类的execute方法。从RobotFramework中初始化Application,跳转到application.py。
在application.py中最终调用了main方法。注意:此处的main方法是子类中的main,因为子类中的main覆盖了Application中的main。
这样又回到了run.py中的main。
RF读取robot文件
从main函数中可以看到,先定义了settings,又定义suite,再访问suite,最终执行suite。在这里我们先不管后续的功能,先看TestSuiteBuilder中的build(*datasources),因为在这里处理了我们传进去的robot文件。
紧接着进入build.py,
根据代码逻辑,由_parse_and_build->parse->TestData。进入parsing/model.py, 初始化TestCaseFile并执行populate函数。
在TestCaseFile类中就是去实现读取robot文件并将robot文件中的setting、varaible、testcase、keyword存入相应的table对象。
在table实例中,主要存取当前对象的parent对象,table的header以及table中包含的robot文件内容,比如testcase_table中,parent就是testcasefile,header就是Test Cases,tests就是Demo和Demo1,其中tests中的每个test还包含其步骤。
test对象示例:
{'comment': <robot.parsing.comments.Comment object at 0x000000000454C8D0>, 'args': [u'Test The RF Principle'], 'assign': [], 'name': u'Log'}
再上溯到model.py中执行的populate方法,这个地方主要是在populator.py中。大家是不是从这个文件似乎嗅到了一股香的问道。不错,其中的open函数就是读取robot文件的开门钥匙。读取文件内容的实现是在tsvread.py中。
在这个文件中,我们看到对应的populator将每一行的内容添加到table,从而将robot文件的内容分别读取到各自所述的table对象。
总结
好了,上面就是对robot文件读取的这个流程,由于个人能力有限,讲得比较粗,没有面面俱到,需要大家去打开代码对照着看,有什么不明白的共同讨论,下一篇继续往下走。(对了,代码里面有些print是梳理代码用的,请原谅我用的这个笨办法 ???? )
上一篇: Ajax+PHP 边学边练之四 表单