版权声明:博主原创,严禁盗用!转载请注明原作者及出处。

Robot的测试数据可以分为三层结构:测试工程Project(或叫主目录),测试集合Test Suite,测试用例Test Case。除了这三层基本机构外, 还有用户关键字,变量文件, 资源文件等。他们的关系如下图所示。

测试用例Test Case:测试用例是具体的测试步骤。记录对被测软件要执行什么操作。
测试集合Test Suite:在测试用例之上是测试集合,一个测试集合对应一个文件,一批相关的测试用例可以放在同一个测试集合里。
测试集合下可以定义作用范围为本集合的变量,以及创建用户自定义的关键字。
测试工程Project:测试工程或者叫测试主目录更准确一点。是测试集合的集合。一个测试主目录包含一到多个测试集合。一个测试主目录一般对应一个被测系统。
测试主目录除了可以像测试集合一样,可以创建用户关键字和定义本目录作用范围下的变量外,还可以创建资源和子目录。
变量定义Variables:定义一定作用范围的常量scalar,列表list或者字典dict。
用户关键字keywords:基于现有的关键字,用户可以自己创建满足特定需求的自定义关键字
资源Resources:变量和用户自定义关键字的集合。如果某些关键字或变量适用于多个Test Suite测试集合,则可以把他们抽象出来统一放到一个resources资源文件里。在需要使用的Test Suite测试集合里引用这个资源文件就像import函数一样使用即可。

Robot测试数据的文件构成
测试主目录和子目录在文件系统上就是一个目录文件,其下可以有一个特殊的文件”init.tsv”用与存放与此目录相关的变量、用户关键字、初始化和退出操作等。

一个测试集合即为一个独立的文件。用于存放测试用例,相关的变量、用户关键字等。

资源Resource也是一种独立的文件。资源文件里可以存放变量定义、用户关键字信息。

为了对上面这些概念有个直观的了解, 我们用一个简单是示例开始一步一步介绍如何创建管理他们。现在我们已经有了RIDE,不用再用记事本痛苦的一个字母一个字母的按格式敲了,还要随时提防错用空格和tab。我们用RIDE来重新创建Hello World示例,有了工具的帮助,我们可以比较轻松的让它能够测试更多的功能。我们设想要对一个助理机器人系统做测试。这个助理机器人系统提供了一些基本问题的自动回答。比如像下面列举的几条:

问:你好!
机器人答:主人,早上好!(能自动根据时间回答下午好或晚上好)
问:现在几点了?
机器人答:现在时刻 9:00整。
问:今天天气怎么样?
机器人答:今天早上微风,温度23°,中午到下午晴朗,最高温度达32°,傍晚有小到大雨, 请主人出门注意防晒和准备雨具哦!
问:<随便说一些机器人不知道答案的问题>
机器人答:对不起!我现在还不能理解您在说什么,请尝试其它问题吧。

我们要对上面的机器人客服系统做自动化测试,首先得设计我们的测试点。测试点大致可以分成两类, 一类是正向的测试点,对机器人能回答的问题一对一的设计测试用例。另一类是异常的测试点,向机器人输入一些她不知道的问题或者甚至输入一些英文、特殊符号、乱码等。下面来一步一步跟着我创建这些自动化测试用例。

为了快速上手,对示例中用到的变量、关键字、IF判断等等可以先不用太纠结,在后面会详细讲解Robot Framework的语法和使用场景。
1 创建Project,suite,case
打开RIDE, 点击”File->New Project”,在弹出的对话框里填上必要的信息如下图。

Type选Dirctory, Directory的意思是创建一个目录, 这样在这个目录下可以创建多个test suite文件。 如果选择”File”,就会只创建一个test suite文件了, 不能再在下面创建子目录和suite了。
Format可以任选,个人比较喜欢TSV格式。这个格式的文件可以用任何文本编辑器打开, 相对于TXT来说,更易读一些。 相对于HTML来说,文件大小要小些。相对于ROBOT格式来说,便于版本管理工具管理。

