通过实例学习RobotFrameWork - 2

这次我们来分析代码拉~~

测试实例代码分析

(注:本次分析代码较文章1中代码有部分改动,以本文为准)

1. RFS基本介绍

1.1 RobotFramework 架构

在进行代码分析之前,我们先来简单地介绍一下RobotFramework的文件、代码结构及语法。我们给出RobotFramework官方的架构图:

image

这里有一个很重要的概念是,RobotFrameWork将用户编写的大部分文件,包括test case, resource文件等都称为 Test data, 这一点需要跟我们印象中的测试数据区别开。根据架构图,RobotFrameWork将整个测试流程中涉及到的各个部分做了模块化处理:用户只需要关注具体逻辑,在TestData文件中 使用RobotFramework层中封装好的关键字对下层系统进行测试。然而RobotFramework本身并不知道下层待测系统究竟是何种应用,是Web还是数据库还是移动端,所有的具体操作都是通过调用加载进来的test libraries以及其他test tools(例如selenium driver, 以及用户自定义的代码,关键字)的接口,来实现对待测系统的操作。举一个粗糙的例子,如果我们的测试逻辑是:

  • 打开浏览器

  • 访问特定网址

  • 点击一个button

  • 产生一个结果

  • 关闭浏览器

TestData层面的代码可以用上述关键字来编写。在中间层,如果加载的是Selenium2Library 并设置测试网站,此套用例就适用于网站自动化测试;如果我们加载AppiumLibrary并设置手机端,那么RobotFramework便会在手机端按照同样的逻辑进行操作。客户只写一套关键字用例,具体的web操作或者手机端操作,都是由Selenium2Library或者AppniumLibrary来执行。

1.2 文件及目录结构

1.2.1 测试用例文件

测试用例文件(Test Case files)是RobotFramework最基本的文件。一个测试用例文件中可以包括多条测试用例及其具体的测试步骤。同时,每个测试用例文件都会自然生成一个Test Suite。我们通过实例的代码来理解这句话:

image

从RIDE中的树形图我们可以到,本次demo的测试代码中有一个名为Test JoinUS的Test suite,下面包含了4条测试用例,以TC01 – TC04进行命名。我们转到测试代码实际存放的文件夹:

image

我们可以看到实际的测试用例只是以Test Suite名字命名的一个文本文件 Test_JoinUs.txt

而打开文件后我们可以看到:

image

代码通过Test Cases来定义测试用例的开始。每一个测试用例名称和代码之间使用类似python语法的缩进来判定。

1.2.2 目录

现阶段我们可以简单地理解为目录就是存放Test Suite files以及初始化文件 init.ext的文件夹,与windows文件夹结构类似,支持嵌套。

1.2.3 Test data 文件类型

RobotFramework支持的文件类型包括

  • HTML
  • TSV(一种使用Tab键来分割单元格的文件)
  • reStructuredText - 一种轻量级的文本标记语言,与MarkDown类似
  • Plain Text

由于HTML, reStructuredText有语法学习成本, TSV格式在编辑处理方面较为不便。因此推荐使用Plain Text来编写测试用例。

1.2.4 Test data 文件 内容格式

RobotFrameWork定义每一个独立的Test data文件都包含下面四部分内容


image.png

我们可以简单地做如下理解:

Setting – 定义了说明性文档,引用的库,标签,以及测试用例的Setup, Teardown等配置信息

Variables – 文件中所用到的变量

TestCases – 具体的测试用例描述及操作步骤

Keywords – 用户自定义的关键字,是对系统关键字的再次封装。

以上就是对RobotFrameWork文档的一些粗略的介绍,下面我们进入测试实例的分析

2. 测试实例代码分析

2.1 Resource代码分析

2.1.1 代码截图

image

2.1.2 代码文本

*** Settings ***
Documentation     A resource file with Library, reusable keywords and varilables.
...               The system specific keywards created here for our own domain specific language
Library           Selenium2Library
Library           Screenshot    ${CURDIR}
Library           OperatingSystem
Library           Collections

