Robot Framework自动化测试框架焦点指南-若何使用Java编写自定义的RobotFramework Lib,RobotFramework自动化测试框架-Selenium Web自动化(二)关于在RobotFramework中若何使用Selenium很全的总结(上)
GO语言slice详解(结合源码)
怎样运用Java编写自定义的RobotFramework Lib
本文包含2个章节
1、 Robot Frdamwork中怎样挪用java Lib库
2、运用 java编写自定义的Lib
本文作者为:张永清,转载请申明出处,版权归作者一切。
1、 Robot Frdamwork中怎样挪用java Lib库
我们在前面引见了,Robot Framework能够支撑跨言语,那末对java一定也是能够支撑的。
而且Robot Framework中,RIDE中自身也供应了对测试案例的两种实行体式格局,支撑pybot和jybot两种实行体式格局,以下图所示。
个中jybot 就是以java虚拟机的情势来实行测试案例,此种体式格局实行,实行的环境中,须要装置java jdk运转环境以及jython 装置包,jython是一个python言语在java中完整完成,也就是说用java来完成了python言语的功用,jython中不仅供应了python库,也支撑java要领的实行。所以jython实在就是处理了Robot Framework中python 不支撑直接挪用java言语的问题。Jython 能够从 链接中举行下载,然后装置完成后,就能够在Robot Framework中举行运用,以下图所示。
我们来看一个jython 言语来实行测试案例的例子。
示例:这是一个将字符串悉数转换成大写情势的例子,这个例子我们用jython言语来实行。
${str} Set Variable aaBBccDDeeFF
${result} Convert To Uppercase ${str}
log ${result}
运转效果以下:
以下图 所示,这里我们挑选了jybot 来举行实行,实行时,同pybot一样得到了我们想要的运转效果。
实在在Robot Framework的官方网站中许多Library库都供应了java言语版本的完成,以下图所示。
这里我们以我们在第二章节中讲到的Database Library python库来作为示例,来看下这个库对应的java言语的完成以及怎样来经由历程java言语的情势来举行挪用。
我们运用时,能够经由历程Robot Framework供应的maven插件robotframework-maven-plugin来直接引入
<dependency> <groupId>com.github.hi-fi</groupId> <artifactId>robotframework-dblibrary</artifactId> <version>3.1.1</version> </dependency>
或许我们将源码下载下来后,本身经由历程实行编译打包的体式格局来生成都能够。这里我们挑选直接用源码的情势举行编译,源码能够从上直接获取到。下载完成解压到本身须要的目次后,能够经由历程cmd命令行切入到对应的目次下,运用maven命令行举行编译,条件是须要在本身的环境中事前装置好maven的编译环境,编译打包时实行mvn clean install -Dmaven.test.skip=true 即能够生成我们想要的java言语完成的Library库,以下图所示。
打包完成后,再生成的target目次中,就能够获取到编译好的java言语完成的Library,以下图所示。
将编译生成好的robotframework-dblibrary-3.2-SNAPSHOT.jar包和mysql的Driver驱动包一同到场到运转环境的CLASSPATH下面,然后在测试案例集合引入DatabaseLibrary库,以下图所示。
引入后,我们就能够平常运用jython的体式格局来挪用java言语版本的DatabaseLibrary库了,以下图所示。
运用java言语版本的DatabaseLibrary库中的关键字时,和运用python言语版本的DatabaseLibrary库中的部份关键字的传参有些不一样。Java言语版本的DatabaseLibrary衔接数据库时,是经由历程jdbc的体式格局来举行链接,这里我们列举了java言语版本的DatabaseLibrary库链接一些经常使用数据库的示例,以下表所示。Java言语版本的Connect To Database关键字吸收 [数据库driver类|jdbc链接地点|数据库用户名|数据库暗码| alias=default ]五个参数,alias假如不传入的话,默以为取名为default。
Connect To Database | com.mysql.jdbc.Driver | jdbc:mysql://localhost:3306/world | root | root | 衔接mysql数据库 |
Connect To Database | oracle.jdbc.driver.OracleDriver | jdbc:oracle:thin:@servername:port:dbname | system | 12345678 | 衔接oracle数据库 |
Connect To Database | org.h2.Driver | jdbc:h2:mem:robotframeworkt;DB_CLOSE_DELAY=-1 | sa | sa | 衔接h2数据库库 |
这里我们看一个java言语完成的DatabaseLibrary库的源码的片断,让人人能够了解下,java言语版本中是怎样完成和封装关键字的,这是Connect To Database关键字的完成要领,
我们能够看到是经由历程在要领上加java注解的体式格局来完成的,@RobotKeyword和@ArgumentNames注解均来自javalib-core库,我们本身在开发时,能够经由历程maven依靠的体式格局引入。
<dependency> <groupId>org.robotframework</groupId> <artifactId>javalib-core</artifactId> <version>1.2.1</version> </dependency>
DatabaseLibrary库的源码片断:
@RobotKeyword("Establish the connection to the database. This is mandatory before any of" + "the other keywords can be used and should be ideally done during the " + "suite setup phase. To avoid problems ensure to close the connection again " + "using the disconnect-keyword.nn" + "It must be ensured that the JAR-file containing the given driver can be " + "found from the CLASSPATH when starting robot. Furthermore it must be " + "noted that the connection string is database-specific and must be valid of course.nn" + "If alias is given, connection can be later referred with that. If alias was in use, existing connection " + "is replaced with new onenn" + "" + "Example: n" + "| Connect To Database | com.mysql.jdbc.Driver | jdbc:mysql://my.host.name/myinstance | UserName | ThePassword | default |") @ArgumentNames({ "Driver class name", "Connection string", "Database username", "Database password","Database alias=default" }) public void connectToDatabase(String driverClassName, String connectString, String dbUser, String dbPassword, String... aliasParam) throws SQLException, InstantiationException, IllegalAccessException, ClassNotFoundException { String alias = aliasParam.length > 0 ? aliasParam[0] : defaultAlias; Class.forName(driverClassName).newInstance(); setConnection(DriverManager.getConnection(connectString, dbUser, dbPassword), alias); }
除了经由历程jython言语来挪用java的Library外,我们还能够经由历程Remote的体式格局来完成挪用Java言语完成的Library库。从 链接中,能够获取到用java言语来完成的长途接口效劳,以下图所示。
我们不发起在现实工作中,过量的运用的jython的体式格局来挪用java言语完成的Library,由于每一个测试案例在实行时,都须要一个启动jvm虚拟机的历程,实行会比运用python言语的体式格局实行耗时更长,而且兼容性并非十分好,引荐运用Remote的体式格局来挪用Java言语完成的Library库。
2、运用 java编写自定义的Lib
本文作者为:张永清,转载请申明出处,版权归作者一切。
前面我们已讲了怎样挪用java言语编写的Lib库,这一节中,我们来引见下怎样运用java言语编写自定义的Lib库。
要运用java编写自定义Lib库,我们起首须要构建一个java的开发工程,这里我们以构建一个java的maven项目为例。在构建的maven工程的的pom.xml文件中,我们须要引入以下必要依靠。
<dependency> <groupId>org.robotframework</groupId> <artifactId>javalib-core</artifactId> <version>0.9.1</version> </dependency>
这个是必需引入的依靠包,作用是供应了建立RobotFramework的关键字的注解等功用,轻易我们疾速的去建立一个Lib库以及对应的关键字。
<dependency> <groupId>com.github.ombre42</groupId> <artifactId>jrobotremoteserver</artifactId> <version>2.0-BETA</version> </dependency>
这个是Remote Server的依靠包,作用是能够启动一个RobotFramework的长途挪用接口效劳,然后RIDE中经由历程Remote的体式格局就能够衔接到该长途挪用效劳上,假如不运用长途挪用效劳的话,能够不引入该依靠包。
<plugin> <groupId>com.googlecode.robotframework-maven-plugin</groupId> <artifactId>robotframework-maven-plugin</artifactId> <version>1.1.1</version> <executions> <execution> <phase>test</phase> <goals> <goal>run</goal> </goals> </execution> </executions> <configuration> <variables> <variable>BUILDING:True</variable> </variables> </configuration> </plugin> </plugins>
这个是RobotFramework供应的maven插件,这个不是一个必需的maven工程依靠,该插件的作用在于能够模仿我们的RIDE一样来实行测试案例,在运用maven编译打包时,能够同时来实行RobotFramework的测试案例。经由历程以下的体式格局来指定测试案例的位置。
<testResources>
<testResource>
<directory>src/test/resources</directory>
<filtering>true</filtering>
</testResource>
</testResources>
在maven工程构建好了后,我们就能够来编写自定义的Lib库了,下表中形貌了运用java言语来编写自定义Lib时,一些经常使用的java注解。
注解称号 | 运用形貌 |
@RobotKeywords | 该注解平常用于java类的头部,用来标注该java类供应的是一个RobotFramework关键字类。 |
@RobotKeyword | 该注解和@RobotKeywords注解须要一同合营运用,@RobotKeyword注解平常用于java中的某个具体要领的头部,用来标注该要领供应的是一个RobotFramework关键字。
能够经由历程@RobotKeyword背面加括号的体式格局来申明该关键字的用处,比方@RobotKeyword("这是一个示例关键字") |
@ArgumentNames
|
该注解须要和@RobotKeyword注解一同运用,该注解用于标注一个RobotFramework关键字须要传入的参数,运用示例:
@ArgumentNames({"elementString"})
|
代码示例:我们这里用java的体式格局来完成RobotFramework 中的Sting Lib库(以下图所示)中的部份关键字Convert To Lowercase和Convert To Uppercase。
package com.example.keywords; import org.robotframework.javalib.annotation.ArgumentNames; import org.robotframework.javalib.annotation.RobotKeyword; import org.robotframework.javalib.annotation.RobotKeywords; @RobotKeywords public class StringKeyWord { @RobotKeyword("Convert To Lowercase") @ArgumentNames({"string"}) public String convertToLowercase(String string) { System.out.print("Convert "+string+" To Lowercase"); return string.toLowerCase(); } @RobotKeyword("Convert To Uppercase") @ArgumentNames({"string"}) public String convertToUppercase(String string){ System.out.print("Convert "+string+" To Uppercase"); return string.toUpperCase(); } } 关键字编写完了后,我们还须要定义一个Library库,经由历程继续AnnotationLibrary这个类, 而且这里我们经由历程RemoteServer的体式格局来启动。 package com.example; import java.io.IOException; import java.io.InputStream; import java.io.StringWriter; import java.nio.charset.Charset; import org.apache.commons.io.IOUtils; import org.robotframework.javalib.library.AnnotationLibrary; import org.robotframework.remoteserver.RemoteServer; public class MyRemoteLibrary extends AnnotationLibrary { public MyRemoteLibrary() { // 关键字类的途径 super("com/example/keywords/*.class"); } @Override public String getKeywordDocumentation(String keywordName) { if (keywordName.equals("__intro__")) return getIntro(); return super.getKeywordDocumentation(keywordName); } /** * 长途接口效劳的启动 * @param args * @throws Exception */ public static void main(String[] args) throws Exception { RemoteServer.configureLogging(); RemoteServer server = new RemoteServer(); //向server中到场自定义的library,而且设置长途接口效劳的端口 server.addLibrary(MyRemoteLibrary.class, 8270); server.start(); } /** * 定义Library的申明信息 * @return */ private String getIntro() { try { InputStream introStream = MyRemoteLibrary.class.getResourceAsStream("__intro__.txt"); StringWriter writer = new StringWriter(); IOUtils.copy(introStream, writer, Charset.defaultCharset()); return writer.toString(); } catch (Exception e) { throw new RuntimeException(e); } } }
定义完Library后,我们就能够以RemoteServer的体式格局来启动我们的长途接口效劳,以下图中所示

在RIDE中,我们经由历程Remote 衔接到我们启动的长途接口效劳中,以下图所示。

然后经由历程F5快捷键,就能够看到我们长途效劳中定义的关键字了,以下图所示。

示例:我们经由历程一个示例来挪用一下我们长途接口效劳中定义的关键字,以下图所示。
运转效果以下:
Starting test: RobotFrameworkTest1.TestSuite11.TestCase001
20180822 10:04:23.328 : INFO : Convert robotFramework To Lowercase
20180822 10:04:23.328 : INFO : ${strLowercase } = robotframework
20180822 10:04:23.330 : INFO : robotframework
20180822 10:04:23.337 : INFO : Convert robotframework To Uppercase
20180822 10:04:23.338 : INFO : ${strUppercase } = ROBOTFRAMEWORK
20180822 10:04:23.340 : INFO : ROBOTFRAMEWORK
Ending test: RobotFrameworkTest1.TestSuite11.TestCase001
从运转效果看,能够胜利挪用到我们长途接口效劳中自定义编写的两个关键字。
上面我们是经由历程RemoteServer的体式格局来挪用java编写的自定义的关键字,我们也能够改用jybot的体式格局来挪用java编写的自定义关键字,在工程中,我们引入maven-assembly-plugin这个插件,这个插件能够经由历程实行mvn clean assembly:assembly -Dmaven.test.skip=true 打包时,将一切相干的依靠包打包在一个jar包中,轻易我们在实行时,不须要手动一个个去设置实行时须要依靠的别的相干jar包。
<properties>
<!-- 定义打包时的字符集花样 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<testLibraryClass>MyRemoteLibrary</testLibraryClass>
</properties>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<!-- 设置实行时的java main要领 -->
<mainClass>${testLibraryClass}</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-my-jar-with-dependencies</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
别的须要注重是,我们须要将我们上面定义的MyRemoteLibrary这个类挪动到我们maven工程的根目次下,以下图所示。
实行mvn clean assembly:assembly -Dmaven.test.skip=true打包后,就能够生成我们须要的jar包了,以下图所示。
将MyRemoteLibrary-1.0-jar-with-dependencies.jar 安排到java的classpath目次下后,我们就能够在RIDE中引入MyRemoteLibrary库了,以下图所示。
引入后,我们再用jybot的体式格局实行上面RemoteServer运转时的一样示例,以下图所示。
运转效果以下:以下图所示。
能够看到,运转后得到了一样的效果。
备注:本文内容摘选自作者本身出书的 一书。
关于自动化测试的更多内容,请关注:
相干博文汇总:
【MySQL 线上 BUG 分析】之 多表同字段异常:Column ‘xxx’ in field list is ambiguous