基于sahi的UI自动化测试框架

基于sahi pro excelframework自动化测试框架设计

1.概述

1.1.开发背景

电子印章系统需要进行自动化测试功能,且需要一种易于开发、维护、使用的自动化测试工具。Sahi pro版本相比开源版本已经自带excelframework,既直接通过excel文件执行自动化测试用例。

1.2.建设目标

目标1:普通测试员通过编写excel测试模板,生成自动化测试用例,直接执行自动化测试用例,实现自动化测试。
目标2:测试开发员可以灵活的修改、扩展、完善自动化测试框架。
目标3:测试开发员可以所见即所得、高效、快速的编写完善自动化测试框架。

1.3.假定和约束

本版本设计开发必须遵循JavaScript和Sahi脚本的开发规范。

2.框架流程设计

2.1.测试框架

测试框架由四层架构组成:sahiproexcelframework,业务逻辑层,页面对象库,基础控件库。
Sahiproexcelframework:将测试步骤(关键字)和测试数据直接保存在excel里,实现数据与脚本分离。由于excelframework需要调用方法而不是对象,所以需要一个中间层做把业务逻辑层的对象转换成方法。
业务逻辑层:可以在这里编写可重用的方法,这些方法中执行模拟手工测试的功能。该层的方法可以被测试用例调用。
页面对象库:用来获取、存储页面对象。每个页面对象也许包含多个控件对象,该层对象可以被业务逻辑层调用。
基础控件库:封装基础的页面控件对象。对于操作复杂的页面控件再进行封装以方便使用,该层对象可以被页面对象库调用。
图1. 测试框架图
基于sahi的UI自动化测试框架_第1张图片

3.框架使用说明

3.1.Excel模板说明

Excel模板作为描述自动化测试用例、测试步骤、测试数据的载体,严格按照模板编写将会避免很多可能出现的错误。脚本在执行的时候默认读取Excel模板里的sheet1内的数据,按照从上到下的顺序逐行执行关键字对应的脚本。所以可以在excel里新建其他sheet,但是不要修改sheet1的名字或删除sheet1,否则会导致无法执行脚本。
基于sahi的UI自动化测试框架_第2张图片
Excel模板里的每一行代表一个测试步骤,多行可以组成一个测试用例。
基于sahi的UI自动化测试框架_第3张图片
现对sheet1内的数据列的含义和使用做如下说明:
Comments(描述):该列可以录入对该测试步骤的描述用来标记这一步骤,该列可以为空。
Tags(标签):该列可以用标签对测试用例进行标记,在执行脚本时可有选择性的执行用例。所以仅在测试用例第一个测试步骤上些标签。如脚本执行时只执行smoke标签的用例,没有用标签标记的用例便不会执行。
TestCase(测试用例):该列可以录入测试用例名用来标记测试用例,由于多个步骤组成一个测试用例,无需再每一行都写测试用例名,仅在第一个测试步骤上写测试用例名,否则框架会认为每一行都是一个测试用例。
KeyWord(关键字):该列为必填项,框架根据该列的关键字进行脚本执行。所以关键字必须填写正确,具体可以参考excel模板里“api说明”的sheet页。
argumentN:关键字后面对应的是输入参数,也就是测试数据,具体关键字对应的参数含义可以参考excel模板里“api说明”的sheet页。
基于sahi的UI自动化测试框架_第4张图片
基于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)。

3.2.脚本开发

由于脚本的高度开放性,该框架也是可以进行修改和扩展的。基于已有的基础控件库、页面对象库对业务逻辑层进行扩展,新增、修改业务逻辑层相关的业务逻辑,达到快速开发的目的。当基础控件库或者页面对象库中没有需要的控件或者对象时,可以自行添加需要的基础控件或者页面对象。
目前框架包括的文件有:
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)
}

你可能感兴趣的:(软件,web前端,使用技巧,sahi-os)