|
近日,在用java编写基于selenium的web自动化测试用例时,遇到下述情况。
如上图,是一个由多个tab构成的对话框,每个tab下有对应的属性内容。用户填写相关的内容后点击启动,就可以生成具有一定属性的虚拟机。现在,需要将这个操作提取成为一个公共的类,以供不同的测试场景使用,用来构成不同属性组合的虚拟机的测试用例。
至于需要什么属性的虚拟机,汀决于不同测试场景的不同需求。有的场景可能只需要一个名称属性的虚拟机;有的可能需要两到三个属性的虚拟机;有的可能需铱属性的虚拟机等等。不确定的多种组合,让编写这个公共类有了一定难度。
在考察了多种Java设计模式后,感觉“装饰者模式”较为适合目前这种情况。于是,参考该模式,设计了如下程序架构。
其中类的职责如下:
抽象构件角色(CreateVM):给出一个接口,以规范准备接收附加责任的对象。
具体构件角色(DoprepareWork):这个类用来做启动到这个多tab对话框的操作。
装饰角色(LaunchVM):持有一个构件对象的实例,并定义一个与抽象构件接口一致的接口。
具体装饰角色(TabDetail、TabVisitAndSec、TabVolume等):就是每个具体的tab。
实现代码如下:- /**
- * Created with IntelliJ IDEA.
- * User: whu
- * Date: 12-12-12
- * Time: 上午10:24
- */
- public interface CreateVM {
- public void Operation();
- }
复制代码- public class DoPrepareWork implements CreateVM {
- //编码
- @Override
- public void Operation() {
- /*
- * 启动到该对话框的步骤
- */
- }
复制代码- /**
- * Created with IntelliJ IDEA.
- * User: whu
- * Date: 12-12-12
- * Time: 下午5:08
- */
- public class LaunchVM implements CreateVM {
- //编码
- @Override
- public void Operation() {
- composeTab();
- }
- public void composeTab() {
- createVM.Operation();
- doSelfCompose();
- }
- public void doSelfCompose() {
- }
- }
复制代码- /**
- * Created with IntelliJ IDEA.
- * User: whu
- * Date: 12-12-12
- * Time: 下午12:37
- */
- public class TabDetails extends LaunchVM {
- //编码
- /*
- 覆写父类方法
- */
- public void doSelfCompose() {
- selenium.click(TAB_NAME); //点击“详细信息”标签
- selenium.type(SERVER_NAME_ID, this.SERVER_NAME);//输入传入的服务器名称,可由构造方法初始化
- …… //其它操作
- }
- }
复制代码 使用方法:
要在具体测试用例中使用这个公共类,测试人员编写测试用例时,只需要几行代码就可以定制出他所需要的组合的情况。例如,假设某一测试场景需要用到第一(详细信息)和第三个(卷选项)Tab属性的虚拟机,其实现步骤如下:- CreateVM dpw = new DoPrepareWork(参数);
- CreateVM tds = new TabDetails(dpw, 其它参数);
- CreateVM tvo = new TabVolumeOption(tds, 其它参数);
- Tvo.Operation();
复制代码 由此可见,要创建一个具有第一(详细信息)和第三个(卷选项)Tab属性的虚拟机,编码人员只需四行代码即可完成。哪怕士Tab属性都需要,也不过七行代码而已。不再需要像流水账一样,使用诸如selenium.click(),selenium.type()等这样的函数,点到第一个tab、填写内容,再点到第二个Tab、填写内容。。。。。。
使用这个公共类,编码人员可以任意顺序的构造需要用到的属性的虚拟机。组合起来相当灵活。 |
|