工程主目录创建好了以后,右键点击”assistant_robot_project”目录,选择”New Suite”,在弹出的对话框里填上suite的名字,如下图:

Type选”File”, “File”和”Dircotry”的区别和新建project类似。这里我们要创建一个Test Suite而不是要创建一个子目录,所以选择”File”。
格式还是我喜欢的TSV。

在创建好的Test Suite “Positive_Function_TestSuite”上右键点击,然后选择”New Test Case”。 终于轮到创建测试用例了!在弹出的对话框上填入case的名字即可, 比如”Hello_TestCase”。最后RIDE上的结构应该是这样的:

2 创建Resource,keyword
经过初步分析, 在我们的每一个case里都要向机器人发送一条指令。 然后等待机器人回复。所以我们可以抽象出两个关键操作: 一是发送指令, 二是接收机器人回复。具体的发送接收功能依赖于具体的机器是的实现方式,我们这里用一种简单的方式来实现:用户把问题存入一个文本文件里, 然后机器人程序读取此文本文件并根据文件里的问题给出回复。答复内容写入另一个文件中。助理机器人的模拟程序可以用python简单实现如下:

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import datetime
import os
import sys
reload(sys)
sys.setdefaultencoding('utf-8')def Reply():curDir=os.path.dirname(__file__)src_f=os.path.join(curDir,'questions.txt')dst_f=os.path.join(curDir,'answer.txt')fn_src=open(src_f,'r')msg=fn_src.readline()fn_src.close()inputMsg=u'问:{}'.format(msg)print inputMsgfn_dst = open(dst_f, 'w')retMsg=““if cmp(msg.strip().decode('utf-8'), '你好!') == 0:nowTime = int(datetime.datetime.now().strftime('%H'))retTime=““if nowTime >= 18:retTime=u”晚上”elif nowTime >=12:retTime=u”下午”elif nowTime < 12:retTime=u”上午”retMsg=u”主人,{}好!”.format(retTime)elif cmp(msg.strip().decode('utf-8'), '现在几点了?') == 0:nowTime = datetime.datetime.now().strftime('%H:%M')retMsg=u”现在时刻{}”.format(nowTime)elif cmp(msg.strip().decode('utf-8'), '今天天气怎么样?') == 0:retMsg=u”今天早上微风,温度23°,中午到下午晴朗,最高温度达32°,傍晚有小到大雨, 请主人出门注意防晒和准备雨具哦!”else:retMsg = u”对不起!我现在还不能理解您在说什么,请尝试其它问题吧。”print “答:” + retMsgfn_dst.write(retMsg.strip().decode('utf-8'))fn_dst.close()if __name__ == “__main__”:Reply()

和机器人的交互操作适用了所有的测试点,我们可以自定义关键字来实现这两个操作。 它们的作用范围是整个project,我们在project下创建一个resource文件来保存这些keyword。 右键点击”assistant_robot_project”, 选择”New Resource”, 在弹出的对话框里填上新建resource的名字”Operation_Resource”,格式选择TSV。

为了方便使用,在Resource里定义好存用户问题和机器人答案的文件变量以及机器人程序路径的变量。通过点击”Operations_Resource”,然后在点击”Add Scalar”来添加变量。

Robot Framework 提供了读取本地文件和运行本地程序的库,名字叫”OperatingSystem”,我们把它作为library加到Operations_Resource的文件里。”OperatingSystem”提供的关键字及其用法可以到Robot Framework官网找到。
http://robotframework.org/robotframework/latest/libraries/OperatingSystem.html

