RF自动化测试系列-第三篇 测试数据

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

Robot的测试数据可以分为三层结构:测试工程Project(或叫主目录),测试集合Test Suite,测试用例Test Case。除了这三层基本机构外, 还有用户关键字,变量文件, 资源文件等。他们的关系如下图所示。
RF自动化测试系列-第三篇 测试数据_第1张图片
测试用例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”,在弹出的对话框里填上必要的信息如下图。
RF自动化测试系列-第三篇 测试数据_第2张图片
Type选Dirctory, Directory的意思是创建一个目录, 这样在这个目录下可以创建多个test suite文件。 如果选择”File”,就会只创建一个test suite文件了, 不能再在下面创建子目录和suite了。
Format可以任选,个人比较喜欢TSV格式。这个格式的文件可以用任何文本编辑器打开, 相对于TXT来说,更易读一些。 相对于HTML来说,文件大小要小些。相对于ROBOT格式来说,便于版本管理工具管理。

工程主目录创建好了以后,右键点击”assistant_robot_project”目录,选择”New Suite”,在弹出的对话框里填上suite的名字,如下图:
RF自动化测试系列-第三篇 测试数据_第3张图片
Type选”File”, “File”和”Dircotry”的区别和新建project类似。这里我们要创建一个Test Suite而不是要创建一个子目录,所以选择”File”。
格式还是我喜欢的TSV。

在创建好的Test Suite “Positive_Function_TestSuite”上右键点击,然后选择”New Test Case”。 终于轮到创建测试用例了!在弹出的对话框上填入case的名字即可, 比如”Hello_TestCase”。最后RIDE上的结构应该是这样的:
RF自动化测试系列-第三篇 测试数据_第4张图片
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 inputMsg
    fn_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 “答:” + retMsg
    fn_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。
RF自动化测试系列-第三篇 测试数据_第5张图片
为了方便使用,在Resource里定义好存用户问题和机器人答案的文件变量以及机器人程序路径的变量。通过点击”Operations_Resource”,然后在点击”Add Scalar”来添加变量。

Robot Framework 提供了读取本地文件和运行本地程序的库,名字叫”OperatingSystem”,我们把它作为library加到Operations_Resource的文件里。”OperatingSystem”提供的关键字及其用法可以到Robot Framework官网找到。
http://robotframework.org/robotframework/latest/libraries/OperatingSystem.html
RF自动化测试系列-第三篇 测试数据_第6张图片
大家也许已经注意到定义的变量这里没有用全路径,而且目录分隔符也不是windows的目录分隔符”\”,而是使用了类linux的文件路径方式。Robot Framework能根据运行的平台自动把linux格式的路径转换成相应平台的路径,你也可以用”${/}”作为文件目录分隔符显式的告诉Robot Framework根据运行的平台进行替换。Robot Framework本身是支持跨平台的,我们写的测试数据最好也能跨平台,这样不管在windows上还是linux或者MaC上我们都不需要修改测试数据就可以直接运行。

右键点击”Operation_Resource”,选择”New User Keyword”来创建两个keyword。
RF自动化测试系列-第三篇 测试数据_第7张图片
Keyword名字取为”Send_Message”,并带一个参数”msg”用于存储我们要发送给机器人的指令。
另一个keyword名字可以取为”Get_Reply”,带一个返回参数”output”用于存储机器人回答的话语。
“Send_Message”和”Get_Reply”keyword的内容如下方式实现。
RF自动化测试系列-第三篇 测试数据_第8张图片
RF自动化测试系列-第三篇 测试数据_第9张图片
3 Test Case的实现
Resource和公共的keyword创建好后, 我们可以在test suite里把他们import进来。只需点击”Positive_Function_TestSuite”然后在右边点击”Resource”按钮,选择刚创建好的resource文件即可。
RF自动化测试系列-第三篇 测试数据_第10张图片
我们要测试的场景应该是:向机器人发出一句”你好!”,机器人应该根据当前时间回复”主人,早上好!”或 “主人,下午好!” 或 “主人,晚上好!”。
Hello_TestCase测试用例
Send_Message是刚在Operation_Resource里创建的keyword,用于向机器人发送指令。
Get_Reply也是刚创建的keyword,用于调用机器人并得到相应的回复。
Check_Hello_Returns是一个作用域在本test suite的keyword,用来验证机器人的回复时候正确。其定义如下:
RF自动化测试系列-第三篇 测试数据_第11张图片
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测试用例设计如下:
Time_TestCase测试用例
所有用到的keyword都在设计第一个case的时候创建好了的, 这个case可以直接重用。
第三个关于天气的测试用例与前两个类似,可以全部重用现有的keyword,只需替换具体的问题和回复即可。这里就不在赘述。
4 更多test suite
助理机器人的正向功能测试点我们已经自动化完成,现在可以自动化异常的测试点。在同一个project下新建一个test suite “Negative_Function_TestSuite”,同样添加Resource “Operations_Resouce.tsv”的引用。
RF自动化测试系列-第三篇 测试数据_第12张图片
设计测试用例覆盖下面这个测试点:
Unkown_TestCase测试用例1
Unkown_TestCase测试用例2
对助理机器人的所有测试点我们都自动化完了,我们来运行试试看吧。右键点击”Assistant Robot Project”,然后点击”Select All Tests”以选中全部测试用例。 点击RIDE的”run”标签,然后点击”start”按钮。见证奇迹的时刻!
RF自动化测试系列-第三篇 测试数据_第13张图片
Robot瞬间把所有测试用例都跑了一遍,五个测试用例都成功通过(PASS),共耗时1秒(Elipse time:00:00:01),实际使用时间少于一秒。点击”Report”或者”Log”按钮即可查看测试报告或详细的测试日志。
RF自动化测试系列-第三篇 测试数据_第14张图片
RF自动化测试系列-第三篇 测试数据_第15张图片

你可能感兴趣的:(RF)