[翻译]-马丁·福勒-page对象

译者注:这篇文章翻译自马丁·福勒(Martin Flower,对,没错,就是软件教父)官网的一篇文章,原文出处在文底。如果你正在做WEB自动化测试,那么我强烈推荐你看这篇文章。另外透露Martin Flower将于10月份左右来成都ThoughtWorks办公室,大家有机会一睹他的风采。

当你在为web页面编写测试时,你需要操作该web页面上的元素来点击链接或确定显示的内容。然后,如果你在测试代码中直接操作html元素,那么你的代码是机器脆弱的,因为UI会经常变动。一个page对象可以封装一个html页面或部分页面,通过提供的应用程序特定的API,你可以操作页面元素而不需要在HTML中四处搜寻。

page对象的一个基本的经验法则是page对象应该允许软件客户端能够做任何人类能做的事。它也应当提供一个易于编程的接口,并隐藏窗口中低层的部件。所以访问一个文本框,可以通过一个访问方法获取一个字符串,复选框应当使用布尔值,按钮应当被表示为行为导向的方法名。page对象应当封装所有的在gui控件本身上查找和操作数据的方法。一个好的经验法则是即使改变具体的控制,这种情况下page对象接口不应当发生变化。

尽管该术语是”页面“对象,并不意味着给每个页面都要建立一个这样的对象,但页面有重要意义的元素除外[1]。所以一个显示多个相册的页面可以有一个相册列表的page对象,里面包含了几个相册page对象。也有可能会有一个页眉page对象及一个页脚page对象。经验法则是给通过给页面建模,从而对应用程序的使用者变得有意义。

同样,如果你导航到另一个页面,初始page对象应当返回另一个page对象作为新页面[2]。一般page对象的操作应当返回 基本类型(字符串,日期)或另一个page对象。

有一个意见分歧的地方是page对象是由应当包含自身的断言,或者仅仅提供数据给测试脚本来设置断言。在page对象中包含断言的倡导者认为这有助于避免在测试脚本中出现重复的断言,可以更容易的提供更好的错误信息,并且提供更接近TellDontAsk风格的API。不在page对象中包含断言的倡导者则认为包含断言会混合使用断言逻辑访问页面数据的职责,并且导致page对象过于臃肿。

我赞成在page对象中不包含断言。我认为你可以通过为常用的断言提供断言库的方式来消除重复。这可可以提供更好的诊断。[3]

page对象通常用于测试中,但自身不应包含断言。它们的职责是提供对基本页面状态的访问。而与测试客户端实现断言逻辑。

我所描述的这个模式针对HTML,但同样的模式也同样适用于任何UI技术。我见过这种模式有效的隐藏了Java swing UI的细节,并且我深信它已经被广泛的应用于几乎所有其他的UI框架。

并行问题是另一个page对象可以封转的话题。这可能涉及异步操作中隐藏不作为异步呈现给用户的异步性。也有可能涉及封装UI框架中你不得不担心的UI和工作线程之间分配行为的线程问题。

page对象在测试中的使用非常常见,但是也被用于在应用程序上层提供一个脚本接口。最好将脚本接口置于UI下层,这样脚本通常不复杂并且执行速度快。然而应用程序在UI层有太多的行为,那么使用page对象可能在槽糕的工作中最好的选择。(但是尽量将逻辑移入page object,长期来看会导致更好的脚本即更健康的UI。)

使用一些领域特定语言来书写测试非常普遍,比如Cucumber或一门内部DSL。如果你尽量在page对象层级之上编写测试DSL,那么你可以通过一个解析器将DSL声明转换为调用page对象。

如果你在测试方法中使用了WebDriver API,那么你做错了 – Simon Stewart.

模式有助于将逻辑从页面元素中剥离(例如 Presentation Model, Supervising Controller, 及Passive View),从而少通过UI做测试,并且减少对page对象的需要。

page对象是封转的一个典型示例。它们从其它组件(如测试)部件中隐藏了UI结构的细节。。如果你自问“我如何能从软件测试中隐藏细节?”,当你做开发时在这样的情况采用page对象不失于一个好的设计原则。封转体现了两方面的好处。我已经强调,通过将操作UI的逻辑限制到单个地方有助于你修改逻辑而不影响系统的其他组件。一个间接的好处是使测试端代码更容易理解,因为逻辑是关于测试的意图,而会被UI细节搞乱。

进一步阅读

I first described this pattern under the name Window Driver. However since then the term “page object” was popularized by the Selenium web testing framework and that’s become the generally used name.

我刚开始将这种模式命名为窗口驱动(Window Driver)。然而自从Selenium web测试框架使用“page object”这个名称,page对象变成了常用的名称。

Selenium的维基强烈推荐使用page对象,并提供了如果使用的建议。它也赞成page对象不包含断言。

致谢

Perryn Fowler, Pete Hodgson及Simon Stewart为这篇博客的草稿提供了及其有用的意见。同样像往常一样我非常感激ThoughtWorks软件开发列表中的各种各样的居民提供的建议和修正。