*** Variables ***
${server}         https://www.safaribooksonline.com/
${browser}        Chrome
@{invalid_email}    123    asd    @    123@    @wer    123#asdw
@{channel}        Please select an option    Other    Friend or Co-worker    Conference or Trade-show    Radio Ad    Blog    News (Website, TV, or Radio)
...               Email    TV Ad    Search Engine    Social Media (Facebook, LinkedIn, Twitter, etc.)    Podcast

2.1.3 代码分析

从RIDE工具的Edit页面分析,首先,setting中定义了说明文档,类似代码开发中的最开始的注释文档,是对整个文件的一个介绍;其次,我们在resource中引入了Selenium2Library,Screenshot,OperatingSystem,Collection这几个库,在下面的test case中,我们会用到这几个库中封装好的关键字;最后,我们定义了变量,其中:

${server} – 定义了待测网站

${browser} – 定义了测试使用的浏览器

@{invalid_email} – 测试数据列表,定义了用于测试email地址验证模块的无效email地址

@{channel} – 测试数据列表,定义了下拉列表的期待值

在这里我们需要注意的是,如果是单独的变量,我们的前缀使用$;如果是列表变量,我们的前缀使用@。

2.2 TestCase 代码分析

2.2.1 Test Suite设置

image

如前文所述,Test suite 在RIDE上显示为一个单独的节点,实际是test case的一部分。通过截图可以看到,test suite通过Documentation描述了此文件所要涵盖的测试点,然后通过Suite Setup和Suite Teardown设置了每次suite运行前和运行完成后所要进行的打开,关闭浏览器操作,这么做的原因是suite中所包含的4个用例是一个end to end flow,也就是说四个用例一个接一个执行,互相之间有联系,因此只定义整个suite的开始和结束动作即可。

最后,我们用过Import引入上一章节定义好的resource文件,使接下来的测试用例可以调用resource中所引入的库。

2.2.2 Test Case01 – 验证空白文本框

分析用例代码之前,我们先来看一下RIDE的优点。使用RIDE最大的好处在于:

第一可以第一时间知道编写的代码是否正确,因为RIDE 可以自动将合法的内置关键字标为蓝色粗体,参数使用正常的黑色字体,变量使用正常的绿色字体,而且绝大多数情况下不需要担心大小写和参数双引号的问题。

第二,如果需要查询某些狗能具体的用法,随时可以按F5,RIDE会弹出帮助文档,其实详细的描述了各种关键字的用法,并且支持模糊查询功能。例如,想知道如何判断2个对象是否相等,就可以在F5中直接搜索equal,所有和equal有关的关键字及其使用方法,参数都会显示出来,不必再去网页或者帮助文档中查看。

image

再看代码

image

a. 用Click link关键字实现 ***点击链接 ***的操作,后面的Try it free就是链接的文字

b. Set SeleniumImplicit Wait, 设置隐式等待时间

c. Click button关键字,实现 点击按钮 的操作,后面id=trial-button是button这个网页元素的定位值(locator),相当于python代码的driver.getElementbyID(“trial-button”). 这里可以看到,RIDE本身不关注双引号,再也不用担心整篇代码有有没有中文格式的双引号所引起的代码错误。Buttonas

d. 接下来,使用${}设置了4个变量用于存放网页上的错误提示信息,提示信息的提取使用gettext关键字,locator使用ID。之后,使用关键字Should be equal as Strings来判断关键字后面的2个参数- 每个变量所存放的信息及期待值(Thisfield is required)是否一致。

e. 最后,在所有步骤完成后使用关键字Take screenshot来截取关键截图,并命名为information_error

总结用例一中所用到的操作方法:

链接的定位及点击,button的定位及点击,变量赋值,Strings对比及最后的截图。

2.2.3 Test Case02 – Email地址验证

在用例二中,我们来看一下RF中的循环是如何使用的,使大家对 多数据验证同一功能点的方式有一个认识。

image

