Software Testing - UI自动化测试常用设计模式之原型(Java)

分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击人工智能教程

原型模式是一个很简单的模式,它适用于我们要复制一个对象的时候。 那在 UI 自动化中,有什么场景需要我们复制一个对象呢。 以我们产品为例,在执行测试的时候,一个 DAG 中会出现两个相同的算子, 比如一般会有两个特征抽取算子,一个连接训练数据,一个连接测试数据。 但他们两个的配置是相同的 (在机器学习中,如果这俩哥们不一样,就出问题了)。 那么问题来了, 我们看要设置一个特征抽取算子都需要哪些参数。

这样就很烦了,我要手动创建两个 FENode 的对象,把完全相同的参数 set 进去。也许有小伙伴会说你可以就用一个 FENode 作为参数,重复利用么。 这也是不行的, 虽然他们的配置相同,但是有一样是不同的。 那就是在 UI 上搜寻控件的方式。 由于这是两个完全一样的算子,他们拥有相同的文案,相同的控件。唯一能区分他们的方式就是在 DOM 树中他们的下标 [index]。 所以在每个 Node 里都会有一个额外的属性叫 index,表明他们在 UI 上是第几个同类算子。 如下:

所以如果我们重复使用一个 FENode,你会发现你操作的还是同一个 FE。 所以这时候我们希望能有一个 clone 方法, 能够帮我们创造出一个新的对象的同时,还拥有原始对象中一样的属性。 这在 java 中比较容易实现。 在 java 中 object 有 clone 方法,而所有对象都是集成 object 的。 所以我们只需要实现一个名字叫 Cloneable 的空接口,标记本类是可以 clone 的,就可以直接调用 object 的 clone 来完成复制对象的目的了。 如下:

看上面我们直接调用了 object 的 clone 来复制对象, 然后让 index 属性自增 1。这样就满足了我们的需要。

原型模式在 UI 自动化中常见的场景都是类似这种,我们要在 UI 上做很多相似的 UI 操作, 这些操作需要传递很多配置。 这些配置大多数是相同的,但是有一小部分是不同的。而我们又不能直接通过不停的改变一个对象的属性来完成这项任务 (因为之后还要使用这些对象做其他操作)。 所以需要原型模式出马。比如我们要在项目中导入很多数据。 这些数据的导入方式是差不多的,比如格式,数据源等等, 可能只有数据的路径和名字不一样。 当然我们也可以只使用一个对象,引入一个数据后,立马改变这个对象的数据路径和名字,去引入下一个对象。 这样做也是可以的,但是这样做的坏处是你之后就不能使用这个对象操作之前的那些数据了。 比如我们引入数据后需要等待数据引入结束, 但是你的当前对象的名字和都变成最后一次操作的配置了。 你已经失去了跟踪之前的数据导入的能力了。 所以这时候原型模式就很有用了, 迅速为你 clone 出一个符合你需求的对象使用。

PS:上面讲的使用 object 的 clone 的方式都是浅拷贝, 什么是浅拷贝呢? 比如我们对象中的属性如果有引用类型,例如 list,map 或者另一个对象。 这时候是不会复制一个新的,而是直接把这些引用类型属性的引用地址复制过来。也就是说,虽然外层对象已经是新的了,但是里面的引用属性使用的还是一个对象。 而如果是深拷贝的话,它是会把引入类型也 clone 一份出来。 当然如果要实现深拷贝,那就需要我们自己编写逻辑了。 但是大多数情况下浅拷贝是可以满足我们的需求的。 例如上面的关于特征抽取算子的例子,不一样地方只是一个 int 类型的 index。 所以这时候浅拷贝完全够用。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值