应用查找这一组页面元素的语句selectSuccess = GroupPageElement(xpath ='//*[@id= "success"]/option')就可以定位任意一个下拉列表框内的内容。如果选择“成功”,那么selectSuccess.[ u'成功'].click()就完成了单击,流程测试中的脚本清晰。
同时,在PageObject类中加入了以下3个成员函数。
getTitle():用于获取当前页面的标题,以方便在测试过程进行页面跳转的检测。
switchTo():整合了iframe或者窗口之间的跳转。
acceptAlert():用于接受一些警告交互。
3个成员函数如代码清单2-10所示。
代码清单2-10
除对page-objects的一些修改之外,这里还对Python中标准的unittest框架做了二次封装,以便应用。unittest是Python自带的单元测试框架,作为标准Python中的一个模块,是其他很多类似框架和工具的基础。unittest类似于Java中的JUnit,支持自动化测试,共享的启动、测试脚本的关闭,unittest独立于测试报告框架,提供了测试套件模式。
unittest有以下4个重要概念。
测试固件(test fixture):代表一个或者多个测试准备工作,以及任何相关的初始化工作。例如,建立临时数据源、数据库代理、临时目录,以及启动服务端服务等。
测试用例(test case):一次测试中的最小单元,通过一次输入和一次输出完成测试。unittest提供了一个父类TestCase,该类用于创建测试用例。
测试套件(test suite):测试用例的集合,主要用于将不同测试用例聚合到一起。
测试运行器(test runner):一个执行测试组件,用于将测试结果统一输出给测试者。测试结果可以使用图形界面、文本接口或者一个特殊的返回值显示。
在hi_po的hi_po_unit中,设计了unittest.TestCase的子类HiPOUnit,重写了setUp()和tearDown()方法以完成部分测试固件中的工作;设计了TestCaseWithClass()和TestCaseWithFunc()两个静态方法,提供了按测试类和测试方法添加测试用例到测试套件的途径。具体代码如代码清单2-11所示。
代码清单2-11
从代码中可以看出,重写的setup()已经引入了WebDriver的初始化,重写的tearDown()函数释放了测试执行程过程中占用的一些资源。
站在测试用例的角度看,以上代码包含了执行步骤和输入数据,PageObject模式前面的一些改动都是为了执行步骤而做的。对于输入数据,接下来将通过简单工厂模式,完成数据驱动的开发。简单工厂模式属于创建型模式,又称作静态工厂方法(Static Factory Method)模式,但不属于23种设计模式。
简单工厂模式指由一个工厂对象决定创建哪种产品类的实例。简单工厂模式是工厂模式家族中最简单的一种模式,可以理解为不同工厂模式的一个特殊实现。
在数据驱动部分的设计中,首先设计Param的父类,其他类型的参数文件通过对应的子类实现,当前使用.xls格式,因此由XLS类实现。具体代码如代码清单2-12所示。
代码清单2-12
设计了ParamFactory的工厂类后,通过MAP的key-value形式实现不同参数的调用。具体代码如代码清单2-13所示。
代码清单2-13
这样,当添加一种新的参数类型时,只需要实现对应类型的Param的子类,然后维护ParamFactory中的MAP就可以通过简单工厂模式进行使用,减少代码的整体变动。
当利用XLS类解析Excel参数时,Excel有一个默认格式的约束。
第1行是参数的实际中文意思。
第2行是参数的名称。
第3行及其后面的参数是实际测试过程中的参数。
一行是一条测试用例。
PageObject模式的优越性具体如下。
全部业务逻辑操作用到的同一个页面都会调用同一段代码,可提高测试脚本的复用性。
Object中统一维护测试页面的代码,当发生变更时,直接修改Object的代码即可,无须大面积搜索代码中对应页面元素的代码,可提高代码的可维护性。
PageObject设计模式将页面代码和业务逻辑分开,使业务逻辑代码仅仅表述业务逻辑,从而提高代码的可读性。
2.4.2 自动化测试的ScreenPlay设计模式
已经开发的设计模式有23种之多,自动化测试的设计模式不仅有PageObject设计模式,还有ScreenPlay设计模式。ScreenPlay设计模式也曾被称作Journey模式。ScreenPlay设计模式更好地将SOLID(Single Responsibility,Open Close,Liskov Substitution,Interface Segregation,Dependence Inverse,单一功能、开闭、里氏替换、接口隔离及依赖反转)原则应用到自动化测试中。
图2-8描述了ScreenPlay设计模式,它充分利用了BDD(Behavior Driven Development,行为驱动开发)设计方法。
图2-8 ScreenPlay设计模式
其中,Screen近似等同于PageObject设计模式中的Object,ScreenPlay设计模式的Screen类更小,拥有更精简、更聚焦的Task类,可读性高且继承关系简单。当前ScreenPlay设计模式的测试框架是Serenity BDD,如果读者感兴趣可以深入研究一下。