首先,语法与Python的变成代码类似,使用 For i IN Range的形式实现。@{invalid_email}是之前在资源文件中定义好的非法email地址列表。用 ${i} 遍历地址列表,每一次遍历都进行如下操作:

a. 取出列表中的值,使用Input text关键字输入到email地址栏

b. 使用set focus toelement实现光标焦点移到其他元素,触发地址栏对输入地址的验证

c. 通过get text关键字取出email地址的错误提示并存放于${errormsg}变量。

d. 在log文件中,记录每次迭代的非法Email地址以及错误信息

总结用例二中所用的到操作方法:

For 循环;输入文本关键字;Log记录关键字

2.2.4 Test Case03 – 下拉列表值校验

在用例三中我们继续使用循环来验证下拉列表值是否与期待值一致。

image

首先,使用get list items关键字取出下拉列表中所有的值,并存放于自定义的列表变量@{drop_down_value}中。

其次,使用for 循环,遍历下拉列表中每一个值,并进行下列操作:

a. 使用log关键字记录当前遍历列表值

b. 使用list should containvalue关键字。通过语义可以理解为此关键字用于验证给定列表中是否包含待测值,这里我们来判断在resource中定义的列表变量@{channel}是否包含每个遍历到的下拉列表值。

需要注意的是,尽管在resource中定义的列表变量是@{}形式,但是RF在所有列表相关的比较及操作关键字中,如果列表作为参数,就一定要将@改写为$,否则会发生运行错误。

c. 最后我们使用#注释掉一句代码# lists should be equal.此关键字的作用是比较给定的2个列表是否从长度到顺序都一致。在实际项目中,可以根据不同的需求进行选择。

2.2.5 Test Case04 – 空白文本框错误隐藏及注册成功

最后,在用例四中我们主要关注下面几个关键字的使用:

image

a. 关键字 select from listby index. 此关键字实现了通过索引编号(从0开始)来选择下拉列表的值,2个参数,第一个是locator, 第二个为索引值。

b. 关键字 title should be. 此关键字用来判断页面的title值是否满足给定期待值。

c. 关键字 page shouldcontain. 此关键字会遍历页面上所有的信息,并判断是否包含给定的期待值。

2.3 总结

至此,本次实例中对于代码的分析到此结束,再次总结一下使用RFS+RIDE编写测试代码的优势:

a. 关键字驱动,将底层操作代码封装,对于用户来说只需要使用与自然语言极为相似的关键字便可以编写自动化操作代码。

b. 关键字查询的便利,按F5便可以模糊查询各种关键字的用法。

c. 合法关键字的加粗高亮,大小写不敏感,不用写引号。

最后,如果要说RF有没有缺点的话,个人认为是环境的搭建特别是对MAC系统搭建环境不是很友好。大家如果看到这里,对于RF的兴趣依旧存在并想自己搭建RFS环境进行实践,请关注本系列最后一篇,RobotFrameWork测试环境搭建。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,752评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,100评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,244评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,099评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,210评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,307评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,346评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,133评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,546评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,849评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,019评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,702评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,331评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,030评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,260评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,871评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,898评论 2 351

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,644评论 18 139
  • .bat脚本基本命令语法 目录 批处理的常见命令(未列举的命令还比较多,请查阅帮助信息) 1、REM 和 :: 2...
    庆庆庆庆庆阅读 8,077评论 1 19
  • 写在前面的话 自动化测试是什么时候开始火的?已经记不清了,只记得08年毕业的时候,QTP和load runner就...
    GangGor阅读 5,292评论 0 7
  • 写在前面 导航栏是我们开发中经常遇见的一个控件,我们大概都明白它的工作机制等等,以前用的是同事之前封装好的一个基类...
    劉光軍_MVP阅读 1,002评论 2 9
  • 所有的自作多情都是自取其辱 为什么爱得如此惨痛?因为爱,因为想赢得爱,维系爱,一个人就得低到尘埃?就不能同时成为彼...
    世涂花开阅读 546评论 2 0