Robot Framework 源码解析(1) - java入口点
一直很好奇Robot Framework 是如何通过关键字驱动进行测试的,好奇它是如何支持那么多库的,好奇它是如何完成截图的。所以就打算研究一下它的源码。
这是官方给出的Robot framework模块化结构:
它的用法暂且不说,网上有很多. 这是我的一个实例。“打开浏览器,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
package org.robotframework; /**
*
* Entry point for using Robot Framework from Java programs.
*
*/
public class RobotFramework { public static void main(String[] args) {
int rc = run(args);
System.exit(rc);
} public static int run(String[] args) {
try (RobotRunner runner = new RobotRunner()) {
return runner.run(args);
}
}
}
main方法,是程序的入口,命令行传入的参数传递给main方法。通过 int rc = run(args); 将命令后参数传递给run方法。
接下来看run方法是做什么的。
在这里创建了一个RobotRunner的实例,调用该实例的run方法,并且将命令行参数传递给了RobotRunner的run方法。
继续看RobotRunner都做了些什么。
构造函数
public RobotRunner() {
interpreter = new PythonInterpreter();
runner = createRunner();
}
run方法:
public int run(String[] args) {
return runner.run(args);
}
RobotRunner 内部创建一个Jython解释器PythonInterpreter对象和 robot.JarRunner 来运行Robot测试。另外RobotRunner 是一个AutoCloseable接口的实现类,可以在try-cache块中自动的关闭资源,以清理解释器。
在RobotRunner 的run方法中可以看到,它是通过RobotPythonRunner的run方法来执行Robot测试的
接下来看 RobotPythonRunner是如何执行Robot测试的:
可是RobotPythonRunner是一个接口!只能去找它的实现类了。src/robot/jarrunner.py 是RobotPythonRunner的实现类。
class JarRunner(RobotPythonRunner):
"""Used for Java-Jython interop when RF is executed from .jar file."""
_commands = {'run': run_cli, 'rebot': rebot_cli, 'tidy': tidy_cli,
'libdoc': libdoc_cli, 'testdoc': testdoc_cli} def run(self, args):
try:
self._run(args)
except SystemExit as err:
return err.code def _run(self, args):
if not args or args[0] in ('-h', '--help'):
print(USAGE)
raise SystemExit(INFO_PRINTED)
command, args = self._parse_command_line(args)
command(args) # Always calls sys.exit() def _parse_command_line(self, args):
if args[0] in self._commands:
return self._commands[args[0]], args[1:]
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
下一章,我接着来分析执行测试的入口点robot.run.
如果喜欢作者的文章,请关注"写代码的猿"订阅号以便第一时间获得最新内容。本文版权归作者所有,欢迎转载.
Robot Framework 源码解析(1) - java入口点的更多相关文章
- Robot Framework源码解析(2) - 执行测试的入口点
我们再来看 src/robot/run.py 的工作原理.摘录部分代码: from robot.conf import RobotSettings from robot.model import Mo ...
- [源码解析] 当 Java Stream 遇见 Flink
[源码解析] 当 Java Stream 遇见 Flink 目录 [源码解析] 当 Java Stream 遇见 Flink 0x00 摘要 0x01 领域 1.1 Flink 1.2 Java St ...
- java.lang.Void类源码解析_java - JAVA
文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 在一次源码查看ThreadGroup的时候,看到一段代码,为以下: /* * @throws NullPointerEx ...
- JDK源码解析之Java SPI机制
1. spi 是什么 SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的API,它可以用来启用框架扩展和替换组件. 系统设计的各个抽象,往往 ...
- Robot Framework 源码阅读 day1 run.py
robot里面run起来的接口主要有两类 run_cli def run_cli(arguments): """Command line execution entry ...
- Robot Framework 源码阅读 day1 __main__.py
robot文件夹下的__main__.py函数 是使用module运行时的入口函数: import sys # Allows running as a script. __name__ check n ...
- Robot Framework 源码阅读 day2 TestSuitBuilder
接上一篇 day1 run.py 发现build test suit还挺复杂的, 先从官网API找到了一些资料,可以看出这是robotframework进行组织 测试案例实现的重要步骤, 将传入的te ...
- (二)一起学 Java Collections Framework 源码之 AbstractCollection
. . . . . 目录 (一)一起学 Java Collections Framework 源码之 概述(未完成) (二)一起学 Java Collections Framework 源码之 Abs ...
- Java生鲜电商平台-秒杀系统微服务架构设计与源码解析实战
Java生鲜电商平台-秒杀系统微服务架构设计与源码解析实战 Java生鲜电商平台- 什么是秒杀 通俗一点讲就是网络商家为促销等目的组织的网上限时抢购活动 比如说京东秒杀,就是一种定时定量秒杀,在规定 ...
随机推荐
- 体育Bank2016会议笔记
补注:会议全称应该是体育Bank2016体育投融资总裁年会 新华社体育部徐仁基 演讲主题:帮郭川找到大海-->帮民众找到自己真正的体育爱好 激发和培养体育市场是重中之重 将体育培养成生活习惯.生 ...
- Go语言开发区块链只需180行代码
区块链开发用什么语言?通过本文你将使用Go语言开发自己的区块链(或者说用go语言搭建区块链).理解哈希函数是如何保持区块链的完整性.掌握如何用Go语言编程创造并添加新的块.实现多个节点通过竞争生成块. ...
- 类的父类object的一些属性、方法
# class Test: # """文档字符串""" # name = 'scolia' # # print(Test.__doc__) ...
- UML语言中五大视图和九种图形纵览
UML语言纵览 视图 UML语言中的视图大致分为如下5种: 1.用例视图.用例视图强调从系统的外部参与者(主要是用户)的角度看到的或需要的系统功能. 2.逻辑视图.逻辑视图从系统的静态结构和动态行为角 ...
- Java结合SpringBoot拦截器实现简单的登录认证模块
Java结合SpringBoot拦截器实现简单的登录认证模块 之前在做项目时需要实现一个简单的登录认证的功能,就寻思着使用Spring Boot的拦截器来实现,在此记录一下我的整个实现过程,源码见文章 ...
- Python_检查程序规范
''' 检查Python程序的一些基本规范,例如,运算符两测是否有空格,是否每次只导入一个模块,在不同的功能模块之间是否有空行,注释是否够多,等等 ''' import sys import re d ...
- spring boot之从零开始开发自己的网站
概述 首先要感谢两位大神,该项目的想法来源自tale和MyBlog,本项目的想法. 做了一些改造,增加了一些功能和一些代码的重构,并且更换了博客主题. 关于项目,对于开发的练手项目,能够工程化,严谨一 ...
- Mysql服务启动与关闭
启动: 在cmd中输入 net start mysql 关闭: 在cmd中输入 net stop mysql
- MonolithFirst
As I hear stories about teams using a microservices architecture, I've noticed a common pattern. Alm ...
- 在Python中用Request库模拟登录(三):Discuz论坛(未加密,有验证码,有隐藏验证)
以Discuz的官方站为例.直接点击网页右上角的登录按钮,会弹出一个带验证码的登录窗口.输入验证码之后,会检查验证码是否正确.然后登录.首先,通过抓包分析,这些过程浏览器和服务器交换了哪些数据. 抓包 ...