自动化测试(11) | Selenium Java 设计模式

WebDriver 设计模式

欢迎阅读WebDriver进阶讲义。本篇讲义将会重点介绍Selenium WebDriver 自动化框架的设计,着重使用Page Object设计模式,以及使用HTML测试报告和集成测试报告并自动发送邮件。

Page Object 设计模式

在讨论设计模式之前,我们首先接着上一个讲义,来讨论自动化测试框架。

什么是框架?

框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种定义认为,框架是可被应用开发者定制的应用骨架。前者是从应用方面而后者是从目的方面给出的定义。可以说,一个框架是一个可复用的设计构件,它规定了应用的体系结构,阐明了整个设计、协作构件之间的依赖关系、责任分配和控制流程,表现为一组抽象类以及其实例之间协作的方法,它为构件复用提供了上下文(Context)关系。因此构件库的大规模重用也需要框架。其实目前为止,框架还没有统一定义,我比较喜欢Ralph Johnson所给出的定义:

一个框架是一个可复用设计,它是由一组抽象类及其实例间协作关系来表达的 【Johnson 98】。这个定义是从框架内涵的角度来定义框架的,当然也可以从框架用途的角度来给出框架的定义:一个框架是在一个给定的问题领域内,一个应用程序的一部分设计与实现【Bosch 97】。

为什么要用框架?

又是一个理所当然的问题。因为软件系统发展到今天已经很复杂了,特别是服务器端软件,涉及到的知识,内容,问题太多。在某些方面使用别人成熟的框架,就相当于让别人帮你完成一些基础工作,你只需要集中精力完成系统的业务逻辑设计。而且框架一般是成熟,稳健的,他可以处理系统很多细节问题,比如,事物处理,安全性,数据流控制等问题。还有框架一般都经过很多人使用,所以结构很好,所以扩展性也很好,而且它是不断升级的,你可以直接享受别人升级代码带来的好处。

为什么要搭建自动化测试框架?

从前我以为,自动化测试最重要的事情是找对象(To Find Test Object)。现在我明白了一个道理,没有框架的自动化测试是找不到对象的,即使找到了也不会幸福的。就跟现实中,没有车没有房的人是很难找到对象的一个道理。

自动化测试的开发,通常是由自动化测试的需求决定的。这个需求主要包括:

  • 自动化测试更便于实施。这个说的是,你写测试脚本要方便。一个好的自动化测试框架是可以让不那么懂技术的人也可以写自动化测试脚本的,哼。
  • 解决自动化测试脚本本身存在的问题,如异常处理和场景恢复。
  • 测试易于维护。自动化测试项目,基本都是没有好的管理以及维护,一定是个大坑。我可以很负责地说,自动化测试没有一年半载,你是看不到产出的。所以管理及维护就成了最重要的事情。而好的框架,可以减少你在管理维护中所投入的人力物力精力。
  • 可重用性。框架的意义之一就在于可重用吧。所以在框架里,你可以实现一些通用功能,简化脚本开发过程。
  • 美观易读的测试报告。拿Selenium来说,它产出的测试报告只是基于测试脚本的,并没有那种基于测试集的报告,所以如果你要,测试框架里可以实现。

还有很多测试需求,我没办法一一列举出来,多数需求我们都可以在测试框架里去定制。现在可以回答上面那个问题了,record & playback是不会幸福的,你需要自动化测试框架。

请慎重考虑是否需要自动化测试

自动化测试的特点(成本投入高,风险大)

自动化测试是个很傲娇的东西,它很挑项目。首先项目周期要长,但是需求不会频繁变更;其次系统中多数对象要可以被识别,并且不存在大量第三方插件。而且你要清楚,你不能指望自动化测试去帮你发现新的bug,自动化测试本身是不具备想象力的(相对于手工测试)。它的优势在于反复迭代,它的价值产出在于长期的回归测试,以保证被测产品长期稳定地版本更新。

关于自动化测试的切入点,通常要在完整的系统测试之后才算具备引入自动化测试的基本条件。

目前我所做的自动化测试成功案例,无一不具备良好的管理和优良的测试框架。二者缺一,自动化测试必然成为大坑。填坑的成本,很高。

Page Object 设计原理

Page Object设计模式是Selenium自动化测试项目的最佳设计模式之一,强调测试、逻辑、数据和驱动相互分离。

Page Object模式是Selenium中的一种测试设计模式,主要是将每一个页面设计为一个Class,其中包含页面中需要测试的元素(按钮,输入框,标题等),这样在Selenium测试页面中可以通过调用页面类来获取页面元素,这样巧妙的避免了当页面元素id或者位置变化时,需要改测试页面代码的情况。当页面元素id变化时,只需要更改测试页Class中页面的属性即可。

