You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 14:45:03