脚注

  1. 有观点认为”page对象“名称是一个误导。因为它让你认为一个页面只能有一个page对象。类似面板对象可能会更好,但是page对象已经被广泛接受。为什么命名的另一个例证是TwoHardThings中的其中之一。
  2. page对象负责创建其他的page对象(比如导航)是共同的意见。然而,一些从业者更喜欢page对象返回一些通用的浏览器上下文,通过建立在上下文上层的page对象的测试控制是基于测试的流程(特别是条件流).
    他们偏好基于测试脚本知道那个页面是期待的下个页面这一事实,并且该知识不需要在page对象之间重复。特别是使用静态类型语言通常以类型标记的方式显示页面导航,这样会增加他们的喜好。
  3. page对象中包含断言也行,尽管大多数人(比如我)更青睐无断言风格。这些断言可以检查页面或应用程序在此时此刻的不变量,而不是测试探索的具体东西。

本文出处: http://martinfowler.com/bliki/PageObject.html

时间: 2024-08-03 21:20:30

[翻译]-马丁·福勒-page对象的相关文章

Martin Fowler对将page对象用于Web测试的基本经验法则

本文源自Martin Fowler,文章最初由ThoughtWorks工程师黄博文翻译在自己的博客上,并由译者本人推荐至InfoQ中文站博文共赏专栏.本译文在Martin Fowler本人的许可下,由InfoQ中文站进行修订后,在这里给大家分享. 当你在为Web页面编写测试时,你需要操作该Web页面上的元素来点击链接或验证显示的内容.然而,如果你在测试代码中直接操作HTML元素,那么你的代码是及其脆弱的,因为UI会经常变动.一个page对象可以封装一个HTML页面或部分页面,你可以通过提供的应用

JSP page对象

JSP内置对象--page对象 一.page对象:是指指向当前JSP页面本身,有点像类中的this指针,它是java.long.Object类的实例. 二.常用方法如下:主要是Object类中声明的方法 class getClass() 返回此Object的类 int hashCode() 返回此Object的hash码 boolean equals(Object obj) 判断Object是否与指导的Object对象相等 void copy(Object obj)把此Object拷贝到指定的O

basic4android 开发教程翻译(七)Basic4android中的对象和类型

类型 Basic4android的类型系统是直接从Java的类型系统中派生的. 有两种类型的变量: 基本类型 and 非基本类型. 基本类型包括数字类型: Byte, Short, Int, Long, Float 和 Double. 基本类型也包括: Boolean 和 Char. 类型及范围列表: http://www.basic4ppc.com/forum/basic...html#post45511 但函数调用或者赋值时,基本类型总是直接把值传递过去. 例如: Code: Sub S1 

《精通QTP——自动化测试技术领航》—第1章1.5节QTP精华—对象库(上)之基础攻略篇

1.5 QTP精华-对象库(上)之基础攻略篇 精通QTP--自动化测试技术领航 阶段要点 初步了解QTP中的测试对象模型. 明确Object Identification是管理对象模型的长官. 掌握智能识别原理.机制和各项设置. 对象库基本操作之添加.更新.对象闪烁.副对象库(Associate Repositorys). 一个有趣的实验证明,做项目时手工添加对象的好处与效率. Export Local Objects与Export and Replace Local Objects. 掌握并熟

JSP九大内置对象

版权声明:本文为博主原创文章,转载注明出处http://blog.csdn.net/u013142781 目录(?)[+] 虽然现在基本上使用SpringMVC+AJAX进行开发了Java Web了,但是还是很有必要了解一下JSP的九大内置对象的.像request.response.session这些对象,即便使用其他框架也是会经常用到的.因此十分有了解的必要. 这些对象可以在JSP页面中调用,而不需要事先定义,这使得JSP编程更加的方便和快捷.其实这些内置对象都对应着某个Servlet类,在J

JSP的九个隐式对象

JSP使用脚本元素作为一种简易方法在模板数据中嵌入java代码,这些脚本元素在JSP翻译成Servlet的阶段,都被转化为Servlet中的java代码. JSP引擎在调用JSP对应的_jspServlet时,会传递或创建9个与web开发相关的对象供_jspServlet使用.JSP技术的设计者为便于开发人员在编写JSP页面时获得这些web对象的引用,特意定义了9个相应的变量,开发人员在JSP页面中通过这些变量就可以快速获得这9大对象的引用. JSP翻译成Servlet代码都存在有: 1 pub

在ASP.NET中创建自定义配置节(翻译)

asp.net|创建|asp.net 一.介绍 ASP.NET Web应用程序用一种内置的方法访问简单的"键/值"配置数据.在Web.config文件中,你可以创建节来存储简单的"键/值"对.例如,新建一个ASP.NET项目,在Web.config文件中添加如下的标记作为元素的子标记: 该节包含了用两个标记定义的"键/值"对,你可以通过Page对象内置的ConfigurationSettings属性获得它们的值.作为开始,在你的项目中新建一个名为

JSP内建对象

js|对象 ① out - javax.servlet.jsp.jspWriter   out对象用于把结果输出到网页上. 方法:1. void clear() ;   清除输出缓冲区的内容,但是不输出到客户端. 2. void clearBuffer() ;   清除输出缓冲区的内容,并输出到客户端. 3. void close() ;   关闭输出流,清除所有内容. 4. void flush() ;   输出缓冲区里面的数据. 5. int getBufferSize() ;   获取以k

JSP的九个隐含对象

js|对象 一.page 对象     page对象代表JSP本身,更准确地说它代表JSP被转译后的Servlet,它可以调用Servlet类所定义的方法.     二.config 对象     config 对象里存放着一些Servlet 初始的数据结构.    config 对象实现于javax.servlet.ServletConfig 接口,它共有下列四种方法:        public String getInitParameter(name)        public java