它的好处如下:

  • 集中管理元素对象
  • 集中管理一个page内的公共方法
  • 后期维护方便

具体 Page Object 对象

  1. 测试用例
  • 使用单元测试框架
  1. 断言(Assert)
  2. 测试执行前后(Before / After)
  3. 测试的组织
  • 分类
  • 优先级(涉及依赖)
  • 自由执行(不需要修改代码)
  1. 测试报告(html / xml)
  • 第三方的 HTML 测试运行器(报表)
  • 外部数据提供测试的依据
  • Java: TestNG(新,灵活,可扩展)、JUnit(单一)
  • Python: unittest
  • 实例化 业务模块,调用业务模块的操作
  1. 业务模块
  • 主要使用 Page Object 设计模式
  • 设计 Common 类
  1. Common1 类
  2. Common2 类
  3. ... 不可靠
  • 设计 Page 类
  1. 功能只在单一的页面
- 分成一个个单一页面
- 页面包括
 1. WebElement 元素定位字符串
 2. 只使用本页面上的方法
  1. 功能出现在所有页面(大多数页面)
- open(url)
- 多个页面有 login
- 多个页面有 logout
- 多个页面有 切换 APP
- 每个页面都有构造方法
 - 传递 driver 到 this.baseDriver
- 抽取到 BasePage
 - 构造方法
 - 每个页面都有的方法
  • 好处
  1. 应对页面的变化,比较容易找到修改的地方
  2. 结构比较标准化,代码维护比较方便
  • 修改Page(普通的或者基类)
1. 修改页面元素定位符
2. 修改业务方法
  • 新增Page
  • 通过 源代码管理工具 查看变化的历史,可以比较明确修改的部分。
  • 测试团队成员上手比较快
  1. 测试程序简单,减少出错的风险
  1. 封装驱动
  • 封装单一的工具,或者多个工具都可以
  • 封装 WebDriver(Selenium)成为 BoxDriver,支持Web UI 自动化测试
  • 封装其他特定工具 成为 DbDriver,支持数据库测试
  • 封装接口测试工具 成为 ServiceDriver,支持集成测试,接口测试
  • 封装 Appium工具 成为 AppDriver,支持移动APP UI自动化测试

Page Object 的对象设计

  1. WebDriver封装

    • 这里是对Selenium的封装,完成封装以后的基本封装代码。
    • 新建 base 包
    • 新建 BoxDriver.java 放置 Selenium类的封装
  2. Page 基类

    • 设计了一个基本的Page类,以便所有的页面进行继承,该类标明了一个sub page类的基本功能和公共的功能。

    • 全局变量: this.baseDriver,让所有的子类都使用的。

      // 基类的变量,所有继承的类,都可以使用
      BoxDriver baseDriver;
      

    • 构造方法:

      • 默认的构造方法,无参数的构造方法

        public BasePage() {
        }
        

      • 传递 driver的构造方法

        public BasePage(BoxDriver driver) {
              this.baseDriver = driver;
        }
        

    • 私有的常量:存放元素的定位符

      private String START_BUTTON_SELECTOR = "s,#start > div";
      private final String EXIT_MENU_TEXT = "l,%s";
      

    • 成员方法:

      • 每个子类都需要的系统功能:

        • open

          public void open(String url) throws InterruptedException {
              this.baseDriver.navigate(url);
              Thread.sleep(2000);
          }
          

      • 所有子类(页面)都具有的业务功能

        • selectApp
        • logout

  3. Sub Pages(s)子类

    • 具体的页面的类,定义了某个具体的页面的功能

    • 必须继承基类

      public class AdminPage extends BasePage {
      }
      

    • 创建构造方法,带driver 参数

      public AdminPage(BoxDriver driver) {
         super(driver);
      }
      

    • 特定页面的业务

    • 使用基类的 this.baseDriver

  4. Tests 类

    • 这部分描述的是具体的测试用例。

    • 声明全局变量

      private BoxDriver baseDriver = null;
      private String baseUrl = null;
      private LoginPage loginPage = null;
      private AdminPage adminPage = null;
      

    • 调用各种页面(pages)

      1. 实例化Page

        this.loginPage = new LoginPage(this.baseDriver);
        this.adminPage = new AdminPage(this.baseDriver);
        

      2. 使用page的对象,调用成员方法

        loginPage.open(this.baseUrl);   
        loginPage.changeLanguage(lang);
        loginPage.login("admin", "123456", true);
        loginPage.selectApp(AppType.Admin);
        adminPage.clickAddMemberButton();
        adminPage.addMemberData(member);
        

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

推荐阅读更多精彩内容