电子印章系统需要进行自动化测试功能,且需要一种易于开发、维护、使用的自动化测试工具。Sahi pro版本相比开源版本已经自带excelframework,既直接通过excel文件执行自动化测试用例。
目标1:普通测试员通过编写excel测试模板,生成自动化测试用例,直接执行自动化测试用例,实现自动化测试。
目标2:测试开发员可以灵活的修改、扩展、完善自动化测试框架。
目标3:测试开发员可以所见即所得、高效、快速的编写完善自动化测试框架。
本版本设计开发必须遵循JavaScript和Sahi脚本的开发规范。
测试框架由四层架构组成:sahiproexcelframework,业务逻辑层,页面对象库,基础控件库。
Sahiproexcelframework:将测试步骤(关键字)和测试数据直接保存在excel里,实现数据与脚本分离。由于excelframework需要调用方法而不是对象,所以需要一个中间层做把业务逻辑层的对象转换成方法。
业务逻辑层:可以在这里编写可重用的方法,这些方法中执行模拟手工测试的功能。该层的方法可以被测试用例调用。
页面对象库:用来获取、存储页面对象。每个页面对象也许包含多个控件对象,该层对象可以被业务逻辑层调用。
基础控件库:封装基础的页面控件对象。对于操作复杂的页面控件再进行封装以方便使用,该层对象可以被页面对象库调用。
图1. 测试框架图
Excel模板作为描述自动化测试用例、测试步骤、测试数据的载体,严格按照模板编写将会避免很多可能出现的错误。脚本在执行的时候默认读取Excel模板里的sheet1内的数据,按照从上到下的顺序逐行执行关键字对应的脚本。所以可以在excel里新建其他sheet,但是不要修改sheet1的名字或删除sheet1,否则会导致无法执行脚本。
Excel模板里的每一行代表一个测试步骤,多行可以组成一个测试用例。
现对sheet1内的数据列的含义和使用做如下说明:
Comments(描述):该列可以录入对该测试步骤的描述用来标记这一步骤,该列可以为空。
Tags(标签):该列可以用标签对测试用例进行标记,在执行脚本时可有选择性的执行用例。所以仅在测试用例第一个测试步骤上些标签。如脚本执行时只执行smoke标签的用例,没有用标签标记的用例便不会执行。
TestCase(测试用例):该列可以录入测试用例名用来标记测试用例,由于多个步骤组成一个测试用例,无需再每一行都写测试用例名,仅在第一个测试步骤上写测试用例名,否则框架会认为每一行都是一个测试用例。
KeyWord(关键字):该列为必填项,框架根据该列的关键字进行脚本执行。所以关键字必须填写正确,具体可以参考excel模板里“api说明”的sheet页。
argumentN:关键字后面对应的是输入参数,也就是测试数据,具体关键字对应的参数含义可以参考excel模板里“api说明”的sheet页。
基于excel模板的脚本执行方法有两个,一个是在页面用sahi控制器执行excel模板的xlsx文件,具体操作可以参考sahi官网上的使用文档(http://sahipro.com/docs/using-sahi/sahi-controller.html#Playback Tab)。
另一种方法是通过testrunner来执行,具体操作可以参考sahi官网上的使用文档(http://sahipro.com/docs/using-sahi/playback-desktop.html#Playback via testrunner)。
由于脚本的高度开放性,该框架也是可以进行修改和扩展的。基于已有的基础控件库、页面对象库对业务逻辑层进行扩展,新增、修改业务逻辑层相关的业务逻辑,达到快速开发的目的。当基础控件库或者页面对象库中没有需要的控件或者对象时,可以自行添加需要的基础控件或者页面对象。
目前框架包括的文件有:
1.xxx.xlsx–excel模板,用来编写测试步骤、用例,输入测试数据。
2.apis.sah–sahi脚本api注释文件,放在编程目录下时可给出代码自动补全(非必需)。
3.baseWidget.sah–基础控件库,可自行添加基础控件,且尽可能遵循所见即所得的原则封装基础控件。比如一个按钮控件,可以这样写:
//button控件
var $Button = function Button($elem) {
var $button
if (_isVisible(_button("/.*" + $elem + ".*/"))) {
$button = _button("/.*" + $elem + ".*/")
} else if (_isVisible(_span("/.*" + $elem + ".*/"))) {
$button = _span("/.*" + $elem + ".*/")
} else {
visibleWidget($button)
}
this.click = function () {
if ($button != null) {
_click($button)
}
}
}
4.Pages.sah–页面对象库,可自行添加页面对象。比如一个查询页面,可以这样写:
//查询印章界面
function queryPage () {
this.$SdateS = new $Datebox(0, "从")
this.$SdateE = new $Datebox(1, "从")
this.$mediaNo = new $Textbox("介质编号")
this.$queryBtn = new $Button("查询")
this.$readBtn = new $Button("读取")
this.$SApp = new $ComboBox("印章应用")
this.$SState = new $ComboBox("印章状态")
this.$CName = new $Textbox("证书名称")
this.$SName = new $Textbox("印章名称")
this.$CTNo = new $Textbox("证书信任服务号")
this.$record = new $Record("listtable")
}
5.SealManageTasks.sah–业务逻辑层,目前仅包含印章管理的新增、更新、注销、续期、查询相关逻辑。可自行扩展和修改业务逻辑。比如一个查询的操作,可以这样写:
function SealManager() {
//查询印章
this.query = function ($CNameStr, $SNameStr, $SStateStr, $SAppStr, $mediaNoStr, $CTNoStr, $SdateSStr, $SdateEStr, $Rows, $RecordsCount) {
var $page = new queryPage()
$page.$CName.setValue($CNameStr)
$page.$SName.setValue($SNameStr)
if ($page.$CTNo.getValue() != null && $page.$CTNo.getValue() != "") {
$CTNo.setValue($CTNoStr)
} else {
readCTNo($page.$readBtn, $page.$CTNo)
}
$page.$mediaNo.setValue($mediaNoStr)
$page.$SdateS.setValue($SdateSStr)
$page.$SdateE.setValue($SdateEStr)
$page.$SState.select($SStateStr)
$page.$SApp.select($SAppStr)
$page.$queryBtn.click()
$recordCount = $page.$record.getRecordsCount()
_log("查询到" + $recordCount + "条记录")
assertQuery($Rows, $RecordsCount)
}
}
6.SealManageTests.sah–框架中间层,将业务逻辑层的行为封装成excelframework可识别的函数。比如一个查询印章的函数,可以这样写:
//查询印章
function querySeal($CNameStr, $SNameStr, $SStateStr, $SAppStr, $mediaNoStr, $CTNoStr, $SdateSStr, $SdateEStr, $Rows, $RecordsCount) {
new SealManager.query($CNameStr, $SNameStr, $SStateStr, $SAppStr, $mediaNoStr, $CTNoStr, $SdateSStr, $SdateEStr, $Rows, $RecordsCount)
}