app UI自动化框架改进----使用pa设计模式抽离页面元素
2017-08-27 10:58
411 查看
之前写过一个基于robotium+androidjunitrunner+spoon的自动化框架,详见:基于junit4+Robotium+spoon+as二次开发自动化框架,支持失败重试和失败截图,但是呢最近和 @安静的偏执 聊了一会儿发现写的还是有些瑕疵的,并给了我些建议,是关于在UI自动化中如何更好的抽离封装元素。
为了对比,我们来对比一下改进前后的效果:
ok,那么显然改进后的写法看着更加简介,并且抽象程度更高。那么第一种写法就是今天的主角,pageobject设计模式,具体的解释可以看下文档:
https://github.com/SeleniumHQ/selenium/wiki/PageObjects
那么总结下来一句话就是:
把模块里面的元素和动作封装在一个page类里面,把业务和基本元素和操作相分离,在业务改变的时候只需要维护page类就行了。
然后我们回到上面的例子,在以前的写法,笔者是抽象出id,于是定义了一个IdFetch的类,用来抽象id,这样后续修改后只需要修改id:
然后改进后的page页面,通过把控件和一些动作封装进一个page页面,这里有一个基类BasePage,它的作用主要是通过反射处理我自定义的java anotation,毕竟@UI这个方式找控件是比较优雅的。
那么引入了PageObject设计模式之后,目录结构也重新设计了下:
为了对比,我们来对比一下改进前后的效果:
目录对比:
写法对比:
@Test public void takeCamera(){ mainPage.clickTocamera(); viewAssertions.asseetViewExist(cameraPage.camera); cameraPage.snapShot(); }
@Test public void takeCamera() { holo.clickOnView(holo.getView(IdFetcher.MainActivity.camera_tab)); holo.assertViewExist(R.id.camera); holo.clickOnView(holo.getView(IdFetcher.MainActivity.take_camera)); }
ok,那么显然改进后的写法看着更加简介,并且抽象程度更高。那么第一种写法就是今天的主角,pageobject设计模式,具体的解释可以看下文档:
https://github.com/SeleniumHQ/selenium/wiki/PageObjects
那么总结下来一句话就是:
把模块里面的元素和动作封装在一个page类里面,把业务和基本元素和操作相分离,在业务改变的时候只需要维护page类就行了。
然后我们回到上面的例子,在以前的写法,笔者是抽象出id,于是定义了一个IdFetch的类,用来抽象id,这样后续修改后只需要修改id:
public class IdFetcher{ public class MainActivity(){ //伪代码 public int camera_tab = R.id.camera_tab; } }
然后改进后的page页面,通过把控件和一些动作封装进一个page页面,这里有一个基类BasePage,它的作用主要是通过反射处理我自定义的java anotation,毕竟@UI这个方式找控件是比较优雅的。
public class MainPage extends BasePage { ViewActions ViewActions; public MainPage(Holo holo) { super(holo); ViewActions = new ViewActions(holo); } @UI(id=R.id.camera_tab) public View camera_tab; public void clickTocamera(){ ViewActions.click(camera_tab); } }
那么引入了PageObject设计模式之后,目录结构也重新设计了下:
总结
那么到这里,改造就结束了,核心的东西应该都讲到了,源码暂时不公开 :) 欢迎交流,并且最后再次感谢下 @安静的偏执 告诉我po这个很棒的模式。相关文章推荐
- 从Java的角度理解设计模式2:自动化重构工具的使用
- JavaServer Faces框架使用的设计模式
- JUnit的框架设计及其使用的设计模式
- 使用脚本设计自动化测试框架的原则
- JUnit的框架设计及其使用的设计模式
- 【自然框架】——页面基类与设计模式(一)桥接模式
- JUnit的框架设计及其使用的设计模式
- 使用JS获取页面元素(不使用框架)
- 使用XML,Spring,和struts以MVC为设计模式的分布式应用程序框架
- 设计模式:模板模式在Flex框架中的使用及原因分析
- 设计模式中的迭代器模式在Cocoa Touch框架中的使用
- JavaServer Faces框架使用的设计模式
- 使用Micrisoft.net设计方案 第三章Web表示模式 Web模式集群详细介绍 PageController(页面控制器)
- JUnit的框架设计及其使用的设计模式 .
- 【自然框架】——页面基类与设计模式(二) 模板模式
- 使用Micrisoft.net设计方案 第三章Web表示模式 Web模式集群详细介绍 Page Cache(页面缓存)
- JUnit的框架设计及其使用的设计模式(精)
- JAVA_WEB Struts2学习:使用验证框架进行校验JSP页面元素 反编译工具的配置 Strtuts2 国际化学习
- 使用设计模式实现Undo,Redo框架
- ZZ: 使用 "接口" 了解设计模式--策略模式(多态)集合框架 泛型、文件、文件流 IO(流)