robot java_Robot Framework 源码解析(1) - java入口点

一直很好奇Robot Framework 是如何通过关键字驱动进行测试的,好奇它是如何支持那么多库的,好奇它是如何完成截图的。所以就打算研究一下它的源码。

这是官方给出的Robot framework模块化结构:

d8f2b1e61bfc17f8e08651fb9864f152.png

它的用法暂且不说,网上有很多. 这是我的一个实例。“打开浏览器,baidu搜索一个字符串。”

Robot Framework有很多入口点,比如

1. java -jar robotframework.jar test.robot

2. robot path/to/tests.robot

3. robot --include tag1 --include tag2 --splitlog tests.robot

4. robot --name Example --log NONE t1.robot t2.robot > stdout.txt

因为对java相对比较熟悉一些,所以就从java的入口的点org.robotframework.RobotFramework开始看起。

java -jar robotframework.jar mytests.robot

java -jar robotframework.jar run mytests.robot

java -jar robotframework.jar rebot --log mylog.html out.xml

java -jar robotframework.jar tidy --format robot mytests.html

1 packageorg.robotframework;2

3 /**

4 *5 * Entry point for using Robot Framework from Java programs.6 *7 */

8 public classRobotFramework {9

10 public static voidmain(String[] args) {11 int rc =run(args);12 System.exit(rc);13 }14

15 public static intrun(String[] args) {16 try (RobotRunner runner = newRobotRunner()) {17 returnrunner.run(args);18 }19 }20 }

main方法,是程序的入口,命令行传入的参数传递给main方法。通过  int rc = run(args); 将命令后参数传递给run方法。

接下来看run方法是做什么的。

在这里创建了一个RobotRunner的实例,调用该实例的run方法,并且将命令行参数传递给了RobotRunner的run方法。

构造函数

1 publicRobotRunner() {2 interpreter = newPythonInterpreter();3 runner =createRunner();4 }

run方法:

1 public intrun(String[] args) {2 returnrunner.run(args);3 }

RobotRunner 内部创建一个Jython解释器PythonInterpreter对象和 robot.JarRunner 来运行Robot测试。另外RobotRunner 是一个AutoCloseable接口的实现类,可以在try-cache块中自动的关闭资源,以清理解释器。

在RobotRunner 的run方法中可以看到,它是通过RobotPythonRunner的run方法来执行Robot测试的

接下来看 RobotPythonRunner是如何执行Robot测试的:

可是RobotPythonRunner是一个接口!只能去找它的实现类了。src/robot/jarrunner.py 是RobotPythonRunner的实现类。

1 classJarRunner(RobotPythonRunner):2 """Used for Java-Jython interop when RF is executed from .jar file."""

3 _commands = {'run': run_cli, 'rebot': rebot_cli, 'tidy': tidy_cli,4 'libdoc': libdoc_cli, 'testdoc': testdoc_cli}5

6 def run(self, args):7 try:8 self._run(args)9 except SystemExit as err:10 returnerr.code11

12 def _run(self, args):13 if not args or args[0] in ('-h', '--help'):14 print(USAGE)15 raise SystemExit(INFO_PRINTED)16 command, args =self._parse_command_line(args)17 command(args) # Always calls sys.exit()18

19 def _parse_command_line(self, args):20 if args[0] in self._commands:21 return self._commands[args[0]], args[1:]22 return run_cli, args

这个JarRunner其实也没有做什么, 除了解析main(String[] args)方法的参数(第16行),也就是命令行的参数,并且根据参数判断调用哪个方法(第17行)。

例如:java -jar robotframework.jar run mytests.robot这个命令,经过JarRunner解析会最终调用run_cli(mytests.robot)这个方法。

java -jar robotframework.jar rebot --log mylog.html out.xml这个命令,经过JarRunner解析会最终调用rebot_cli(--log,mylog.html,out.xml)这个方法。

java的命令行入口其实最终还是转到了其它入口点:

robot.run entry point for executing tests.

robot.rebot entry point for post-processing outputs (Rebot).

robot.libdoc entry point for Libdoc tool.

robot.testdoc entry point for Testdoc tool.

robot.tidy entry point for Tidy tool

下一章,我接着来分析执行测试的入口点

如果喜欢作者的文章,请关注"写代码的猿"订阅号以便第一时间获得最新内容。本文版权归作者所有,欢迎转载.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值