![](https://img.haomeiwen.com/i3310600/bc48bc3c58d1a410.png)
声明:大家好,欢迎阅读我写的关于Robot Framework的文章。这里面有几个实例供大家学习和交流。我把每一步都配上了截图,而且争取把截图做的很清楚。不过截图中的文字或代码有时候实在会很小,有些朋友可能看不清楚,没关系,文章主要是介绍思路。文章的源代码可以在百度网盘上下载:
http://pan.baidu.com/s/1hrGsQ7y
Robot Framework练习源代码 ->第3个测试用例:工时表查询
正文:
每个test case写完后,我们都可以写个日志或是注释来提示输出结果,检查测试状态,和查看错误信息。就像直接写程序的原理一样。有几种方法可供选择:你既可以用Log关键字,也可以用Comment关键字,也可以直接写“##”。
![](https://img.haomeiwen.com/i3310600/5212d1e540dfef47.png)
Log就是日志的意思,属于Robot Framework的内嵌关键字,在官方API文档上有这么几种使用方法:
![](https://img.haomeiwen.com/i3310600/39d9179b7df8e343.png)
比如,如果不加任何参数,那输出结果就是一条简单的信息;如果后面加个“WARN”,那输出结果就是一条警告类型的信息。现在做实验,打开Tests -> Login –> TCLOG-1,在第4行和第5行输入以下命令:Log | Log: User has successfully logged in, Log | Log: User has successfully logged in|WARN
![](https://img.haomeiwen.com/i3310600/09460b905f9f9b27.png)
运行test case,会得到如下的提示:
![](https://img.haomeiwen.com/i3310600/783307e28d00ea47.png)
我们会注意到,系统输出两条关于用户成功登录的日志,第一条的头部显示INFO,第二条的头部显示WARN,这两个关键字在Robot Framework里是“Level”的意思,也就是类型或是等级。默认就是INFO,代表最基本类型的信息,在咱们的test case里所有的运行步骤都是基本信息。WARN指的是警告类型的信息,警告信息也会在报告里单独显示。
由于API文档里的内容很多,出于篇幅不可能把所有的关键字全部进行讲解和实验,有很多我也不确定用法和结果,也是一直在学习。这里再次建议大家养成看文档上网查询的好习惯。
Comment是显示在报告里的一条注释信息,比Log要简单,具体用法如图9-4,在第6行和第7行分别写下Comment | Comment: User has successfully logged in和## Invisible Comment: User has successfully logged in
![](https://img.haomeiwen.com/i3310600/22eb965db59c11d2.png)
注意,这两种方法都是写注释的,不过目的不相同。第6行目的是检查输出了什么,所以信息会显示在test case运行完的日志里:
![](https://img.haomeiwen.com/i3310600/706eaf1eb75c5108.png)
�第7行只是在信息前加了两个井号,它的目的只是在程序中告知测试员某段代码的功能是什么,用于在编程中使用,所以不会输出。它更像是程序员们编程时加注释的方法。马上我们开始的第3个测试用例中我们就会用到这种Comment。
说开始就开始,我们第3个test case是实现一个员工工时表查询的功能。先来看看这个工时表:打开http://www.xiaocesuo.net,在导航栏上点击“Timesheet”,我在上面创建了4条虚拟员工的工作记录,包括什么时候开始上下班,工作了多长时间,还有一些备注。在查询文本框中输入“Test One”显示1号员工的工时单;输入“Test Two”显示2号员工的工时单,以此类推。
![](https://img.haomeiwen.com/i3310600/519bb58a1c4ba8ba.png)
我们设计的test case步骤如下:
2.导航到Timesheet下;
3.输入员工姓名,查看返回结果是否正确:
1)输入”Test One”,返回2条记录,且均包含”TestOne”
2)输入”Test Two”,返回1条记录,且包含”TestTwo”
3)输入”Test Three”,返回1条记录,且包含”TestThree”
4)输入”Test Four”,无返回记录。
第1步登录不说了,直接调用以前写的方法就行。第2步导航到Timesheet下,就是简单点击按钮,也没什么可说的。第3步是我们的测试点,需要输入员工姓名。和登录一样,员工姓名也是从测试数据集里来的,我们首先准备测试数据。在Test_Data文件夹下创建一个叫Timesheet的子文件夹,然后创建一个叫TCTIMES-1.xls的文件:
![](https://img.haomeiwen.com/i3310600/07bb4e3a93191144.png)
![](https://img.haomeiwen.com/i3310600/ebfea6536fa08bb1.png)
我创建了两个sheet,一个在第1步登录使用,一个在第3步输入员工姓名时使用,简单清晰。当然,有些人都写在一个sheet里也没关系,只要别把数据搞乱就好。在“employee”sheet中,姓名被分成姓和名两列,有人说你分来写累不累?确实累,但我是故意这么写的,想多告诉大家一些关于Robot Framework里字符串的使用方法。还有一列是期望的工时记录数目,虽然是一些数,但Excel这里也用字符串表示,到时候讲为什么。
既然登录需要读文件,输入员工姓名也需要读文件,那我们是不是应该把读文件这步操作写成一个小的函数呢?没错。还是那个原则,能简则简,直接调用,便于维护,如需修改则修改一处即可。读文件不属于任何模块,只是个常规功能,我们给它放到Lib -> ApplicationSpecific.html下。右键Lib-> ApplicationSpecific.html -> New Keyword,输入Readdata from file,并且在Arguments写上“${file} | ${sheet}”,分别代表文件名和使用哪个sheet:
![](https://img.haomeiwen.com/i3310600/38fcacf71d11a1e7.png)
然后在第一行把之前在Tests -> Login -> TCLOG-1和TC-LOG-2第一行读文件的部分重新写在这里。三个地方需要注意:第一,引包。ApplicationSpecific.html需要DataDriven.py的Library;第二,既然读文件操作被转化成了函数,不再作为test case中的一个步骤,那我们就不要把实参写到这里,只需要形参即可(第3列和第4列写${file}和${sheet},而不是真实的文件路径和sheet,因为调用时可以作为参数传进来);第二,这个函数需要有个返回值以便在未来使用,而且返回值是个List,这样我们需要在Return Value里写上“@data”:
![](https://img.haomeiwen.com/i3310600/e084e6c8d1491fe7.png)
�现在我们就要正式开始写test case了。右击Tests -> New Suite创建模块,起名为Timesheet,然后引包。引包以后我就不再单独提了,如果一旦出现语句不被识别或是颜色感觉不对首先要想是不是语句错了,如果语句没错那就应该想到可能是包没引。都没问题后创建该模块下第一个test case – TCTIMES-1,和以前写登录test case时一样,把pretest和cleanup写进去:
![](https://img.haomeiwen.com/i3310600/273f9d712f0a065f.png)
接着在前4行把登录部分的代码按下图写好:
![](https://img.haomeiwen.com/i3310600/59f70c3c946e305f.png)
第一步就是之前提到的comment的一种写法,它并不输出,在代码量特别大时我们可以用它提示当前的代码是干什么的。第2步到第4步其实就是Tests –>Login -> TCLOG-1的内容,只不过我们使用了刚刚创建的函数Read data from file用来读文件。以后只要有登陆步骤我们就写这几行就行,因为所有内容都已经包含在Valid login to xiaocesuo函数里,直接调用即可。
登录完成之后就是从菜单进入到Timesheet界面的步骤,很简单。右键Pages -> New Resource –>创建资源文件Timesheet.html用来写跟Timesheet模块中需要的函数。这里还是相同的问题,你可以把这几个简单的步骤直接写到测试用例TCTIMES-1里,也可以写成函数。我还是倾向于写成函数,因为以后只要有“进入Timesheet界面”的测试步骤我就可以直接调用就好了。右键Timesheet.html ->New Keyword ->创建函数Navigate to Timesheet Screen,不需要任何参数和返回值。
![](https://img.haomeiwen.com/i3310600/4dc5b7cafc47b7e4.png)
按部就班,下面是写变量。之前有关登录的变量我们都放到了ObjRepository -> Login.html下,现在关于工时表的变量也不例外。右击ObjRepository -> New Resource ->创建Timesheet.html,然后先按图依次创建${locMenu_Timesheet},${locTSTable_SearchBox},${locTSTable_iframe}三个变量:
![](https://img.haomeiwen.com/i3310600/98c0e643105375eb.png)
先不用管它们是干什么的,回到Navigate To Timesheet Screen继续按下图完成该Keyword:
![](https://img.haomeiwen.com/i3310600/423fd28199c5a413.png)
这一下一目了然,声明出来的变量是用于函数步骤中的。第1步的关键字WaitUntil Page Contains Element看着眼熟吧?我们在以前介绍过一个语句是Page ContainsElement,用于判断当前网页是否包含某个控件元素。WaitUntil Page Contains Element顾名思义,也判断当前页面是否包含某个控件元素,但会在判断前等待一段时间,而这段时间默认是5秒钟,大家可以通过在参数位置自行定义。如果过了这段时间还没有该控件则测试失败。Wait是一个非常常用的关键字,按住Ctrl+Space可以看到很多,从语句字面上也很容易理解,有机会可以自己对照API文档做做实验。
第2步就是点击导航栏上Timesheet的xpath,第3步等待网页跳转。我的习惯是每次点击过后都等待个几秒钟,有时网页加载龟速,最好等一等。第4步我用了SelectFrame这个命令,因为咱们的工时表以及查询文本框虽然看上去是在Timesheet页面上,但其实不然。打开Firebug可以清楚看到它是在Timesheet页面的一个iframe上。Iframe可以简单理解成内嵌的页面,即页中页,但又与Timesheet页面无关。所以在这种情况下直接判断查询文本框是否在Timesheet页面上是会让测试失败的。正确的做法是选中这个iframe,然后再进行判断。当然,如果需要退出Frame可以使用Unselect Frame。现在有很多网页还在用iframe,如果出现识别不了网页元素的情况时请看看有没有iframe在网页中捣乱。第7步是log的一个简单用法,告诉测试员已经转到Timesheet页面上。
回到TCTIMES-1,把函数Navigate to Timesheet Screen写到test case中的第5行和第6行,注意引包。前两步登录和导航到Timesheet页面就做完了。
![](https://img.haomeiwen.com/i3310600/c8c1485117d35127.png)
网友评论