大家也许已经注意到定义的变量这里没有用全路径,而且目录分隔符也不是windows的目录分隔符”\”,而是使用了类linux的文件路径方式。Robot Framework能根据运行的平台自动把linux格式的路径转换成相应平台的路径,你也可以用”${/}”作为文件目录分隔符显式的告诉Robot Framework根据运行的平台进行替换。Robot Framework本身是支持跨平台的,我们写的测试数据最好也能跨平台,这样不管在windows上还是linux或者MaC上我们都不需要修改测试数据就可以直接运行。

右键点击”Operation_Resource”,选择”New User Keyword”来创建两个keyword。

Keyword名字取为”Send_Message”,并带一个参数”msg”用于存储我们要发送给机器人的指令。
另一个keyword名字可以取为”Get_Reply”,带一个返回参数”output”用于存储机器人回答的话语。
“Send_Message”和”Get_Reply”keyword的内容如下方式实现。


3 Test Case的实现
Resource和公共的keyword创建好后, 我们可以在test suite里把他们import进来。只需点击”Positive_Function_TestSuite”然后在右边点击”Resource”按钮,选择刚创建好的resource文件即可。

我们要测试的场景应该是:向机器人发出一句”你好!”,机器人应该根据当前时间回复”主人,早上好!”或 “主人,下午好!” 或 “主人,晚上好!”。

Send_Message是刚在Operation_Resource里创建的keyword,用于向机器人发送指令。
Get_Reply也是刚创建的keyword,用于调用机器人并得到相应的回复。
Check_Hello_Returns是一个作用域在本test suite的keyword,用来验证机器人的回复时候正确。其定义如下:

Check_Hello_Returns keyword有一个输入参数${arg}用于传递机器人回复的内容。
GetTime, Run Keyword If, should Contains这些都是Robot Framework builtIn默认包含的keyword。具体用户可以参见Robot Framework官网builtIn章节: http://robotframework.org/robotframework/latest/libraries/BuiltIn.html

至此,第一个测试用例Hello就设计完成了。有了这个测试用例作为基础, 第二个关于时间的用例就很简单了。第二个用例是:

问:现在几点了?
机器人答:现在时刻 9:00整。

Robot测试用例设计如下:

所有用到的keyword都在设计第一个case的时候创建好了的, 这个case可以直接重用。
第三个关于天气的测试用例与前两个类似,可以全部重用现有的keyword,只需替换具体的问题和回复即可。这里就不在赘述。
4 更多test suite
助理机器人的正向功能测试点我们已经自动化完成,现在可以自动化异常的测试点。在同一个project下新建一个test suite “Negative_Function_TestSuite”,同样添加Resource “Operations_Resouce.tsv”的引用。

设计测试用例覆盖下面这个测试点:


对助理机器人的所有测试点我们都自动化完了,我们来运行试试看吧。右键点击”Assistant Robot Project”,然后点击”Select All Tests”以选中全部测试用例。 点击RIDE的”run”标签,然后点击”start”按钮。见证奇迹的时刻!

Robot瞬间把所有测试用例都跑了一遍,五个测试用例都成功通过(PASS),共耗时1秒(Elipse time:00:00:01),实际使用时间少于一秒。点击”Report”或者”Log”按钮即可查看测试报告或详细的测试日志。

