Page Object Model自动化测试中如何优化页面对象的创建方式?
问题解答
当前做法的合理性评估
你的实现方式在项目初期页面数量少、测试场景简单的阶段是完全合理的,逻辑直观易懂,没有额外的封装复杂度,适合团队快速上手编写用例。但随着页面数量持续增长,这种写法确实会暴露明显的问题:
- 所有页面全量初始化,哪怕当前测试用例只用到1-2个页面,会造成不必要的性能开销
- 每新增一个页面就要手动修改测试类的变量声明和初始化逻辑,违反开闭原则,维护成本高
- 测试类中存在大量页面对象声明,代码冗余臃肿,可读性下降
优化方案
1. 懒加载+泛型封装统一获取入口
可以在父类TestBase中封装通用的页面对象获取方法,只有调用时才初始化对应页面,不用提前声明所有页面变量:
public class TestBase { private Map<Class<?>, Object> pageCache = new HashMap<>(); @SuppressWarnings("unchecked") public <T> T getPage(Class<T> pageClass) { if (pageCache.containsKey(pageClass)) { return (T) pageCache.get(pageClass); } try { T pageInstance = pageClass.getConstructor(TestBase.class).newInstance(this); pageCache.put(pageClass, pageInstance); return pageInstance; } catch (Exception e) { throw new RuntimeException("页面对象初始化失败", e); } } }
优化后测试类不需要提前声明和初始化所有页面,用到对应页面时直接调用即可:
public class Test1 extends TestBase { @Test public void firstTest() { getPage(Page1.class).inputAccount("xxx"); getPage(Page2.class).submitOrder(); } }
2. 结合依赖注入能力简化初始化
如果你的项目已经引入了依赖注入框架,或者使用的自动化测试框架自带页面对象注入能力(比如Selenide的@Page注解、Appium的PageFactory工具),可以直接用注解标记页面对象,框架会自动完成初始化,不需要手动写new的逻辑。
3. 按场景拆分测试类
不要把所有场景的测试用例都堆在同一个测试类中,按业务领域拆分测试类,比如登录相关测试只需要初始化登录、首页等关联页面,订单相关测试只需要初始化订单、支付等关联页面,从源头减少单个测试类需要维护的页面对象数量。
内容的提问来源于stack exchange,提问作者Kitty Raj
相关产品推荐
相关产品推荐

