Robot Framework--05 案例设计之流程与数据分离
转自:http://blog.csdn.net/tulituqi/article/details/7651049
这一讲主要说一下案例设计了。还记得我们前面做的case么?先打开浏览器访问百度,输入关键字,点击搜索。
我们再加上个检查点,检查一下标题是否包含我的关键字,然后关闭浏览器。就是下面这样了。
这样就可以算是一个比较完整的案例了,包含完整的流程和检查点,那么这时候如果我要增加一个案例,搜索另外的内容怎么办呢?
在原来的case上修改肯定是不合适的,毕竟那个案例可能还是需要保留的。
最简单的办法,把这个case复制一个,修改搜索内容。那么我们复制出一个case2吧
然后我们把2个一起运行一下。
都运行成功了。但是如果我们这样的方法虽然简单,但是并不合理,因为如果我要再加5个、10个、100个呢?
都是同样的流程,只是搜索内容和检查点不同,为什么不能把流程抽离出来与数据分开呢?也就是案例分层设计。
这时候就用到了之前讲过的User Keyword,如果你的案例已经写好了,那么可以用下面这个方法,如果是新建的时候就准备好分层了,那么直接在资源里新建userkeyword就可以了。
=======分层方法=======
1、选中case中的所有脚本,点击右键,选择Extract Keyword
输入Keyword的name,Arguments先不管。
点击OK,就会看到生成了一个userkeyword了。
而我们再看case的内容就只有这个关键字了。
2、新建一个Resource文件,把UserKeyword移动过去(或者移动到已有的Resource文件里)
这样做的目的是为了更清晰,在测试套件中一般不放置UserKeyword,前面第2讲的时候我们就说过了,首要建议UserKeyword放在Resource里。
我这里新建一个Resource,叫TestFlow.txt,然后把这个搜索测试移动过去,就成了这样。
我这是新版的RIDE0.46.1,貌似又新增了一些特性,比如图片里我新增的Resource文件TestFlow.txt是灰色的,因为他没有被加载过。前面我们介绍了怎么把Resource加载到TestSuite上,现在也照着做一遍。加载后就是和res1.txt一样了,就不放图片了。
3、接下来我们针对这个测试流程进行分离,因为这个案例流程比较简单,实际上就只有搜索内容这一个值是变化的,因此我们把他改成一个变量,同时把这个UserKeyword的参数加上这个变量。
忽然发现这些关键字都是黑色的了,别急,这是因为我们在TestFlow.txt上没有加载Library,参考前面添加Library的地方把S2L(Selenium2Library缩写)加进去就可以了。实际上不加也不影响,只要在运行的地方有加载过Library,就可以正常执行。只是这里显示看的不太舒服而已。为了证明可以正常执行,我这就先不加S2L了。
4、再回头看看case的内容
在搜索测试的后面一个格子变红色了,这是提醒我们这个UserKeyword有一个参数必须要填写,我们写上case要测试搜索的内容。
5、接着我们再把case2的内容都清掉,重新写一个和case一样的脚本,来调用搜索测试这个UserKeyword
6、再运行一次, 结果和之前相同,都是pass了。大家可以自己运行一下看看。
到现在我们完成了一个简单的分层,把搜索测试这个流程剥离成一个关键字,然后在不同的case调用这个关键字,然后传递不同的参数,用以进行不同数据在同一个流程下的测试。
这样就不用担心再新增10个或100个案例了,因为这个案例比较简单,通过复制也可以做出10个或100个案例,但是最大的区别在于,如果我的流程中间需要做一点小的调整和优化,对于流程和数据分离的案例来说,我这样维护一下搜索测试这个UserKeyword就行了;对于复制的案例,那你就要辛苦了,你有多少个案例就改多少吧。
其实这个道理引申出来,我们做自动化测试也是一样,选择不同的方法或者工具都可以实现最终的目标,但是我们需要考虑的不是把案例做起来,因为这个比较容易实现。对于自动化案例来说,最大的难度不是在于怎么做案例,而是怎么维护案例。因为随着需求的更新,系统的流程或者页面会发生很多的变化,这时候的维护成本的高低才是我们首要考虑的,如果自动化案例建立起来之后,没有后续维护的投入,最终经过若干个版本,这些自动化案例基本就是废弃的了。
首先我们看一下testflow这个resource里的内容。
可以看到在这个搜索测试的关键字中,我们堆积了很多最底层的代码,这样是不够灵活的。
对于我们分层来说,还是要把一些底层的代码级关键字继续拆分出来。
先做2个,后面的类似。这时候我们看res1的资源下面有一个打开浏览器的,这是我之前添加了,目的就是留到这里来分层的。
我们把open browser这一行挪过去。
记得给res1加载Selenium2Library
然后在res1下面新增一个输入搜索内容,并把第二行input text挪过来。
剩下的第3行、第45行、第6行,也分别增加3个关键字。效果如图:
接着我们把对应的搜索测试中的代码都换成相应的关键字。
这样还不行,因为有一些关键字是有参数的,我们最好把他们继续完善相应的参数。
打开浏览器:
输入搜索内容:
点击搜索和关闭浏览器不需要加参数了。
校验标题:
搜索测试里面的内容我们也顺势一起修改一下,加个url的参数。
因为修改了搜索测试的arguments,所以必须把case的也进行修改。所以大家以后注意要提前设计好关键字的arguments,否则后面修改的时候很容易遗漏。
至此,我们这个案例就已经完成分层了,因为案例比较简单,所以只分了3层,分别是案例层,流程层,元素层。他们的调用关系也是逐层深入的。
一般情况下,做一个系统或项目,大概分4层就够了,如果系统比较复杂可以考虑分5层。
看一下分4层的图(手头没有例子,先借用一下吴博PPT里的图):
分别是案例层、流程层、流程构件(页面层)、元素层,加载资源也是从上到下的。
案例层中放的是流程层的关键字,流程层放的是页面层的关键字,页面层放的是元素层的关键字。
我们自己的项目分5层的:
和4层的比起来,我这里多了一个components组件层。因为我们的有很多页面内容比较多,我把每个页面分成了几个区域,一个区域就是一个components。
所以我这边的加载顺序是case层加载l0-testflow,testflow加载l1-page,page加载l2-components,components加载l3-elements层。一个elements文件就是一个页面内所有的元素,由于元素较多,所以这样来组织,然后在组件层加载所有页面的元素,然后拼出相应的组件。
=============总结一下=============
这样做的好处不单是为了以后维护方便,也使得案例的架构层级清晰。越是靠近上层的部分,脚本越贴近自然语言,或者说很像我们的测试案例;越靠近下层的部分,越是接近页面元素的代码级部分。这样以后如果发生维护的时候,根据需要维护的内容,只需要在很少的地方进行调整即可。比如一个元素的id变了,那我只要在elements里面更新就行了。比如测试的流程调整了,以前是ABC的页面顺序,现在是ACB的页面顺序,那么只要在testflow层进行调整即可。
那么回到我们的标题,流程与数据分离,实际上目前我们的流程都集中在testflow以及下面的部分,而数据一般都是在案例层去给流程层传递,这就是我们的流程与数据分离了。当然,我们还可以再进一步的分离,把数据放到外面,脱离我们的案例,在运行的时候才传递进行,也是可以实现的。后面我会做个简单的例子给大家看。
在前一篇的基础上,我们继续做一下进一步的数据分离。大体上有三种方式,第一种适合和Jenkins集成用的,第二种适合有大量数据的,第三种么只有思路,暂时还未实现,如有朋友能实现的话也欢迎分享一下。
一、运行时参数(-v 参数)
先看一下case的脚本:
然后我们改造一下,把url和搜索文字都改成变量。
然后我们选择RUN页面,在Arguments栏输入参数 -v testURL:http://www.baidu.com/ -v searchText:齐涛-老道长,接着运行一下,这个是木有问题的。
作用:这种方式的作用在和Jenkins整合做持续集成的时候非常方便,可以在JOB运行的时候根据传入的参数决定在哪个环境运行。
二、参数文件(-V)
这个和上一个的区别就是一个使用大V,一个使用小v,并且大V的是使用文件的。使用文件的好处就是这里你可以写很多的
我们先增加一下var.py的文件(pyc是运行后自动编译生成的,不用管),内容如图。这里要注意的就是中文字符串前面要加u。还有__all__要列出所有的变量。
另外增加了2个变量,一个是LIST型变量,另一个是使用了一个随机数方法,每次都会生成一个1-10的随机数。接着再改造一下我们的案例,增加2个log,把那2个变量的值打印一下。
接着我们要加载这个var.py文件,这里有几种方式,推荐第一个。
1、在测试套件上使用Add Variables增加var.py进来,因为我的var.py文件就放在案例相同的目录,所以不用写路径了。
2、和刚才的小v在一个地方RUN的这里写,不过要写完整的路径。感觉不如第一种方便,如果不写路径会报错。或许我没找到如何缩短路径的办法。
3、在脚本中使用import variables,这里可以用${CURDIR}代表当前路径,这样比2好一些,不用写那么长的路径。
最后运行一下,可以看到test log里的值已经是使用了var.py文件里的变量值。
三、使用外部excel文件
对于这种方案目前我这里还只是构思,没有代码实现出来,所以只说一下思路。
就是类似于QTP的加载excel差不多,但是我们这里需要使用Python脚本来写excel的读写方法,貌似有个xlrd的库,但是好像还要自己做拓展开发,一直没啥时间去写这个公共方法,加上俺Python经验有限,之前写自己的测试库都是边查帮助边写的,缺乏系统化的学习。如果有朋友有实现的方法,可以提供给我参考一下哈。
实现了excel读写之后,就可以在测试过程中使用外部的excel文件读取数据或写入数据了。
Robot Framework--05 案例设计之流程与数据分离的更多相关文章
- Robot FrameWork测试案例
Robot FrameWork是一个自动测试框架,可到官网查看详细介绍. 安装 Robot Framework 本文中的Robot framework安装在Win7 (32 bit) 平台上. 接下来 ...
- Robot Framework分层、开发系统关键字
开发系统关键字:http://www.cnblogs.com/fnng/p/4261293.html http://www.cnblogs.com/fnng/p/3969978.htm ...
- Robot Framework学习笔记(十一)------ 分层设计
以百度搜索为例,如果我们需要写5个不同关键字搜索的用例.如果没有分层的思想,那么我们需要写5个用例,并且每个用例都需要重复写打开浏览器.输入关键字.点击按钮.关闭浏览器的步骤.如果使用Robot Fr ...
- Robot Framework操作
Robot Framework 介绍 RobotFramework是一款基于python的开源自动化测试框架,遵守Apache License 2.0协议,在此协议下所有人都可以免费开发和使用.因为R ...
- Robot Framework使用For循环
1.普通的For循环 在一个普通的For循环中,循环开始的关键字是 :FOR ,其中的:用于与一般关键字做区分,对于循环结构体内的每一行,使用 \ 作为改行的行首关键字.对于循环中的变量,可以在 IN ...
- Robot Framework自动化测试框架核心指南-如何做好自动化测试平台框架的设计
自动化测试如果需要能高效快速的支撑软件项目的测试,项目的快速迭代以及上线,除了以上我们介绍的需要许多的Lib来支持以及需要高效的去编写自动化测试案例外,还需要一个好的自动化测试框架平台来支撑我们的自动 ...
- python3+Robot Framework+PyCharm自动化测试框架设计
关于自动化测试框架的设计,笔者在前面的随笔里面有介绍和总结,这里结合实际的项目例子做个demo,环境部署参考笔者的的随笔<python3+Robot Framework+PyCharm环境部署及 ...
- Robot Framework测试框架用例脚本设计方法
Robot Framework介绍 Robot Framework是一个通用的关键字驱动自动化测试框架.测试用例以HTML,纯文本或TSV(制表符分隔的一系列值)文件存储.通过测试库中实现的关键字驱动 ...
- 038 01 Android 零基础入门 01 Java基础语法 04 Java流程控制之选择结构 05 案例演示switch结构-星期的表示案例以及总结
038 01 Android 零基础入门 01 Java基础语法 04 Java流程控制之选择结构 05 案例演示switch结构-星期的表示案例以及总结 本文知识点:案例演示switch结构并对sw ...
随机推荐
- 【BZOJ 4456】【UOJ #184】【ZJOI 2016】旅行者
http://www.lydsy.com/JudgeOnline/problem.php?id=4456 http://uoj.ac/problem/184 参考(抄)的晨爷的题解(代码) 对矩形进行 ...
- 页面打开自动触发onlick事件
<script type="text/javascript"> // 两秒后模拟点击 setTimeout(function() { // IE if(document ...
- mnsday1t1
贪心地选取两个后缀,然后往前补全,贪心地补全前k个不同的字符 我写了个沙茶dp,结果T掉了,明明都是n3的... #include<iostream> #include<stdio. ...
- 问题-栈S最多能容纳4个元素,现有6个元素按A、B、C、D、E、F顺序进栈,问可能的出栈顺序。
住栈的特性:对于取出栈内元素每次只能从栈顶开始取(后进先出(栈满时,只能先出后进)) 由于栈内只能容纳4个元素: 所以 E F不可能第一个出栈: 当栈内少于四个元素时 既可以选择进栈,也可以选择出栈 ...
- mindmup-editabletable-编辑table的使用
官方网站:http://mindmup.github.io/editable-table/ github下载地址:https://github.com/mindmup/editable-table 我 ...
- js,jquery转json的几种方法
一.原生js转json, eval()方法,不需要引入外部插件; //由JSON字符串转换为JSON对象 var obj = eval('(' + jsonStr + ')'); 或者 var obj ...
- c# 获取iis地址
using System;using System.Collections.Generic;using System.DirectoryServices;using System.Linq;using ...
- hibernate查询返回一个list ,Date类型追加数据
public Pagination getLookPage(BeanPatrolScheduling beanPatrolScheduling, int pageNo, int pageSize) { ...
- Shiro-认证
认证流程: 1. 获取当前的 Subject. 调用 SecurityUtils.getSubject();2. 测试当前的用户是否已经被认证. 即是否已经登录. 调用 Subject 的 isAut ...
- 【BZOJ-1864】三色二叉树 树形DP
1864: [Zjoi2006]三色二叉树 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 659 Solved: 469[Submit][Status] ...