RF自动化测试系列-第三篇 测试数据相关推荐

  1. 深入理解javascript作用域系列第三篇

    前面的话 一般认为,javascript代码在执行时是由上到下一行一行执行的.但实际上这并不完全正确,主要是因为声明提升的存在.本文是深入理解javascript作用域系列第三篇--声明提升(hois ...

  2. javascript面向对象系列第三篇——实现继承的3种形式

    前面的话 学习如何创建对象是理解面向对象编程的第一步,第二步是理解继承.开宗明义,继承是指在原有对象的基础上,略作修改,得到一个新的对象.javascript主要包括类式继承.原型继承和拷贝继承这三种 ...

  3. [深度][PyTorch] DDP系列第三篇:实战与技巧

    [深度][PyTorch] DDP系列第三篇:实战与技巧 转自:https://zhuanlan.zhihu.com/p/250471767 零. 概览 想要让你的PyTorch神经网络在多卡环境上跑 ...

  4. 【Windows编程】系列第三篇:文本字符输出

    2019独角兽企业重金招聘Python工程师标准>>> 上一篇我们展示了如何使用Windows SDK创建基本控件,本篇来讨论如何输出文本字符. 在使用Win32编程时,我们常常要输 ...

  5. 自动化测试系列(三)|UI测试

    UI 测试是一种测试类型,也称为用户界面测试,通过该测试,我们检查应用程序的界面是否工作正常或是否存在任何妨碍用户行为且不符合书面规格的 BUG.了解用户将如何在用户和网站之间进行交互以执行 UI 测 ...

  6. UR机械臂+RG2机械手控制 学习及实际控制 系列第三篇-1

    1.机械臂UR的控制包括两种,一种是通过终端控制 比较笨重不方便,用于测试使用,另一种是通过ros例程包,订阅位置信息控制机械臂的移动,moveit自动规划机械臂的路径,并躲过设置好的盒子(box) ...

  7. 剖析Elasticsearch集群系列第三篇 近实时搜索、深层分页问题和搜索相关性权衡之道...

    http://www.infoq.com/cn/articles/anatomy-of-an-elasticsearch-cluster-part03?utm_source=infoq&utm ...

  8. 深入理解this机制系列第三篇——箭头函数

    前面的话 this机制与函数调用有关,而作用域则与函数定义有关.有没有什么是可以将this机制和作用域联系起来的呢?本文将介绍ES6新增的内容--箭头函数 痛点 对于闭包的痛点在于,闭包的this默认 ...

  9. “睡服”面试官系列第三篇之变量的结构赋值(建议收藏学习)

    目录 变量的解构赋值 1. 数组的解构赋值 2. 对象的解构赋值 3. 字符串的解构赋值 4. 数值和布尔值的解构赋值 5. 函数参数的解构赋值 6. 圆括号问题 7. 用途 变量的解构赋值 1. 数 ...

最新文章

  1. 科幻电影里的超能力?那不就是并发嘛!
  2. 同是程序员,为什么别人可以事半功倍?
  3. Web应用NLB群集
  4. KDD Cup 2019 AutoML Track冠军深兰科技DeepBlueAI团队技术分享 | 开源代码
  5. angularjsl路由_AngularJS路由和模板
  6. (笔记)java环境变量设置
  7. python 插入排序,选择排序
  8. mysql-hash分区管理维护
  9. 二倍图css,css二倍图的使用
  10. Android入门笔记13
  11. 关于微信小程序图标icon的五种实现方案
  12. JAVA各种系统架构图及其简介,分布式中间件技术实战
  13. Apache Ant简介
  14. sql 时间的模糊查询
  15. linux定时任务之自动启动Tomcat失效问题排查
  16. matlab ecu代码,嵌入式代码生成 - 汽车 ECU 产品级代码 - MATLAB Simulink
  17. 双屏显示器,扩展显示,笔记本清晰,扩展显示屏模糊的解决办法
  18. 74HC595驱动2位数码管代码实现和注意事项
  19. 密码学中的中间人攻击
  20. 一个轻量级内存池的实现与细节

热门文章

  1. python cmd环境输入python打开应用商店解决
  2. 限期4个月:苹果严控版号,开发者将如何自救?
  3. 设计模式只是一把锤子,不要拿着到处去敲!
  4. 数字化时代的市场营销
  5. 读薄《高性能MySql》(三)索引优化
  6. 请问怎么用python画一个轮廓图,,例如中国地图这种,注意是轮廓图,求大佬指点
  7. Aardio 第一天:使用虚表和适配器+试融合Java
  8. java520.1314表白_521.1314表白的数学题大全 临沂学霸520专用表白方式
  9. elasticsearch + ik
  10. 《C专家编程》1-2章阅读收获