UniEAP UTF 用户手册 (引擎)
目录
2.5.2 elementFinder.properties 16
3.5.5 复选框/单选框(checkbox/radio) 25
3.5.15 安全输入框(SecurityInput) 32
第1章 概述
UniEAP UTF是一套通用、可扩展的Web自动化测试框架,支持用户化的测试脚本和参数化的测试数据,提供灵活多样的结果断言、实用易读的测试报告以及图形化的管理工具。
极大的降低了测试用例维护和测试结果分析的成本,提升了脚本复用度和执行有效性。适用于功能回归测试、兼容性测试、稳定性测试及浏览器端性能测试。
UniEAP UTF主要由引擎、Eclipse插件和Web管理工具三部分组成。
l 引擎
引擎是产品的核心,主要在测试脚本、测试数据、结果断言、报告生成、第三方工具集成等方面创新的提供了很多灵活、实用的支持。
包括,用户化的测试脚本、参数化的测试数据、灵活多样的结果断言、实用易读的测试报告,以及良好的可扩展、可集成性。
l Eclipse插件
为了提高测试用例的编写及维护效率,Eclipse插件主要提供测试项目配置属性页、测试用例创建向导、测试用例编辑器语法提示等功能。
并且支持与Web管理工具双向同步测试用例、测试数据、页面对象结构等信息。
l Web管理工具
为了提高自动化测试管理的有效性,进一步提升测试用例编写及运行效率,Web管理工具主要提供页面对象的自动解析、测试用例在线编辑和分布式执行,以及测试覆盖度、测试执行结果等多维度实时的统计分析等功能。
并且支持与Eclipse插件双向同步测试用例、测试数据、页面对象结构等信息。
1.1 术语解释
l 测试用例
测试用例特指自动化用例,用来描述测试过程自动执行的过程,包括控件操作、数据输入及断言等。
l 测试数据
测试数据是在测试执行过程中用到数据(包括输入和预期结果),测试数据通常与测试用例分开存储,便于二者之间的解耦和复用。
l 测试场景
测试场景也可以理解为测试流程,是由测试用例和测试数据灵活搭配组成的具有实际业务意义的测试流程。
l 断言
在测试过程中判断当前结果(比如,输入域的值、控件是否存在等)是否符合预期。
注:以上术语可能与用户已有的概念不匹配(比如,有些用户把“测试数据”成为“测试用例”),因此在实际应用时,可以统一为用户习惯的概念。
第2章
测试文件组织
在基于UniEAP UTF进行自动化测试过程中,涉及的文件主要包括测试执行文件、测试场景文件、测试用例文件以及测试数据文件。组织关系如下:
l 测试执行文件
测试执行文件是自动化测试执行的入口文件,用来配置每次执行测试的被测系统地址、浏览器类型、测试场景等信息。
在每个测试执行文件中可以指定多个测试场景按顺序执行。
l 测试场景文件
在测试场景文件中可以将测试用例和测试数据进行灵活搭配组合,并串成具有实际业务意义的测试流程。
在每个测试场景文件中可以多次引用同一个测试用例文件,通包含不同测试方法、关联不同的参数组,来实现测试用例和数据的高度解耦和复用。
在每个测试场景文件中可以指定一个Excel文件作为该场景对应的参数文件(也可以多个测试场景文件都指定同一个Excel文件作为参数文件)。
l 测试用例文件
测试用例文件是描述测试执行过程的核心文件,用来定义测试过程中的流程、交互、数据及断言。
自动化测试的实际执行过程默认会按照测试用例文件中描述的顺序执行,也可以通过测试场景文件灵活组装调整。
l 测试数据文件
测试数据文件是用来存储测试过程中需要用到的交互数据的文件,通常是Excel格式。
对于全局的简单参数也可通过文本文件(.properties格式)来存储。
2.1 测试执行文件详解
测试执行文件示例如下,作为自动化测试的入口,测试执行文件可以在Eclipse中直接运行也可以通过Jenkins等持续集成工具调度执行。
2.1.1 参数配置
为了应对复杂的或特殊的被测系统,测试执行文件提供了大量配置属性。但大部分属性是可选的或不常用的。
测试执行文件属性详解如下:
属性名 | 说明 |
webroot | 被测系统的访问地址。 |
testsuites | 要执行的测试场景文件,可以指定1个或多个(用英文分号分隔定),默认是classpath下的相对路径。 |
elementFinder | 页面控件查找实现类(也可以使用elementFinder.properties中定义的别名)。针对被测系统配置之后,通常不用修改。 |
resultFolder | 测试过程截图备份位置(默认相对于当前工程根目录)。 |
paraFile | 全局参数文件位置(.properties文件),默认是classpath下的相对路径。 |
defaultFrame | (可选)默认frame(支持变量)。 如果useDefaultFrame =”false”时,在测试用例的mothod节点上配置frame=“default”,则会自动转化为这个值。 如果defaultFrame=”true”,在测试用例的mothod节点上不配frame属性或值为空时,会默认使用这个值。 |
useDefaultFrame | (可选)默认false,如果设置为true,则在测试用例的method节点上不设frame属性或值为空时,会默认使用defaultFrame的值。 |
cycleAllFrame | (可选)默认false,在没有为“testcase>method”节点指定frame属性时,是否循环页面上所有Frame来定位控件,当method设置了frame属性,还只会在指定frame中定位。 如果同时设置了defaultFrame、useDefaultFrame属性,则会按照上述两个属性的作用效果,优先从中定位控件。 注1:循环定位时,会返回第一个符合条件的控件(如果返回的不是目标控件,则可以采用在method中指定frame属性); 注2:cycleAllFrame设置为true时执行速度会稍慢,在IE下可能慢的比在Friefox或Chrome下更明显一些; 注3:在isSingleFrame=true时,cycleAllFrame不生效; 注4:在设置为true时对测试用例语法实现封装有一定依赖;详参《UniEAP UTF 扩展开发手册》。 |
methodWait | (可选)每个method执行前的等待时间,默认2秒。 |
eventWait | (可选)每个event执行后的最长等待时间,默认1秒。 |
eventForceWait | (可选)在event上设置的时间是否强制等待,默认true。 |
以下为不常用属性 | |
browserResourceMonitor | (可选)是否启用浏览器资源(暂时只有内存)占用监控(需要配合相应的Reporter listener),默认false。 |
browserTimeMonitor | (可选)是否监控浏览器时间(支持IE9、Firefox24以上等高版本浏览器),默认false。 |
isSingleFrame | (可选)被测系统是否为单帧的(无frame/iframe),默认false, 如果设置true则在测试过程中系统不作任何frame切换相关操作,可以提升执行速度。 |
UICompare | (可选)是否截图,如果这个全局属性配置为false,则每个测试方法上的对应属性则不再生效,默认true |
useOSWindowScreen | (可选)截图方式是否采用操作系统的窗口截屏,只建议在IE浏览器时考虑使用(IE的默认截图会让浏览器窗口resize,并且在页面结构复杂时可能截图不全),默认false |
skipFailScenario | (可选)测试用例出现失败方法后是否跳过当前测试场景的后续用例,默认true。 |
SQLConfig | (可选)在测试过程中需要使用后台数据库断言或需要通过SQL操作数据库完成相关工作时,可以通过该属性指定SQL及数据库的配置。如果不设值,则默认使用工程classpath根目录下下的SQLConfig.xml文件。 详细请参考“SQL调用”章节。 |
windowSwitchWait | (可选)在切换窗口(window)时,默认等待多少秒再进入新窗口进行操作,默认为0。 |
HTTPStateCheck | (可选)测试过程是否检查HTTP状态,并进行断言,默认false。 |
proxyType | (可选):默认DIRECT,即无代理,如需代理建议配置为SYSTEM(使用系统环境变量配置) |
chromeDriver | (可选)在Chrome浏览器下测试时需要指定驱动位置(相对于当前工程根目录),默认在当前工程根目录下查找。 |
ieDriver | (可选)在IE浏览器下测试时需要指定驱动位置(相对于当前工程根目录) ,默认在当前工程根目录下查找。 |
webrootExpected | (可选)预期结果应用(通常为上次验证通过的版本)访问地址 |
autoCompare | (可选)是否自动对比两个版本下测试执行结果截图,默认false |
2.1.2 测试报告配置
通过下面listener配置可以生成系统默认的测试报告(包括,浏览器内存和耗时占用)。
<listeners> <listener class-name= "com.neusoft.utf.webui.reporter.UTFWebUIDefaultReporter"/> </listeners> |
此配置通常不用修改,也可以根据用户需求进行定制。
2.1.3 浏览器类型配置
可以在自动化测试执行时指定浏览器类型,通过修改下面include节点的name属性为firefox、ie、chrome即可。
<test name=“自动化测试样例"> <classes> <class name="com.neusoft.utf.webui.testcase.ExecuteAllTest"> <methods> <include name="firefox/ie/chrome"/> </methods> </class> </classes> </test> |
注1:在基于远程浏览器执行时执行类需要配置为:
com.neusoft.utf.webui.testcase.RemoteExecute
注2:在数据驱动测试模式下执行类需要配置为:
com.neusoft.utf.webui.datadriver.execute.ExecuteAllTest
2.1.4 基于IE执行时浏览器设置
在基于IE执行时,对浏览器本身的设置有如下要求和建议。
l 所有区域设置相同的“启用保护模式”
对于Win7/vista或IE7以上版本,浏览器“Internet选项”的“安全”选项卡中,所有区域(Internet、本地Intranet、受信任的站点、受限制的站点)使用相同的“启用保护模式”,如下图所示:
l 浏览器放缩比设置为100%
在IE下运行用例时,浏览器放缩比必须提前设置为100%。
l 安全级别设置为“中低”或“低”
对于一些被测系统,在浏览器放缩比设置为100%并且对于不同安全域使用相同“启用保护模式”后,运行测试用例时IE浏览器可以正常打开,但是无法跳转到被测系统页面或者跳转过去之后控件操作不正常。
此时需要修改“Internet选项”的安全级别,将“本地Intranet”的安全级别设置为“中低”或“低”。如果被测系统已经加入“可信站点”,“可信站点”域的安全级别也要设置为“中低”或“低”。
设置方法可以点击“自定义级别”,然后选择“中低”或“低”之后再点击“重置”按钮。
注意:一定要点击“重置”按钮,这个下拉选择框不是自动更新的。
2.1.5 远程浏览器执行配置
UniEAP UTF支持基于远程浏览器执行测试用例,采用这种方式首先使测试人员本机不必安装特定的浏览器,其次在执行过程不妨碍测试人员继续做其它工作。
Ø 配置方式
在utf.properties文件中配置如下属性:
gridHub=http://10.4.44.166:4444/wd/hub |
在测试执行文件需要配置为远程执行类:
<test name=“自动化测试样例"> <classes> <class name="com.neusoft.utf.webui.testcase.RemoteExecute"> <methods> <include name="firefox/ie/chrome"/> </methods> </class> </classes> </test> |
注1:需要所配置的gridHub节点上注册有空闲的指定类型浏览器,如下图所示;
注2:基于远程浏览器执行的速度会稍慢与基于本地浏览器执行;
注3:远程浏览器机器上如果有防火墙,可能会导致无法执行;
注4:SeleniumGrid的配置启动方式,参考《UniEAP UTF 安装部署手册》;
2.2 测试场景文件详解
在测试场景文件中可以指定数据文件、按顺序引用多个测试用例文件,测试场景文件示例如下:
2.2.1 属性配置
测试场景文件属性详解如下:
节点名>属性名 | 说明 |
testsuite>name | 测试场景的唯一名称,建议定义的有业务意义。 |
testsuite>paramFile | (可选)与测试场景关联的测试数据文件(默认是Excel格式)。 注:测试用例级参数和测试场景级参数(详细请参考“参数化”章节。)都在同一个Excel文件中。 |
suite-file>path | 所以引用测试用例文件位置(默认相对于classpath根目录)。 |
suite-file>id | (可选)如果一个测试用例文件在同一个场景中被多次引用时,可以通过id属性在测试报告中区分用例的引用位置。 |
suite-file> paramGroup | (可选)当前引用测试用例中参数对应的参数组。 在数据驱动测试模式下一般不使用。 |
suite-file>include | (可选)指定在运行期仅执行测试用例中定义的部分方法。 如果设置此属性,会按照这里定义方法顺序执行,否则会按照测试用例文件中定义的顺序执行。 |
suite-file> alwaysRun | (可选)是否总是执行该测试用例,当测试执行配置文件中配置skipFailScenario=true(默认)时,如果此处设置alwaysRun=true,则不会被跳过,默认false。 比如,每个测试场景包括登录、一系列业务、注销,如果某个业务环节出错,跳过后续业务,但最后还是需要注销,否则下个用例无法登录成功。 |
注:suite-file的path属性如果采用默认的classpath作为相对路径,在以ant或Eclipse工程方式运行时均要将这些路径所在的父文件夹添加到classpath。
2.3 测试用例文件概述
测试用例文件主要由testcase、method和event三级节点组成:
l 每个用例文件的根节点是testsuite,通常包含一个testcase节点;
l 每个testcase包含多个method节点,每个method通常是一个测试方法(测试点);
l 每个method包含多个event节点,每个event是一个具体的操作步骤;
每个节点及属性的详解,请参考“测试用例”章节。
2.4 测试数据文件概述
UniEAP UTF支持流程驱动测试和数据驱动测试两种模式,两种模式都有各自的数据文件格式,默认是Excel格式。测试数据文件可以通过测试场景文件的paramFile属性配置,:
<testsuite name="测试场景" paramFile="数据/测试数据.xls"> <suite-files> <suite-file path="用例/新收付费系统/缴付费通知单管理.xml"/> </suite-files> </testsuite> |
流程驱动测试时,数据文件的示例如下:
数据驱动测试时,数据文件的示例如下:
为了更适合用户需求,尽量复用已有测试数据,测试数据文件的格式可自定义,也可以使用CSV等非Excel格式。
测试数据的具体配置和使用方法,请参考“测试数据”章节。
2.5 全局配置文件详解
2.5.1 utf.properties
在utf.properties中可以配置自动化测试所需的全局参数以及自定义扩展实现类。这些属性都是可选的,通常默认值就可以满足需求。属性详解如下:
属性名 | 说明 |
relativeRootPath | (可选)测试场景、测试用例、测试数据文件的相对路径,如果不设则默认为classpath根目录。 |
paramProvider | (可选)测试数据解析实现类,系统提供默认实现。 在流程驱动模式下默认为: com.neusoft.utf.common.parametric.datasource.excel.ExcelParameterProvider 在数据驱动模式下默认为: com.neusoft.utf.webui.datadriver.parametric. ExcelParameterProvider |
webdriver.firefox.bin | (可选)Firefox执行文件安装目录,默认值: C:\Program Files\Mozilla Firefox\firefox.exe |
executeCallback | (可选)测试用例执行过程中的自定义回调接口,可以在每个测试方法执行前后或遇到异常时自定义处理方式。 |
gridHub | (可选)负责远程浏览器分配转发的处理服务。在使用远程浏览器分布式执行时需要配置。 如:gridHub=http://10.4.44.166:4444/wd/hub |
elementAction | (可选)页面控操作实现类,系统默认实现为: com.neusoft.utf.webui.base.selenium.webdriver.WebElementAction |
testCaseGenerator | (可选)从自动化测试用例生成手工测试用例的实现类,默认提供生成Excel格式手工用例的方法。 |
bizassert | (可选)后台数据库断言的实现类,系统默认为: com.neusoft.utf.webui.DBAssert |
bindingAnalyse | (可选)UI类库数据绑定解析实现类,通常不用设置,当被测系统采用了数据绑定机制时,可能需要自定义实现。 |
2.5.2 elementFinder.properties
测试执行文件中的elementFinder参数可以配置为元素查找实现类的全名(包+类),也可以配置为elementFinder.properties定义的简称。
比如,elementFinder.properties配置内容如下:
html=com.neusoft.utf.webui.base.selenium.webdriver.WebElementFinder jquery=com.neusoft.utf.ext.jquery.JQueryElementFinder |
那么在测试执行文件中如果设置参数elementFinder=jquery,就等同于设置elementFinder=com.neusoft.utf.ext.jquery.JQueryElementFinder。
这样便于相同开发平台(或UI框架)开发项目的统一维护。
2.5.3 unieap.license
unieap.license是UniEAP UTF的使用许可文件,可以按照时间、MAC或IP进行约束。
该文件需要放在classpath根目录下。
第3章
测试用例
与其它测试工具不同,UniEAP UTF测试用例没有采用VBS、Java、Ruby等编程语言形式,而是采用了易于学习、结构化清晰、便于组织和复用的XML格式。
也就是说,UniEAP UTF的测试用例是一种用XML实现的用户视角的、所见即所得的DSL(领域特定语言,Domain Specific Language)。
目标是希望测试人员、业务人员甚至用户,只要会操作被测系统,就能编写测试用例。
3.1 testsuite
测试用例的根节点虽然是testsuite,但为了便于维护管理,通常建议testsuite包含一个testcase节点即可,testsuite上只有menuPath和elementFinder两个可选属性。
属性名 | 说明 |
menuPath | (可选)测试用例对应页面的菜单路径,通常对于多级菜单,可以用点号分隔(比如,系统管理.用户管理)。对于不是基于菜单组织起来的系统,也可以配置为对应页面的自定义编号。 这个属性只用于测试用例与页面结构、测试大纲的关联管理,不会在执行期使用。 |
elementFinder | (可选)测试用例级别的页面控件查找实现类,如果设置则会覆盖测试执行文件中定义的全局elementFinder配置。 只有在被测系统UI开发极不规范的情况下才使用,比如,系统整体都是用JQuery的类库开发,只有个别页面由于开发人员没遵守规范,采用了DOJO的同类控件。 |
3.2 testcase
通常一个页面可以对应一个testcase节点(也即测试用例文件),对于特别大的页面,也可以根据业务,对应多个testcase。这样便于控制测试用例文件的数量以及与系统页面的关联管理。
不建议一个testcase同时包含多个页面的内容。
3.2.1 属性配置
属性名 | 说明 |
id | 测试用例的标识,在一个测试项目中需要唯一。 在生成测试报告等过程中都会使用,因此需要写的有业务意义。 |
defaultInclude | (可选)在通过测试场景文件的include属性指定所引用的测试方法及顺序的情况下,testcase中的method会涵盖页面上比较完整的功能(比如,增加、修改、删除、重置等都有method对应)。因此就不能按照用例中的顺序执行所有的用例。通过defaultInclude属性可以在测试场景文件不指定include时,默认执行测试用例中的部分方法。 |
implicitMethod | (可选)是否默认包含一个初始化页面的测试方法,默认false。 设置为true时,每个testcase会默认生成一个隐含的method。 效果是,在测试报告和测试界面截图中,每个testcase的第一个方法会变成initPage。 |
enabled | (可选)是否可用,若设为false则执行时会跳过此用例,默认true。 |
refresh | (可选)切换testcase时是否强制刷新页面,默认true。 |
url | (可选)相对测试执行文件中webroot属性的路径后缀,如果只是通过点击菜单切换页面,则url可不设。在测试网站型项目时通常会使用到。 由于testcase实际的路径是webroot+url,所以如果一个测试场景要涉及多个系统,则可以通过webroot不设或只设两个系统的公共前缀来实现。 但,通常遇到多个系统管理测试的情况,建议通过多个测试执行文件来分别对应,然后用其它工具(比如,Jenkins)来调度执行。 |
3.3 method
method是一个具体的测试方法(或测试点),为了提高测试设计的有效性和可复用性,method的划分有如下规则可供参考:
l 在人工测试时,如果每操作几步之后就要下意识的判断一下对错,那么这几步(event)就可以划分到一个method中;
l 对于页面上实现相同业务的一组表单输入(比如,保险人信息、受益人信息),可以划分到一个method中;
l 对于页面上的每个业务功能或后台交互(比如,查询、增加、删除按钮),可以单独设计为一个method;
l 对于导致页面发送跳转或内容动态变化的操作(比如。点击tab页、弹出对话框),可以单独设计为一个method;
l 对于页面frame嵌套复杂或新页面(window)切换频繁的系统,只要被操作对象涉及frame和window的变化,就需要切分到不同的method,并各自指定frame或window属性;
3.3.1 属性配置
属性名 | 说明 |
id | 测试方法的标识,在一个测试用例中需要唯一。 在生成测试报告等过程中都会使用,因此需要写的有业务意义。 |
wait | (可选)页面初始化等待时间,单位秒,默认2秒。如果页面初始化较慢则需要设置更长的时间,否则后续操作可能找不到控件。 |
frame | (可选)method中所操作控件在页面上所属的frame/iframe,支持通过id、name或顺序进行多级定位(如,main.2.child)、支持默认frame、支持使用变量(如,default.${menu})、支持倒数顺序(如, main.-2)。 |
window | (可选)method中所操作控件在页面上所属的window(即,弹出的新页面,有title、url或地址栏的那种)。可以通过页面的title、url或target属性切换页面,如果每次只有一个弹出页面(即,总共只有两个页面)的情景,也可以通过window="another"来切换到另外一个页面。 |
UICompare | (可选)是否生成截图文件,以便后续对比,默认true。如果测试执行文件中全局设置UICompare=false,则此处配置无效。 |
HTMLCompare | (可选)是否生成页面源码备份文件,以便后续对比,默认false。 |
enabled | (可选)method是否可用,默认true,若设为false则执行时会跳过此method。 |
elementFinder | (可选)method级别的页面控件查找实现类,如果设置则会覆盖全局和testsuite级别的elementFinder配置。 同testsuite上的elementFinder属性,只有在被测系统UI开发极不规范的情况下才使用。 |
refresh | (可选)切换method时是否强制刷新页面,默认false。 在部分前置操作后不能即时刷新的页面中,需要将此属性true。 |
对于frame、window属性的详细用法,下面单独介绍。
3.3.2 frame切换
对于使用了框架结构页面,frame属性的设置非常关键,如果设置错误,相关的操作控件都无法找到。
与frame相关的设置包括测试执行文件中设置的defaultFrame、useDefaultFrame、isSingleFrame参数,以及method上的frame属性。
l frame的标识方式
defaultFrame和frame属性配置为目标控件所属frame/iframe,由于frame/iframe本身存在嵌套关系,所以可以通过id、name或顺序进行多级定位。对于每一级frame/iframe,如果有id或name属性,推荐使用id或name属性,如果没有则通过顺序(即,该frame/iframe是在统计frame/iframe对象中处于第几个)定位(顺序从0开始)。
已上图为例,第一个iframe的标识是“main”、第二个frame的标识是“main.leftFrame”或“main.0”、第三个frame的标识只能是“main.1”。
l 变量的使用
在defaultFrame和frame属性上可以使用变量,比如defaultFrame=${ menu }。变量的取值和赋值使用与测试数据的参数化方式相同。
l 默认Frame设置
由于被操作的控件往往都集中在右下方的操作域,所以会导致大部分method都配置为相同的frame属性。这种情况下,可以配置defaultFrame等于该frame标识。
Ø 如果method节点上配置frame=default,则等于defaultFrame的值;
Ø 如果method节点上配置frame=default.0,则等于defaultFrame的值再加“.0”;
Ø 如果在配置defaultFrame的同时也设置了useDefaultFrame=true,则如果method不设frame属性,就相当于设置了defaultFrame的值。
在这种情况,如果某个method反而不需要任何frame,则设置frame= topWindow。
l Frame的顺序
通常在没有id和neme的情况下可以使用顺序定位,从0开始。但有些时候,目标操作控件所属的frame顺序不固定(可能是第1、也可能是第2或第3),但倒数顺序是固定的(比如,倒数第一个),此时也可以通过负数来标识倒数顺序(从-1开始),比如-1代表倒数第一个、-2代表倒数第二个。
l 无Frame设置
如果被测系统采用了单帧模式(即,为了提升渲染速度,所有页面开发不使用frame/iframe标签),则可以isSingleFrame=true。在此设置下,可以提升一些用例的执行速度,其它几个与frame相关的属性均不再生效。
3.4 event
event对应测试执行过程中的每个步骤,或者说每次点击、输入或断言。要实现页面测试执行的自动化,首先要能定位到控件,然后要能操作控件,event的id和name属性分别对应这两个步骤。
3.4.1 控件定位方式
定位到页面控件是自动化测试过程中最关键的一步,UniEAP UTF提供简便、灵活的定位方式,帮助测试人员更快、更准确的定位页面控件。
l 用户化语法定位
借鉴用户口语描述页面交互的方式定义测试脚本语法,比如,“姓名”“输入域”“输入”张三、“点击”“保存”“按钮”。
详细请参考“控件操作语法”章节。
l W3C标准定位
UniEAP UTF支持W3C标准的所有定位方式,但推荐使用控件实际id或XPath定位。
Ø 实际id
根据控件实际的id进行定位,如果控件有唯一、固定、有业务意义的id,则可以使用此定位策略。
Ø XPath
根据控件的xpath进行定位,如,//input[@value=‘查询’]”。
对于既没有进行封装,又无法使用实际id的控件可以使用xpath定位。
通常在自动化测试初期、或项目前台编码不统一、不规范时需要经常用到这种方式。
在使用xpath时强烈建议使用尽可能简化的xpath,这将大大提高脚本跨浏览器的执行通过率。
l HTML通用定位
HTML通用定位是对W3C标准定位方式最简单的封装,可以有效减少测试用例的编写难度。
Ø [name]
对于未设id属性,但有唯一、固定、有业务意义的name属性的控件可以使用此语法。如:[name]userid,等同于“//*[@name=‘userid']”
Ø [tagName]
对于通常都不设id和name、只有文本的标签(如,a、td、div等)可以使用此语法定位。如:[a]自动化测试,等同于“//a[text()=‘自动化测试’]”; [div]姓名,等同于“//div[text()=‘姓名']”。
Ø [alert]
用于切换到浏览器原生的提示框(window.alert()、window. confirm()、window.prompt()),以便做确定或取消处理。
对于“用户化语法定位”和“HTML通用定位”方式中的id属性可以使用变量(比如,id=”[treeNode]${dept}”)。
为了提高用例的后期可维护性,推荐优先采用“用户化语法定位”、其次是“HTML通用定位”,最后才是“W3C标准定位”。
3.4.2 操作命名方式
定位页面控件之后就是对控件的操作了,UniEAP UTF推荐使用最终用户习惯的概念(比如,展开、关闭、选中等)定义控件的操作类型。通过name属性可以指定控件上的事件(event)操作类型,包括交互、断言、参数赋值、截图等。
l 交互
包括HTML通用的交互操作(比如,click、setValue、sendKey、doubleClick、doubleClick、 rightClick等)和特定类型控件特有的交互操作(比如,树节点的展开/关闭,表格的翻页,下拉框的选择等)。
详细请参考“控件操作语法”章节。
l 断言
除了常见的是否相等、是否存在等断言,UniEAP UTF支持的断言语法更丰富:
断言语法 | 说明 |
assertEquals | 判断实际结果与预期结果应该相同,不同则断言错误 |
assertNotEquals | 判断实际结果与预期结果应该不相同,相同则断言错误 |
assertNull | 判断实际结果应该为空,不为空则断言错误 |
assertNotNull | 判断实际结果不应该为空,为空则断言错误 |
assertMoreThan | 判断实际结果应该大于预期结果,不大于则断言错误 |
assertMoreThanOrEqual | 判断实际结果应该大于等于预期结果,小于则断言错误 |
assertLessThan | 判断实际结果应该小于预期结果,不小于则断言错误 |
assertLessThanOrEqual | 判断实际结果应该小于等于预期结果,大于则断言错误 |
assertExist | 判断实际结果应该存在,不存在则断言错误 |
assertNotExist | 判断实际结果不应该存在,存在则断言错误 |
详细请参考“测试断言”章节。
l 参数赋值
name属性设置为“setParam”,可以为动态参数赋值。
详细请参考“取值与赋值”章节。
l 截图
默认情况下,每个method结束系统会自动截图备份,为了实现更灵活的截图操作,可以将name属性设置为“snapshot”,表示当前event仅为实现截图操作。
为了测试报告清晰,建议每个method中之多包含一个“snapshot”事件,使用了snapshot事件后,method的UICompare属性设置为false(或测试执行文件中设置UICompare=false)。
3.4.3 属性配置
属性名 | 说明 |
id | 用于定位event对应的页面控件。支持用户化定位UTF语法、控件id、xpath等多种方式。 详细请参考“控件操作语法”章节。 |
name | (可选)事件的操作名称,不同类型的控件有不同的默认值。 详细请参考“控件操作语法”章节。 |
value | (可选)输入值设置,当name为setValue、setText、setIndex、setParam等赋值相关操作时有效。支持以${para}格式传入外部定义的静态和动态参数。 |
wait | (可选)执行操作之后等待指定时间,单位秒,默认1秒。如果后续事件操作之前需要等待较长的时间,则需要自定义设置更长的时间,否则后续操作可能找不到控件。 如果id为空,只设置wait属性,则代表仅在当前位置等待指定时间。 |
index | (可选)在通过用户化语法定位控件时,极少数情况下可能出现同一个页面有多个“相同的控件”,比如,两个“确定”按钮、三个“姓名”输入域。在这种情况下,可以通过index进行区分。 注:实际效果与语法封装实现有关。 |
desc | (可选)event的描述信息,如果id使用的不是用户化语法定位法时,建议通过desc属性注明当前操作的意义。 |
对于id、name、value、index属性的详细用法与具体控件类型相关,所以详细可以参考“控件操作语法”章节。
3.5 控件操作语法
为了测试用例后期的可维护性,UniEAP UTF推荐使用用户化的语法来定位控件,本节内容介绍各种常见页面控件的用户化语法。
【注1】 本节内容可供测试人员编写用例时参考,也可供扩展开发人员封装实现参考;
【注2】 本节内容是UniEAP UTF推荐的语法接口,实际完整语法以扩展开发结果为准;
【注3】 本节内容只介绍各种控件备选值及默认值的差异之处,公共的属性(如,desc)、
及属性值(如,name=”click/doubleClick/rightClick/setParam/snapshot/assert*”),
详细请参考“event”章节。
3.5.1 输入域(input)
Ø 语法示例
<event id="[input]管理机构" name="setValue" value="863700"/> |
Ø 属性配置
属性名 | 说明 |
id | 以[input]开头,后面可以使用输入域前面的文本、也可以使用输入域本身的id、name或placeholder属性。 注:输入域包括input、textarea、password。 |
name | (可选)默认值setValue,可选操作包括: Ø setValue:给目标输入域赋值; Ø sendKey:在目标输入域上执行键盘事件(如,Enter、Tab等); Ø forceSetValue:给目标输入域强制赋值(比如,只读输入域); |
value | (可选)往目标输入域输入的值,可以使用常量或变量。 |
index | (可选)通过文本定位输入域时,如果相同文本对应的输入域有多个,可以指定操作第几个。 |
3.5.2 下拉框(select)
Ø 语法示例
<event id="[select]国籍" name="setText" value="中国"/> |
Ø 属性配置
属性名 | 说明 |
id | 以[select]开头,后面可以使用下拉框前面的文本、也可以使用下拉框本身的id、name属性。 |
name | (可选)默认值setText,可选操作包括: Ø setText:按照下拉选项文本进行选择赋值; Ø setIndex:按照下拉选项的顺序进行选择赋值; Ø setValue:按照下拉选项对应的值进行选择赋值; Ø sendKey:在目标下拉框上执行键盘事件(如,Enter、Tab等); |
value | (可选)给目标下拉框赋的值,可以使用常量或变量。 |
index | (可选)通过文本定位下拉框时,如果相同文本对应的下拉框有多个,可以指定操作第几个。 |
3.5.3 日期框(date)
Ø 语法示例
<event id="[date]出生日期" name="setValue" value="1960-05-23"/> |
Ø 属性配置
属性名 | 说明 |
id | 以[date]开头,后面可以使用日期框前面的文本、也可以使用日期框本身的id、name属性。 |
name | (可选)默认值setValue,可选操作包括: Ø setValue:给目标日期框赋值; Ø sendKey:在目标日期框上执行键盘事件(如,Enter、Tab等); |
value | (可选)给目标日期框赋的值,可以使用常量或变量。 注:要确保value的日期格式与手工操作时日期框中被填入格式相同。 |
index | (可选)通过文本定位日期框时,如果相同文本对应的日期框有多个,可以指定操作第几个。 |
注1:日历控件并非HTML的标准控件,所以必须经过封装才可按照上述语法操作。
注2:对日历控件的操作通常建议通过调用控件自身的js函数实现。
3.5.4 按钮(button)
Ø 语法示例
<event id="[button]确定" name="click"/> |
Ø 属性配置
属性名 | 说明 |
id | 以[button]开头,后面可以使用按钮的文本、也可以使用按钮本身的id、name属性。 注:按钮包括button和submit控件。对于用样式、图片做成的“按钮“需要单独封装。 |
name | (可选)默认值click,可选操作包括: Ø click:点击该按钮; |
index | (可选)通过文本定位按钮时,如果相同文本对应的按钮有多个,可以指定操作第几个。 |
3.5.5 复选框/单选框(checkbox/radio)
Ø 语法示例
<event id="[checkbox]与投保人关系" name="check" value=”子女”/> <event id="[radio]性别" name="check" value=”男”/> |
Ø 属性配置
属性名 | 说明 |
id | 以[checkbox]/ [radio]开头,后面可以跟复(单)选框组前面的文本、也可以使用控件本身的id、name属性。 注:后面也可以什么都不跟(即,不指定复(单)选框组的标识),但通常不推荐使用,可能导致选择不精准。 |
name | (可选)默认值check,可选操作包括: Ø check:选中目标复(单)选框; Ø uncheck:取消选中目标复选框; 注1:check/uncheck语法不同于简单的click,是有业务意义的。比如,当目标复选框默认是选中状态,name属性又设置为check,则系统什么也不做(不会再去执行点击动作,这样反而会取消选中)。 注2:radio不支持uncheck; |
value | 可以使用常量或变量。 可以是复(单)选框组中要操作的某个复(单)选框的显示文本、在当前组中的顺序或value属性值。Value属性值的使用优先级如下: 当做value属性>当做index(如果可转为整型)>当做文本 |
以上图“理赔类型”复选框为例,示例一下checkbox/radio语法中id和value写法(按照精准度从高到低排序):
Ø <event id="[checkbox]claimType" value="02"/>
id使用控件id/name属性、value使用控件value属性。
Ø <event id="[checkbox]claimType" value="2"/>
id使用控件id/name属性、value使用顺序。
Ø <event id="[checkbox]claimType" value="重大疾病"/>
id使用控件id/name属性、value使用文本。
Ø <event id="[checkbox]理赔类型" value="01"/>
id使用文本、value使用控件value属性。
Ø <event id="[checkbox]理赔类型" value="5"/>
id使用文本、value使用顺序。
Ø <event id="[checkbox]理赔类型" value="医疗"/>
id使用文本、value使用文本。
注:这种写法最易读,如果可以准确定位的话,推荐使用。
Ø <event id="[checkbox]" value="特种疾病"/>
不指定复(单)选框组标识、value使用文本。
Ø <event id="[checkbox]" value="06"/>
不指定复(单)选框组标识、value使用控件value属性。
Ø <event id="[checkbox]" value="8"/>
不指定复(单)选框组标识、value使用顺序。
注:由于checkbox/radio的具体使用没有统一规范,所以如果最易读的写法无法识别,只能采用更精准的写法。或者根据被测系统的开发规范进行扩展开发。
3.5.6 树节点(treeNode)
Ø 语法示例
<event id="[treeNode]组织单元" name="open" value=” 东软”/> |
Ø 属性配置
属性名 | 说明 |
id | 以[treeNode]开头,代表对树节点的操作,后面可以使用树控件的标识或者为空。 注1:如果页面上只有一个树控件,则可以省略“树的标识”,只写“[treeNode]”; 注2:“树的标识”可以根据编码规范使用树的上级节点Title或者树控件的id、name属性; |
name | (可选)默认值click,可选操作包括: Ø open:展开该树节点; Ø close:关闭该树节点; Ø check:选中该树节点; Ø uncheck:取消选中该树节点; Ø click:点击该树节点; Ø rClick/ rightClick:右键点击该树节点; 注1:open/ close、 check/uncheck语法不同于简单的click,是有业务意义的。比如,当目标树节点默认是open状态,name属性又设置为open,则系统什么也不做(不会再去执行点击动作,这样反而会关闭节点)。 |
value | 要操作的目标树节点名称,可以使用常量或变量。 |
注:树控件并非HTML的标准控件,所以必须经过封装才可按照上述语法操作。
3.5.7 表格(grid)
由于表格是常用控件中最复杂的一个,所以将表格拆分为“表格”、“表格行”、“表格单元格”三种控件,分别在本节以及下面两个小节中说明。
表格(grid)代表整个表格级别的操作,通常包括表格工具栏上的翻页操作。
Ø 语法示例
<event id="[grid]人员列表" name=" nextPage"/> |
Ø 属性配置
属性名 | 说明 |
id | 以[grid]开头,代表对表格的操作,后面可以使用表格控件的标识或者为空。 注1:如果页面上只有一个表格控件,则可以省略“表格标识”,只写“[grid]”; 注2:“表格标识”可以根据编码规范使用表格的标题或者表格控件的id、name属性; |
name | 可选操作包括: Ø prePage:点击表格的上一页按钮; Ø nextPage:点击表格的下一页按钮; Ø firstPage:点击表格的第一页按钮; Ø lastPage:点击表格的最后一页按钮; Ø toPage:跳转到表格的第几页; 注:实际操作类型,可以根据用户需求进行扩展定义。 |
注:表格相关控件并非HTML的标准控件,所以必须经过封装才可按照上述语法操作。
3.5.8 表格行(gridRow)
Ø 语法示例
<event id="[gridRow]人员列表,张三" name="check" /> |
Ø 属性配置
属性名 | 说明 |
id | 以[gridRow]开头,代表对表格行的操作,后面通过<Grid标识,Cell文本/行号>二元组来进行定位。 注1:对“Grid标识”写法可以参考“表格(gird)”章节中对与id的注解; 注2:如果页面上只有一个Grid,可以省略“Grid标识”,但还要保留二元组格式,如,id="[gridRow],张三"; 注3:通过行号定位时,用中括号标注,如,id="[gridRow]人员列表,[3]",标示“人员列表的第3行”。 注4:Cell文本/行号支持常量和变量; |
name | 可选操作包括: Ø check:选中表格指定行,通常是选中前面的checkbox/radio按钮; Ø uncheck:取消选中表格指定行; 注:实际操作类型,可以根据用户需求进行扩展定义。 最常见的是自定义操作是每一行上的业务操作连接或图表,比如,查看、配置、删除、修改等。 |
注:表格相关控件并非HTML的标准控件,所以必须经过封装才可按照上述语法操作。
3.5.9 表格单元格(gridCell)
Ø 语法示例
<event id="[gridCell]人员列表,张三,姓名" name="click" /> |
Ø 属性配置
属性名 | 说明 |
id | 以[gridCell]开头,代表对表格单元格的操作,后面通过<Grid标识,Cell文本/行号,列表头>三元组来进行定位。 注1:对“Grid标识”写法可以参考“表格(gird)”章节中对与id的注解; 注2:如果页面上只有一个Grid,可以省略“Grid标识”,但还要保留三元组格式,如,id="[ gridCell],张三,姓名"; 注3:通过行号定位时,用中括号标注,如,id="[ gridCell]人员列表,[3],姓名",标示“人员列表第3行的姓名列”。 注4:Cell文本/行号、列表头支持常量和变量; |
name | 默认是click,可选操作包括: Ø doubleClick/ dClick:双击指定单元格; Ø click:点击指定单元格; Ø setValue:给目标单元格编辑赋值; 注:实际操作类型,可以根据用户需求进行扩展定义。 最常见的是自定义操作是单元格的各种赋值控件操作,比如,文本框、下拉框、日期框的赋值。 |
value | 可以使用常量或变量。 在name值为setValue/setText等赋值操作时有效。 |
注:表格相关控件并非HTML的标准控件,所以必须经过封装才可按照上述语法操作。
3.5.10 文件上传(fileUpload)
Ø 语法示例
<event id="[fileUpload]任务名称" name="setValue" value="D:\temp\emp.xls"/> |
Ø 属性配置
属性名 | 说明 |
id | 以[fileUpload]开头,后面可以使用上传框前面的文本、也可以使用上传框本身的id、name属性。 |
name | 可选操作包括: Ø setValue:选择目标文件上传; |
value | 要上传的文件地址,可以使用常量或变量。 注:地址格式为D:\temp\emp.xls,注意使用“\”; |
注:如果文件上传不是采用HTML的标准控件(<input type="file"/>),则需要自定义实现。
3.5.11 菜单(menu)
Ø 语法示例
<event id="[menu]系统管理.人员管理" /> |
Ø 属性配置
属性名 | 说明 |
id | 以[menu]开头,代表对菜单的操作,后面可以跟菜单名称,对于多级菜单通常可以用点号(.)分隔。 |
name | 默认是click,可选操作包括: Ø click:点击指定单元格; |
注:菜单控件并非HTML的标准控件,所以必须经过封装才可按照上述语法操作。
3.5.12 选项卡(tab)
Ø 语法示例
<event id="[tab]产品销售统计" /> |
Ø 属性配置
属性名 | 说明 |
id | 以[tab]开头,代表对Tab控件的操作,后面可以跟Tab页的标题名。 |
name | 默认是click,可选操作包括: Ø click:点击指定Tab; Ø close:关闭指定Tab; |
注:选项卡控件并非HTML的标准控件,所以必须经过封装才可按照上述语法操作。
3.5.13 模态对话框(alert)
模态对话框是指浏览器原生的模块对话框包括:window.alert()、window. confirm()、window.prompt(),此类对话框由于没有HTML源码对应,所以需要特殊处理。
Ø 语法示例
<event id="[alert]" name=”ok”/> |
Ø 属性配置
属性名 | 说明 |
id | 以[alert]开头,代表对弹出对话框的操作。 |
name | 默认是ok,可选操作包括: Ø ok:点击确定按钮; Ø cancel:点击取消按钮; Ø setValue:往弹出框的输入域中赋值; |
value | (可选)往对话框输入域输入的值,可以使用常量或变量。 |
3.5.14 窗口(window)
对于弹出的新窗口(新页面),有时无法通过页面上的某个按钮关闭,因此需要提供关闭等相关语法。
Ø 语法示例
<event id="[window]" name=”close”/> |
Ø 属性配置
属性名 | 说明 |
id | 以[window]开头,代表对窗口的操作。 |
name | 可选操作包括: Ø close:关闭窗口; Ø maxsize:窗口最大化; 注1:切换窗口的操作通过method的window属性实现; 注2、如果在method中需要通过页面上的按钮或者close操作关闭当前窗口,则需要在method上设置UICompare="false",如果还要截图,则在关闭之前增加一个Event截图(name=” snapshot”)。 |
3.5.15 安全输入框(SecurityInput)
安全输入框通常指代通过ActiveX实现的输入域,通常用于交易密码的输入。
Ø 语法示例
<event id="[securityInput]" name=”setValue” value=”pwd”/> |
Ø 属性配置
属性名 | 说明 |
id | 以[securityInput]开头,后面可以使用输入域前面的文本。 |
name | 可选操作包括: Ø setValue:往输入域中赋值; |
value | (可选)往目标输入域输入的值,可以使用常量或变量。 |
注:安全输入域控件并非HTML的标准控件,默认提供的封装需要实际验证是否适用于被测系统,如果不适用,则需要扩展开发。
3.5.16 Java调用
对于封装后的测试用例语法尚未覆盖的特殊场景,可以通过调用自定义Java方法来实现。在自定义Java方法中可以与测试用例共享参数、WebDriver实例等信息。
Ø 语法示例
<event id="[java]com.neusoft.utf.test.Demo" name=”method1” value=”张三”/> |
Ø 属性配置
属性名 | 说明 |
id | 以[java]开头,后面跟Java类全名(含包名)。 注:此Java类要继承com.neusoft.utf.webui.base.CustomEvent, 并重写父类的构造函数; |
name | id属性指定Java类中的方法名。 注:要求Java类中不要有重名方法; |
value | (可选)要往Java类中传入的值。 注1:这个值在Java类中可以直接通过value变量取用; 注2:XML格式的测试用例中使用的参数,可以在Java类中共享,只要声明一个与参数同名的public全局变量即可; |
Ø 自定义Java示例
public class Demo extends CustomEvent { public Demo(WebDriver driver, ITestEvent event) { //在任何方法中可以使用driver和event对象 super(driver, event); } // 声明与测试用例中同名的变量即可取用对应的参数值 public String userName; public String passWord; public void method1() { // 使用event中的value属性值 System.out.println("value=" + value); // 使用测试用例中的参数值 System.out.println("变量userName=" + userName); System.out.println("变量passWord=" + passWord); } } |
3.5.17 SQL调用
在自动化测试执行过程中通常需要连接业务数据库进行结果断言、数据初始化、数据清理等操作。这些SQL可以在统一的XML文件中进行管理,通过测试执行文件中的SQLConfig属性可以指定该文件,文件内容如下所示:
节点及属性说明如下:
节点名>属性名 | 说明 |
dbconfig>name | 业务数据库的名称,在SQL配置文件中唯一即可。 |
dbconfig>driver | 业务数据库的JDBC驱动实现类。 |
dbconfig >url | 业务数据库的连接字符串。 |
dbconfig>username | 业务数据库的登录账号。 |
dbconfig>password | 业务数据库的登录密码。 |
sql>id | 在event中被以”[sql]**”形式引用的id,在SQL配置文件中唯一即可。 |
sql>sql | 具体的SQL语句,可以与测试用例以相同的方式引用参数。 |
3.5.18 自定义语法
如果在被测系统在上述类型之外,还有其它常用的控件类型,比如,具备特定业务意义的可复用控件,可以自定义测试语法。
详参《UniEAP UTF 扩展开发手册》。
第4章
测试数据
UniEAP UTF支持测试数据与测试脚本解耦,测试数据参数化后可以存储在Excel或文本中(如果使用“Web管理工具”则也可以存储在数据库中)。支持参数的分类、分级、分组以及动态赋值,并且同时支持流程驱动和数据驱动两种自动化测试执行方式。
4.1 参数化
4.1.1 参数分类
UniEAP UTF的参数可以分为静态参数和动态参数两类:
l 静态参数
在参数定义时值就被固定的参数是静态参数,静态参数在测试执行过程中值不能更改。
l 动态参数
在有些测试场景中,某项输入值是在前面测试用例执行过程中才能生成的(比如,系统会自动创建一个保单编号),这类参数的值没有办法提前设置。
在UniEAP UTF中,参数定义时没有赋值的参数是动态参数,动态参数的值需要在测试过程中被动态赋值,并且可以被多次赋值(以后面的赋值会覆盖前面的)。
通过event的setParam操作可以为动态参数赋值,setParam会把id对应控件的值(即,显示文本)或对应SQL的查询结果赋给value属性指定的动态参数。
<event id="[input]单位编号" name="setParam" value="单位编号"/> <event id="[sql]人数统计" name="setParam" value="总人数"/> |
4.1.2 参数分级
UniEAP UTF的参数提供分级机制,可以分为全局级、测试场景级、测试用例级三级。
参数的赋值和取值的优先级依次为:测试用例级(静态>动态)>测试场景级(静态>动态)>全局级(静态>动态)。
l 全局级
全局级参数只支持在属性文件(.properties)中定义,该属性文件可以通过测试执行文件的paraFile参数指定。
<parameter name="paraFile" value="数据/全局参数.properties"/> |
l 测试场景级
测试场景级参数是测试场景中所有测试用例可以共用的参数,配置在Excel的“Common”Sheet页中。
l 测试用例级
测试用例级参数是特定测试用例可以使用的参数,配置在Excel中与测试用例id属性相同的Sheet页中。
注:测试用例级参数不适用于“数据驱动测试”模式。
<testcase id="保单管理"> </testcase> |
4.1.3 参数分组
为了进一步提高测试用例的复用度,UniEAP UTF支持参数分组机制。测试用例文件中可以使用相同的参数,在测试场景文件中引用不同参数组可以实现在实际执行时输入不同的值。以人员登录为例:
l 测试用例文件
<method id="登录"> <event id="[input]用户名" value="${userAccount}"/> <event id="[input]密码" value="${userPassword}"/> <event id="[button]登录"/> </method> |
l 测试场景文件
<suite-files> <suite-file path="platform/登录.xml" paramGroup="admin"/> <suite-file path="platform/登录.xml" paramGroup="user"/> </suite-files> |
l 测试参数文件
实际执行效果分别如下:
注1:测试场景级和测试用例级参数支持分组,全局级参数不支持分组;
注2:如果定义了分组,则测试用例只能从当前分组中取值和赋值;
注3:参数分组不适用于“数据驱动测试”模式;
4.2 取值与赋值
4.2.1 静态参数赋值
静态参数赋值可以直接在Excel文件、属性文件(.porperties格式)中完成。
4.2.2 动态参数赋值
动态参数只在参数文件中声明,但是初始不能被赋值(只有参数名、没有参数值)。如下图所示:
动态参数可以在XML测试用例中赋值也可以在自定义Java代码中赋值。
l 在XML测试用例中赋值
<event id="[input]单位编号" name="setParam" value="单位编号"/> <event id="[sql]人数统计" name="setParam" value="总人数"/> |
l 在自定义Java类中赋值
ParameterUtil.setDynamicParamValue("paramName", "paramValue"); |
4.2.3 参数值取用
不论是静态参数还是动态参数,只有被赋值之后,值的取用方式都是一致的,并且可以在XML测试用例、SQL配置文件以及自定义Java类中取用。
l 在XML测试用例中取用
可以通过${paraName}的形式在测试用例中引用参数对应的值,可以引用参数的位置包括event的id、value属性、method的frame属性,以及测试场景文件中的include属性。
注:如果id属性使用的是标准的xpath,则在xpath中不能支持引用参数。
测试用例文件: <method id=“testid" frame="default.${frameVar1}"> <event id="username" name="setValue" value="${username}"/> <event id="[gridCell]${dynamicParam1}" name="click"/> </method> 测试场景文件: <suite-files> <suite-file path="用户管理/用户管理.xml" include="${包含方法}" /> </suite-files> |
l 在SQL配置文件中取用
<sql id="sql1" name="sql1" sql="select name from emp where id=${username}"/> |
l 在自定义Java类中取用
在Java中调用ParameterUtil.getValue("paramName");方法可以获取参数值。如果是自定义Event(继承com.neusoft.utf.webui.base.CustomEvent),只要在自定义类中声明一个与参数名称相同的全局公共变量(无需赋值),在整个类中就可以随时引用到对应的参数值。
public class DemoEvent extends CustomEvent { public DemoEvent(WebDriver driver, ITestEvent event) { super(driver, event); } //在此处声明公共变量,则在方法中就可以直接获取对应的值 public String username; public String dynamicParam1; public void method1(){ System.out.println("dynamicParam1="+dynamicParam1); System.out.println("username="+username); } } |
4.3 Excel文件格式
通常大部分测试数据可以存储在Excel中,Excel文件的格式是可以自定义的。
UniEAP UTF默认提供两种Excel格式,分别对应“流程驱动测试”和“数据驱动测试”两种执行模式。
“流程驱动测试”和“数据驱动测试”可以完全复用相同的测试用例,在实际应用时通常建议,采用组合使用的方式。
4.3.1 流程驱动测试
流程驱动测试是指主要通过测试场景文件中定义的测试用例流程,关联定义的Excel参数文件进行测试执行。测试场景文件中列举多少测试用例就执行多少测试用例。
流程驱动测试通常用于“流程大”、“数据少”的场景下,比如,被测系统有10个大的业务流程,每个流程通过少量的几组参数测试通过即可代表整个流程基本没有问题。
流程驱动测试模式下,Excel的默认格式如下(可自定义):
名称为“Common”的Sheet页用于存储测试场景级参数、测试用例级参数存储在与测试用例(testcase)的id属性同名的Sheet页中。
其中“参数名”、“ 参数组”不可为空,“参数值”可为空(代表是动态参数)。
4.3.2 数据驱动测试
数据驱动测试是指主要通过测试场景文件指定的Excel参数文件来驱动场景中定义的测试用例循环执行。即,Excel中有多少行数据,测试场景中的用例就被循环执行多少遍。
在数据驱动执行模式下,在测试执行文件需要配置为数据驱动的测试执行类:
<test name=“自动化测试样例"> <classes> <class name=" com.neusoft.utf.webui.datadriver.execute.ExecuteAllTest"> <methods> <include name="firefox/ie/chrome"/> </methods> </class> </classes> </test> |
数据驱动测试通常用于“流程小”、“数据多”的场景下,比如,保费试算,只有1个页面(如下图所示),对应的测试用例量也很少(如下图所示),但是需要使用大量的数据进行组合测试。
数据驱动测试模式下,Excel的默认格式如下(可自定义):
Excel内容说明如下:
l 只有一个名称为“Common”Sheet页;
l 第一行数据是参数名(第一列“enabled”除外);
l 第二行往下是参数值(第一列“enabled”除外),每行都会驱动测试用例执行一遍;
l 参数值可以为空,为空表示对应测试用例中关联的赋值event不执行;
l “第一行、第一列”如果为“enabled”,则“第一列、第二行”往下用于标识当前行是否参与本次执行,如果设为false则不参与执行,如果设为true或空,则参与执行;
l “第一行、第一列”如果不是“enabled”,则第二行及往下的所有行都参与本次驱动执行;
l “第二列(include)”代表了参与本次驱动执行的测试办法,多个方法之间用逗号分隔;场景文件的include属性直接配置include="${include}",UTF会直接从Excel中读取要执行哪些测试方法。
注:在数据驱动测试模式下,“测试用例级参数”和“参数分组”功能无效。
4.4 参数缓存定义
所有参数在测试支持时都会被提前加载到缓存中,缓存配置方式如下(ehcache.xml):
<!-- 参数缓存域 --> <cache name="parameters" maxElementsInMemory="10000" eternal="true" overflowToDisk="true" memoryStoreEvictionPolicy="LRU" /> <!-- 预期结果缓存域 --> <cache name="expectedResults" maxElementsInMemory="10000" eternal="true" overflowToDisk="true" memoryStoreEvictionPolicy="LRU" /> |
注:这部分配置通常不需要修改。
第5章
测试断言
在自动化测试过程中 “断言”通常都是需要人工插入的,而潜在的断言对象可能很多,预期结果也很可能发生变化(甚至是动态的),因此预期结果如果与脚本逻辑耦合在一起,会让测试脚本逐渐变得难以维护。 并且常见的测试工具提供的断言机制也难以对于UI样式或UI逻辑(比如,翻页图标应该灰显)进行断言。
以下图为例,有三处缺陷,传统的自动化测试工具都几乎无法发现。
1. 树的根节点比上一个发布版本多出来一条虚线,末端没有节点连接;
2. 表格只有一页,但“下一页”和“最后一页”按钮是可点击状态(没有灰显);
3. 在新增用户页面中,填写的必填项“入职日期”没有保存成功;
UniEAP UTF提供非常灵活、多样的断言机制,充分弥补传统测试工具在断言方面的不足,极大的提升测试效率和有效性。
UniEAP UTF具体提供的断言操作语法(assertEquals、assertExist等),详细请详细请参考“操作命名方式”章节。
5.1 页面控件断言
在测试执行过程中,可以在任何位置增加断言事件,来判断页面指定控件是否存在、控
件显示值是否为预期结果等。
Ø 语法示例
<event id="[input]姓名" name=”assertEquals” value=”张三”/> <event id="[gridRow]empList,张三" name=”assertExist”/> |
Ø 属性配置
属性名 | 说明 |
id | 支持界面所有控件类型。 |
name | 可选操作包括: assertEquals、assertNotEquals、assertNull、assertNotNull、assertMoreThan、assertMoreThanOrEqual、assertLessThan、assertLessThanOrEqual、assertExist、assertNotExist |
value | (可选)断言的预期结果。 |
5.2 数据库断言
在测试过程中经常需要访问业务数据库根据一些查询结果来判断测试结果的对错。UniEAP UTF支持在用例执行过程中嵌入SQL语句,从数据库中读取查询结果、判断对错。
Ø 语法示例
<event id="[sql]sql1" name=”assertEquals” value=”8”/> |
Ø 属性配置
属性名 | 说明 |
id | 以[sql]开头,后面跟SQL配置文件中的id。 详细请参考“SQL调用”章节。 |
name | 可选操作包括: assertEquals、assertNotEquals、assertNull、assertNotNull、assertMoreThan、assertMoreThanOrEqual、assertLessThan、assertLessThanOrEqual |
value | 断言的预期结果。 |
5.3 业务逻辑断言
当测试用例按照业务流程进行组织并运行时,如果某个步骤执行错误,则即使没有任何断言语句,当前步骤或后续步骤通常也会出现错误。
已上图为例,假设“增加记录”功能有缺陷,实际无法增加成功。如果测试用例按照“增加”、“查询”、“修改”、“删除”的流程组织。即使在没有任何断言语句的情况下,最迟在“修改查询结果”的步骤中也会出错(因为根本没有结果可供选中修改)。
按照以往自动化测试的经验,出现这种情况后就需要人工再去还原测试过程,判断错误原因。在使用UniEAP UTF自动化测试时,会生成图文并茂的测试报告,包括每个操作步骤、输入数据及界面截图。再出现上述情况后,测试人员只要通过测试报告就可以定位错误原因。
详细请参考“生成用户化的HTML报告”章节。
注1:其实“业务逻辑断言”并不是真正意义上的独立断言机制,是良好的测试设计和易读的测试报告组合使用达成的一种效果;
注2:实际进行自动化测试时,也建议对关键检查点进行页面控件断言(比如,保费计算结果),其它非关键检查点(比如,每增加一条记录,就判断一下是否增加成功)可以不必逐个增加断言语句;
5.4 页面级UI断言
在被测系统版本管理比较规范、发版比较频繁、对UI样式比较严格的情况下,可以考虑使用页面级UI断言的方式。该断言方式通过对比前后发布版本在相同测试用例和输入参数的情况下,页面截图是否严格相同来判断测试结果。
以“表格选中后的翻页缓存测试用例”为例:在当前页面选中3条记录,翻到下一页,然后再翻回当前页,之前的选中的3条记录应该依然处于选中状态。
如果此功能出现Bug,丢失了选中状态,UniEAP UTF就会自动生成如下图片,左侧是当前版本界面截图、右侧是历史版本界面截图,中间是突出差异图片,三图合一,便于查看。
此类差异的图片会生成到“浏览器\assert\diffLog\snapshot”文件夹下。
如果启用该断言,需要在测试执行文件中配置如下参数:
属性名 | 说明 |
webroot | 被测系统当前版本的访问地址。 |
webrootExpected | 被测系统历史对比版本的访问地址。 |
UICompare | 设置true。 |
autoCompare | 设置true。 |
注1:该断言方式无需任何断言语句,可以随时启用、停用;
注2:由于是像素级精准对比,所以能识别出页面样式、页面逻辑上的各种错误;
注3:该断言方法会产生误判(比如,两次点击按钮时,按钮的阴影效果不同),具体使用时需要人工对差异截图进行一次过滤排查;
注4:为了提高适用性,可能需要对被测系统进行局部修改(比如,临时注释掉右上角显示系统时间的代码);
5.5 自定义断言
在测试过程中如果一些断言的预期结果并不直接在前台显示,也不在数据库中(比如,需要读取日志文件、读取移动设备的状态),则可以通过自定义Java代码的方式来完成。
Ø 语法示例
<event id="[java]com.neusoft.utf.test.Demo. assert1 " name=” assertEquals” value=”张三”/> |
Ø 属性配置
属性名 | 说明 |
id | 以[java]开头,后面跟Java类全名(含包名).方法名。 注1:此Java类要继承com.neusoft.utf.webui.base.CustomEvent, 并重写父类的构造函数; 注2:方法不能有入参; |
name | 可选操作包括: assertEquals、assertNotEquals、assertNull、assertNotNull、assertMoreThan、assertMoreThanOrEqual、assertLessThan、assertLessThanOrEqual |
value | (可选)断言的预期结果。 注1:这个值也可以在Java类中可以直接通过value变量取用; |
Ø 自定义Java示例
public class Demo extends CustomEvent { public Demo(WebDriver driver, ITestEvent event) { //在任何方法中可以使用driver和event对象 super(driver, event); } public String assert1() { // 使用event中的value属性值 System.out.println("value=" + value); return "张三"; } } |
在自定义Java方法中可以与测试用例共享参数、WebDriver实例等信息。详细请参考“Java调用”章节。
第6章
测试报告
UniEAP UTF提供的测试报告不仅包括常见的测试用例通过情况的统计,而且提供浏览器内存占用、浏览器耗时占用、自动根据测试脚本生成Excel格式的测试用例、覆盖度统计(在“Web管理工具”中提供),甚至自动提交缺陷(需要根据缺陷管理工具扩展开发),等。
6.1 生成用户化的HTML报告
传统的自动化测试报告可读性很差,不能直观的体现整个测试过程。用户化的测试报告可以图文并茂、非常直观的充分还原整个测试过程。极大提升测试结果的分析效率,降低分析难度。UniEAP UTF默认会生成如下样式的HTML格式测试报告。
注:测试报告的格式和内容可以根据用户需求进行自定义。
测试报告使用说明如下:
l 总述
单次执行的所有场景、所有用例的通过率、耗时情况统计。
l 测试场景执行结果统计
列举每个测试场景的通过率、耗时情况。
l 测试过程记录
详细列举每个测试用例中、每个测试方法(对应method节点)、每个测试步骤(对应event节点)的操作描述、输入数据、执行成败及耗时情况。
Ø 无论执行成功或失败,每个测试方法会产生一个超链接,点击之后可以看到当前的界面截图(注,如果method设置为不截图,则没有超链接);
Ø 如果用例失败,则会红色显示,首个失败的测试步骤上会有个超链接,点击之后可以看到详细的错误信息;
6.2 生成浏览器内存占用报告
UniEAP UTF支持在自动化测试执行过程中监控每个测试方法执行后浏览器的内存占用情况,以检查被测系统是否存在内存泄露。
配置方法为在测试执行文件中增加browserResourceMonitor属性并设置为true,如下所示:
<parameter name="browserResourceMonitor" value="true"/> |
注1:在统计浏览器内存占用时,需要确保不要同时手工打开同一个浏览器做其它操作;
注2:需要确保Windows的RPC服务需要可用;
测试报告使用说明如下:
l 可以切换用折线或柱状图展现;
l 鼠标悬停到每个点上,可以提示对应的测试方法;
l 如果折线显示为平滑的锯齿状,则说明不存在内存泄露风险,如果持续增长则说明有内存泄露风险;
6.3 生成浏览器耗时分析报告
UniEAP UTF支持在自动化测试执行过程中随时监控页面展现耗时情况,以掌握整个应用的前端性能。
配置方法为在测试执行文件中增加browserTimeMonitor属性并设置为true,如下所示:
<parameter name=" browserTimeMonitor" value="true"/> |
注1:需要IE9、Firefox23以上等HTML5支持较好的浏览器;
注2:传统通过Findbug等其它调试工具看到的耗时不准确(可能达到实际耗时的2倍),因为打开这些工具本身就消耗资源;
测试报告使用说明如下:
l 可以切换用折线或柱状图展现;
l 鼠标悬停到每个点上,可以提示对应的测试方法;
6.4 生成Excel格式测试用例
UniEAP UTF支持根据XML格式的测试用例文件自动生成Excel格式的测试用例,有效减少文档格式测试用例的维护成本,并保证用例和软件功能的及时同步。
配置方法为首先在utf.properties文件中配置testCaseGenerator属性,如下所示:
testCaseGenerator= com.neusoft.utf.webui.reporter.testcase.ExcelTestCaseGenerator |
注:如果上述默认实现生成的测试用例格式如果不满足需求,可以自定义;
具体生成Excel测试用例也是通过运行测试执行文件实现的,所以还要在测试执行文件中配置如下信息:
<parameter name="testcaseFile”value="D:\测试用例.xls"/> <test name="生成测试用例"> <classes> <class name="com.neusoft.utf.webui.reporter.testcase.ExecuteGenerator"> <methods> <include name="generateTestCase"/> </methods> </class> </classes> </test> |
说明如下:
l testcaseFile:配置为要生成的Excel文件名称及路径;
l classes节点:按照上述方式配置,不可修改;
l 其它配置参考测试执行文件配置相关章节;
测试用例使用说明如下:
l 生成的Excel中每个测试场景对应一个Sheet页;
l 一级用例、二级用例、操作步骤、操作数据分别对应测试脚本中的测试用例、测试方法、测试步骤和数据;
l 静态参数的值可以显示出来,但动态参数不会被显示(因为没有实际执行用例);