软件测试技术
东北大学软件学院
吴辰铌
第七章 软件测试自动化
• 主要内容
• 软件测试自动化基础
• 何时进行自动化测试
• 如何进行测试自动化开发
• 对测试自动化的不正确期望
• JUnit的使用
• Winrunner的使用
软件测试自动化基础
• 什么是软件测试自动化?
•只需购置一种流行的测试执行工具,记录手工
测试过程,然后在需要时回放录制的过程。
没这么简单
软件测试自动化基础
• 软件测试自动化的定义:
• 各种测试活动的管理与实施,包括测
试脚本的开发与执行,以便使用一种
或多种自动化测试工具来验证需求。
软件测试自动化基础
• 为什么要进行自动化测试?
• 手工测试的局限性
•通过手工测试无法做到覆盖所有代码路径。
•许多与时序、死锁、资源冲突、多线程等有关的错
误通过手工测试很难捕捉到。
•在系统负载、性能测试时,需要模拟大量数据、或
大量并发用户等各种应用场合时,也很难通过手工
测试来进行。
•在进行系统可靠性测试时,需要模拟系统运行十年、
几十年,以验证系统能否稳定运行,也是手工测试
无法模拟的。
• 如果有大量(几千)的测试用例,需要在短时间
内完成,手工测试又怎么办呢?
•测试可以发现错误,并不能表明程序的正确性。
软件测试自动化基础
• 为什么要进行自动化测试?
• 机器代替人
•可以更频繁的测试
•每一次做同样的测试
• 做更多的测试
•减少了烦闷的、重复性的工作。可用时间来
检查结果。
• 更多的时间用来做手工测试和寻找Bugs。
软件测试自动化基础
• 为什么要进行自动化测试?
• 自动化可进行一些高难度的测试
• 性能, 压力, 配置
• 一致性
• 性能测试, 回归测试
• 可重复使用
• 稳定性
• 增进测试人员与开发人员之间的合作伙伴关系
软件测试自动化基础
•什么情况下适合使用自动化测试工具?
•需要反复进行的工作。
•负载压力测试。
•大量的测试人员和开发人员合作完成一个
产品。
•需要进行测试系统后台或者内部的性能特
性,进而进行故障定位和性能调优。
软件测试自动化基础
•自动化测试的局限性:
•定制型项目。
•周期很短的项目。
•业务规则复杂的对象。
•人体感观与易用性测试。
•不稳定的软件。
•涉及物理交互。
软件测试自动化基础
• 假如一个功能测试用例,手工运行需要10分钟,
而为此测试用例开发脚本需要4个小时,即240分
钟,那么意味着这个测试脚本要被运行24次收回
成本,如果再加上测试脚本的维护工作量(10%)
,需要重复运行40-50次,才收回成本。如果在
产品的一个版本中要进行2-3轮测试(一般是需
要的),这个产品需要发布15-20个版本才收回
成本。
• 所以业界常说,产品发布7个版本才收回成本。
软件测试自动化基础
结构 成本 收益 净收益
非自动化 0 0 0
录制和回放 11
数据池的数据驱动结构 18
框架结构 15
侧重于应用和数据池的框架/数据驱动结构 19
测试自动化成本/收益分析
软件测试自动化基础
• 手工测试与自动化测试的特点对比:
• 在系统功能逻辑测试、验收测试、适用性测试、涉及物
理交互性测试时,多采用黑盒测试的手工测试方法;
• 单元测试、集成测试、系统负载或性能、稳定性、可靠
性测试等比较适合采用TA;
• 对那种不稳定软件的测试、开发周期很短的软件、一次
性的软件等不适合测试自动化
• 工具本身并没有想象力和灵活性,根据经验报道,自动
测试只能发现15%的缺陷,而手工测试可以发现85%的
缺陷;TA工具在进行功能测试时,其准确的含义是回归
测试工具,因为工具不能发现更多的新问题,但可以保
证对已经测试过部分进行测试的准确性和客观性
软件测试自动化基础
• 什么测试类型能够自动化:
• 单元测试
• 集成测试
• 系统测试
• 性能测试
• 压力测试
• 安全测试
• 回归测试
•稳定性测试
软件测试自动化基础
• 测试自动化的基本结构
机房
办公室
文件服务器
SQL Server
Web服务器
控制程序
拷贝测试文件
拷贝测试结果
分派工作
分派工作
查询结果
Build系统编译
寻找工作项目
更新
显示
Dev Build, Test Build
软件测试自动化基础
• 自动化测试的原理和方法
• 代码分析:类似于高级编译系统,在工具中
定义类/对象/函数/变量等定义规则、语法规
则等,在分析时对代码进行语法扫描,找出
不符合编码规范的地方。代码分析是一种白
盒测试的自动化方法。
• 捕获和回放:捕获和回放则是一种黑盒测试
的自动化方法。
软件测试自动化基础
•自动化测试的原理和方法
•脚本技术:
• 线性脚本,是录制手工执行的测试用例得到的脚本,这种
脚本包含所有的击键、移动、输入数据等,所有录制的测
试用例都可以得到完整的回放。
• 结构化脚本,类似于结构化程序设计,具有各种逻辑结
构、函数调用功能。结构化脚本易于维护。
• 共享脚本,是指某个脚本可以被多个测试用例使用。
• 数据驱动脚本,将测试输入存储在独立的(数据)文件
中,而不是存储在脚本中。
• 关键字驱动脚本,是数据驱动脚本的逻辑扩张
软件测试自动化基础
• 自动化测试的原理和方法
• 自动比较:
• 静态比较和动态比较
• 简单比较和复杂比较
• 敏感性测试比较和健壮性测试比较
• 比较过滤器
• 测试管理
软件测试自动化基础
• 自动化测试工具的分类:
• 单元测试工具:
• Panarama
• Junit
• C++Testing
• 负载和性能测试工具:
• LoadRunner
•WAS
• QALoad
软件测试自动化基础
• 自动化测试工具的分类:
• 功能测试工具:
•WinRunner
• QuickTest
• Rational Functional Tester
• 测试管理工具:
• TestDirector
• TestManager
• TrackRecord
软件测试自动化基础
• 测试工具的选择
何时进行自动化测试
• 自动化测试投资阶段:
• 早投资
• 在设计时考虑
Planning (M0)
Major Milestone
Phase
M1,2…
Release Phase
Time
Testing
Investment
Testing
Phase
如何进行测试自动化开发
•测试自动化的开发流程:
• 自动测试决定
• 测试工具获取
• 自动测试引入过程
• 测试计划、设计与开发
• 测试执行与管理
• 测试评审和评估
如何进行测试自动化开发
自动化测
试生存周
期方法学
1. 自动化测试决定
2. 测
试
工
具
获
取
3. 自动化测试引入过程4. 测试计划、设计与开发
5. 测
试
执
行
管
理
6. 测试评审与评估
A. 系统生存周期过程评估与改进F. 生成维护阶段
C. 小型工具先导/原型D. 系统设计与开发阶段
B
. 业
务
分
析
与
需
求
阶
段
E
. 组
装
与
测
试
阶
段
如何进行测试自动化开发
• 测试自动化的开发过程中需要考虑的问题:
•测试需求:除用户需求外,应明确概述能够在大
限度发现错误所需要的测试条件。
• 遵循一定的测试框架。
• 最大限度的发挥重用。
对自动化测试的不正确期望
• 我们在时间上是紧迫的,项目已经落后了,
让我们使用自动化测试吧!
• 我们要100%的实现测试自动化。
• 我们不需要进行培训。
对测试自动化的不正确期望
• 正确认识测试自动化
• 不现实的期望注定测试自动化的失败
• 测试自动化能:
• 显著降低重复手工测试的时间
• 建立可靠、重复的测试,减少认为错误
• 增强测试质量和覆盖率
• 测试自动化不能:
• 完全替代手工测试和手工测试工程师
• 保证100%的测试覆盖率
• 弥补测试实践的不足
JUnit的使用
• JUnit简介
• JUnit的设计方法
• JUnit的使用步骤
• 测试惯例
JUnit简介
• 在JUnit中编写的测试帮助你以一种极大(extreme)的步伐编写程序
及快速的找出缺点。
• JUnit非常简单
• JUnit测试检验其结果并提供立即的回报。
• JUnit可以把测试组织成测试系列
• JUnit测试是开发者测试。
• JUnit测试是以Java写成的,形成一个介于测试及程序代码间的无
缝(seamless)边界
• JUnit是免费的
• JUnit是以两个关键设计样式来设计的:指令样式(Command
pattern)及合成样式(Composite pattern)。
• TestCase是一个指令对象。任何包含测试方法的类别都是TestCase的子类
别。TestCase可以定义任意数量的testXXX()方法。当你要检查期望与实
际的测试结果,你激活assert()方法的各种类型(variaton)。
JUnit的设计
• TestCase子类别包含多个testXXX()方法;
• 可以使用setUp()及tesrDown()方法初始化及释
放测试下的任何一般的对象,这个子类别形同
测试的基础设备(fixture)。
• 每一个测试在其本身基础设备的背景下执行,
在每一个测试方法之前呼叫setUp()及之后呼叫tearDown
()以确保没有副作用影响测试的执行。
JUnit的设计
• TestCase实例对象可以合成为TestSuite层级架构;
• 在这个TestSuite层级架构中可以自动激活定义在TestCase
实例对象中的所有testXXX()方法。
• 一个TestSuite是其它多个测试的一个合成对象(composite)
,其中包括TestCase实例对象及其它的TestSuite实例对象。
• 这个由TestSuite代表的合成对象行为允许你组合测试的测
试系列的测试系列到任意深度,并且自动一致性
(uniformly)的执行所有测试以产出个别的通过或失败的状
态。
JUnit的使用步骤
• 第一步 编写一个测试案例
• 第二步 编写一个测试系列
• 第三步 执行测试
• 第四步 组织测试
JUnit的使用步骤
• 第一步:编写一个测试案例
• (1)定义一个TestCase的子类别。
• (2)覆写setUp()方法以初始化测试中的一个或多
个对象。
• (3)覆写tearDown()方法以释放测试中的一个或
多个对象。
• (4)定义一个或多个公开的testXXX()方法;这
些方法检验这些测试中的对象并且评估期望的
结果。
JUnit的使用步骤——范例代码1
下列是一个测试案例的范例:
测试案例的范例(Example Test Case)
import ;
import ;
import ;
public class ShoppingCartTest extends TestCase {
private ShoppingCart _bookCart;
private Product _defaultBook;
/*
以特定名称建构一个ShoppingCartTest。
建构函数是以测试案例的名称当作参数
*/
public ShoppingCartTest(String name) {
super(name);
}
JUnit的使用步骤——范例代码2
/*
设定测试设备
在测试案例方法之前呼叫
*/
protected void setUp() {
_bookCart = new ShoppingCart();
_defaultBook = new Product("Extreme Programming", );
(_defaultBook);
}
/*
释放测试设备
在测试案例方法之后呼叫
*/
protected void tearDown() {
_bookCart = null;
}
JUnit的使用步骤——范例代码3
/*
测试在cart中增加一个产品
*/
public void testProductAdd() {
Product newBook = new Product("Refactoring", );
(newBook);
double expectedBalance = () + ();
assertEquals(expectedBalance, (), );
assertEquals(2, ());
}
/*
测试清空cart
*/
public void testEmpty() {
();
assertTrue(());
}
JUnit的使用步骤——范例代码4
/*
测试从cart中移除产品
如果此产品不在cart中丢出一个ProductNotFoundException的例外
*/
public void testProductRemove() throws ProductNotFoundException {
(_defaultBook);
assertEquals(0, ());
assertEquals(, (), );
}
/*
测试从cart中移除一个未知的产品
如果ProductNotFoundException例外产生表示测试成功
*/
public void testProductNotFound() {
try {
Product book = new Product("Ender's Game", );
(book);
fail("Should raise a ProductNotFoundException");
} catch(ProductNotFoundException success) {// 测试成功
}
}
JUnit的使用步骤——范例代码5
/*
组合并传回一个这个测试案例所有测试方法的测试系列
传回一个非空值(non-null)的测试系列
*/
public static Test suite() {
//这里使用的想法是加入所有的testXXX()方法到测试系列中。
//
TestSuite suite = new TestSuite();
//下面是另一种作法,但增加愈多的测试案例方法愈有可能发生错误
//
// TestSuite suite = new TestSuite();
// (new ShoppingCartTest("testEmpty"));
// (new ShoppingCartTest("testProductAdd"));
// (new ShoppingCartTest("testProductRemove"));
// (new ShoppingCartTest("testProductNotFound"));
//
return suite;
}
JUnit的使用步骤——范例代码6
/*
执行此测试案例(Runs the test case)
*/
public static void main(String args[]) {
(suite());
}
}//范例代码结束
的使用步骤
• 第二步:编写一个测试系列
• 编写一个测试系列其中包含许多测试案例。此
测试系列将允许我们从头到尾执行其所有的测
试案例。编写测试系列请依循下列的步骤:
• (1)定义一个TestCase的子类别。
• (2)定义一个静态的suite()工厂方法;这个方法构建一
个TestSuite以包含所有的测试。
• (3)随意定义一个main()方法以批次方式执行这个
TestSuite。
的使用步骤——代码范例1
下列是测试系列的范例:
测试系列范例(Example Test Suite)
import ;
import ;
import ;
public class EcommerceTestSuite extends TestCase {
/*
以特定名称建构一个EcommerceTestSuite
建构函数是以测试案例的名称当作参数
*/
public EcommerceTestSuite(String name) {
super(name);
}
的使用步骤——代码范例2
/*
组合并传回一个测试系列包含所有已知的测试。
新的测试应该在此加入
传回一个非空值(non-null)的测试系列
*/
public static Test suite() {
TestSuite suite = new TestSuite();
//我们在前面构建的ShoppingCartTest
(());
//另一个测试系列的范例,在测试系列中加入其它的测试系列
(());
return suite;
}
/*
执行此测试系列
*/
public static void main(String args[]) {
(suite());
}
}
的使用步骤
• 第三步执行测试
• 我们可以执行这个测试系列或者其中任何个别的测试案例。执行TestSuite将自
动执行所有的TestCase及TestSuite实例对象。执行一个TestCase将自动激活其
所有公开的testXXX()方法。
• JUnit提供文字及图形使用者界面。两种使用者接口都可以指出多少个测试被
执行、任何错误或失败、及一个简单的完成状态。简化使用者接口是快速执行
测试的关键。你应该简单了解就能够执行你的测试并知道测试的状态,就像你
在编译上所做的一样。
• 文字使用者接口()如果通过所有测试则显示『OK』而
如果失败则显示失败讯息。
• 图形使用者界面()显示浮动窗口;如果所有测试皆通
过则其中有一个进度杆显示为绿色,否则进度杆显示为红色。
• 一般而言,TestSuite及TestCase类别应定义一个main()方法;main()利用适当
的使用者接口。我们写的测试到目前为止皆定义一个main()方法来使用文字使
用者接口。 由main()定义的使用文字使用者接口执行我们的测试案例时,使用:
java ShoppingCartTest
• 另一种方式,使用文字使用者接口执行测试,使用:
ShoppingCartTest 或这使用图形使用者接口时,
使用:
ShoppingCartTest
EcommerceTestSuite可以以类似的方法执行。
的使用步骤
• 第四步:组织测试
• 把测试案例建立在与我们要测试的程序代码相同的包裹(package)中。
• 在你的原始码资料夹中避免结合应用程序与测试程序代码,建立一个
镜像(mirrored)的资料夹结构对应于此包裹结构;并在镜像资料夹中存
放你的测试码。 为你的应用程序中的Java包裹定义一个TestSuite类别;
在这个TestSuite类别中包含所有测试这个包裹内之程序的测试。
• 定义类似的TestSuite类别;此TestSuite类别在此应用程序中的其它包
裹(及子包裹)中构建高层及低层测试系列。 确认你的建构程序包含
所有测试的编辑物(compilation)。这样做有助于确认你的测试可以保持
与最后的程序代码同步以维持测试是最新的。
• 经由在每一个Java包裹中建立一个TestSuite,在各种包裹层次中,你可以
在每一个抽象层中执行一个TestSuite。例如,你可以定义一个
执行系统中所有的测试,及定义一个
只有执行电子交易组件的
测试。
• 测试层级架构可以扩充到任意的深度。其深度与你开发系统的抽象层次有
关,你可以执行一个相称的测试。只要选择你的系统层次并测试它即可。
的使用步骤
测试层级架构范例(Example Testing Hierarchy)
AllTests (Top-level Test Suite)
SmokeTestSuite (Structural Integrity Tests)
EcommerceTestSuite
ShoppingCartTestCase
CreditCardTestSuite
AuthorizationTestCase
CaptureTestCase
VoidTestCase
UtilityTestSuite
MoneyTestCase
DatabaseTestSuite
ConnectionTestCase
TransactionTestCase
LoadTestSuite (Performance and Scalability Tests)
DatabaseTestSuite
ConnectionPoolTestCase
ThreadPoolTestCase
测试习惯
• 当你测试时请谨记下面的事项:
• (1)软件运作良好的事物都是经过测试检验的
• (2)测试一点点,程序代码写一点点,测试一点点,程序代
码写一点点......
• (3)请确认所有测试都能100%通过
• (4)每天至少执行系统中所有的测试一次
• (5)要测试的程序代码是最可能错误的区域。
• (6)编写最可能回报测试投资的测试。
• (7)如果你使用()除虫,写一个测试自动
检查其结果。
• (8)如果发现臭虫,写一个测试揭露这个臭虫。
• (9)如果下次有人要求你帮他除虫,帮他写一个测试。
• (10)编写程序代码之前先写单元测试;而且只有当一个测
试失败才写新的程序代码。
WinRunner的使用
• WinRunner简介
• 企业级软件功能测试工具
• 录制-回放功能
• 适用于不同的开发工具
• 使用方便,脚本易于维护
WinRunner的使用
• 两种记录(Recording )模式
Context Sensitive Analog
When the application is
based on GUI objects
When the application has non
-GUI area
Default mode
When mouse traces are
necessary for correct
execution
Recommended
When you are unable to use
context Sensitive mode
WinRunner的使用
• WinRunner Add-In管理
• WinRunner在Context Sensitive记录模式下
是通过先识别GUI对象、然后根据用户操作
来产生相应的Function加到Script中
• 对于不同开发语言(环境),GUI对象的识
别需要不同的Add-In
• 即使有对应的Add-In,WinRunner仍然不能
很好地识别自己开发的GUI 对象(如Delphi
VCL),后面将专门讲如何解决
WinRunner的使用
• 记录Script
• 1、先将光标移动到要插入Script的地方
• 2、启动要录制的Application
• 3、按红色按钮开始录制
• 4、停止录制
WinRunner的使用
• 三种运行模式
• Update
Update 模式用于更新Verfiy方式允许用到的各种Checkpoint比较的
基准(Baseline)
Checkpoint将在后面提到
• Verify
Verify模式指正式运行
• Debug
Debug模式用于调试。
结果都会保存在Script保存的目录下
WinRunner的使用
• Synchronization Point
• 三种同步方式:GUI对象属性、GUI对于位
图、屏幕位图(Bitmap)
• 使用同步点主要用于测试Script的下一步必
须等待某一特定条件满足后才可以运行
• 同步最长等待时间为obj_wait_info制定的时
间加上General Option->Run->Delay for
window Synchronization指定的时间
• 在某种意义上Synchronization可以用
CheckPoint来代替
WinRunner的使用
• Checkpoint
• 三类CheckPoint:GUI对象、Bitmap、数据库
• CheckPoint最长等待时间在General Option-
>Run->Timeout for Checkpoint and CS
statements
WinRunner的使用
• 数据库CheckPoint
• 三种数据库CheckPoint:Default、Custom、
Runtime
• Default和Custom用于纯粹的数据库检查(不
和前台GUI内容比较),Runtime将把数据中
的内容和前台界面中的GUI对象的某一属性
值进行比较
• Default和Custom的不同在于Custom在最后
将调出CheckList编辑窗口
WinRunner的使用
• 使用数据库CheckPoint注意
• 使用数据库CheckPoint应该注意输入SQL的合法性,
保证在CheckList编辑窗口中的属性都是可以比较的。
WinRunner的使用
• 使用Runtime CheckPoint
• Runtime Checkpoint用于在运行时刻比较数
据库中的内容和Application中某些GUI的特
定属性是否相符
• 注意,RuntimeCheckpoint只能直接比较,
对于某些经过转换,若TRUE则某个
Checkbox被选中这类是无法比较的,如果
要进行这类比较,可以考虑先使用GUI
Checkpoint,然后使用一般的数据库
Checkpoint
WinRunner的使用
• 动态更新SQL
• 数据库Checkpoint使用的SQL语句保存在
Script目录下的Chklist目录下
• 在实际使用中,特别是使用数据驱动(数据
驱动将在后面提到)时候对数据库的效验往
往要修改SQL中的某一参数,对于这中情况,
可以通过I/O Functions或者一段Script在进
行数据库Check前修改数据库Checkpoint使
用的sql语句
WinRunner的使用
• 不使用Update方式修改BaseLine
• CheckPoint可以通过菜单Insert下的Edit
XXX CheckList来修改
• 对于一般的数据库CheckPoint,如果由于某
种特殊原因修改返回内容的baseline,可以
通过菜单Tools->Test Result打开任何一个测
试结果双击数据库Checkpoint点打开数据库
Check Result结果窗口来修改
WinRunner的使用
修改BaseLine(Expected Value)
WinRunner的使用
• 数据驱动(Data Drived)
• 数据驱动的来源可以有EXCEL或者TXT文
件,建议不使用TXT文件
• 数据驱动的主要函数可以看TSL帮助Data-
Driven Test Functions
• 注意EXCEL可以采用写方式打开,这样可
以把结果写回到EXCEL中
WinRunner的使用
使用DataDriver Wizard
• 注意:使用Wizard前要先选择要包括的语句
WinRunner的使用
• 选择数据表(EXCEL)保存位置
WinRunner的使用
• 为数据选择列名称
WinRunner的使用
• 直接在Excel中修改数据
WinRunner的使用
• 修改DataDriver 产生的语句
• table = "";
rc = ddt_openddt_open(table, DDT_MODE_READ);
if (rc!= E_OK && rc != E_FILE_OPEN)
pause("Cannot open table.");
ddt_get_row_countddt_get_row_count(table,table_RowCount);
for(table_Row = 1; table_Row <= table_RowCount; table_Row
++)
{
ddt_set_rowddt_set_row(table,table_Row);
obj_type
("TMBEdit",ddt_valddt_val(table,"Name")&"<kReturn>");
obj_type
}
ddt_closeddt_close(table);
注意:DDT_OPEN可以采用写方式打开
WinRunner的使用
• 使用GUI config
• 使用Gui Config的主要目的是
• 修改WinRunner学习中的错误
• 让WinRunner学习一些非开发环境标准控间的
GUI对象
WinRunner的使用
• 使用GUI Config增加新的GUI类
WinRunner的使用
• GUI类的三类属性
• 对于一个GUI类,WinRunner将其的属性分
为三类:Available 、 Obligatory、Optional
• Obligatory值必须记录的属性,WinRunner
一般通过Obligatory类别中的属性来区别同
一窗口(或GUI容器)下同类的GUI对象
• Optional指可选项,当WinRunnber无法通
过Obligatory中的属性来识别同一类GUI对
象时候,将使用Optional中的属性
WinRunner的使用
修改GUI类的识别方式-Step1
WinRunner的使用
• 修改GUI类的识别方式-Step2
• 对于一个新增加的GUI对象,如果可以的话,
尽量从Mapped to Class中选择一个相似的类
• 如果无法从Mapped to Class中选择一个相似
的,而且在scirpt运行时发现WinRunner无
法识别该对象,就要考虑修改Obligatory或
Optional列表中内容(建议修改Obligatory)
WinRunner的使用
• 使用GUI Map Editor主要目的是
• 用来修改WinRunner识别后的GUI对象的属性值,主要是使
用通配符(wildcard)来替代某些属性
• 保存和导入GUI Map文件
• 注意:当你录制完某一Script必须保存GUI Map否则
一但退出WinRunner由于GUI Map不存在,以后将
很可能无法运行已前录制好的Script。
• 建议:将GUI Map文件和Script保存在同一目录,将
Script第一行使用GUI_load装入Script使用到的Gui
Map文件
WinRunner的使用
• 使用通配符来识别GUI对象
WinRunner的使用
通配符列表
符号 用途
. 任何单一字符
[0-9] 任何数字
[A-Z] 任何大写字母
[a-z] 任何小写字母
[m,f] 这里m,f可以是任意字符,[m,f]表示可以是字符m或者f
*
任何循环字符(any repetition of previous charactre or
expression)
.* 任何字符组成的字符串
WinRunner的使用
• 使用自定义函数
• in、out、inout类型参数
• 使用TSL函数要特别注意TSL并不检查
你调用某一函数时候参数格式和类型
是否匹配
• 参数可以是GUI对象
WinRunner的使用
• 一个Function例子
• function myFunction(in InPara,out OutPara,inout InOutPara)
{
pause(InPara);
pause(OutPara);
pause(InOutPara);
InPara="Change in para";
OutPara"=Change out para";
InOutPara="After function called";
};
InPara ="InPara";
OutPara="OutPara";
InOutPara="Before function called";
myFunction(InPara,OutPara,InOutPara);
pause(InPara);
pause(OutPara);
pause(InOutPara);
WinRunner的使用
• 使用Complied Module
• Complied Module也成为Lib,是
WinRunner用来存放公共Function的Script
• 可以通过菜单File->Test Properties打开属性
窗口,然后修改General->Test Type将Scirpt
改为Complied Module
• 只有Complied Module才可以用reload函数
加载
• Complied Module里除函数体内外不能有可
执行的Script语句,只能有变量和常量声明
语句
WinRunner的使用
• 将自定义函数加到WinRunner的函数列表中
• 从菜单Create->Insert Function可以进入如下窗口
WinRunner的使用
一个加载的例子
reload("c:\\Test\\MyLib",1,1);
generator_add_category("MyCategory");
generator_add_function("myFunction","Test
myFunction",3,
"InPara","select_list(aaa bbb)","aaa",
"OutPara","type_edit","OutPara",
"InOutPara","type_edit","InOutPara");
generator_add_function_to_category
("MyCategory","myFunction");
WinRunner的使用
• Startup Test
• Startup Test指运行WinRunner后立即执行
的Script
• 可以同菜单Setting->General Option打开设
置窗口,在修改Enviroment->Startup Test
来设置
• 建议将加载常用函数的Scirpt(包括其它想
在WinRunner运行后立即指定的动作)设置
为Startup Test
WinRunner的使用
• 几点建议
• 如果使用了第三方控件或自己开发的控件,
应当先使用Gui Map Configuration学习然后
开始录制Script
• 一般情况下应用程序的打开应该放在Script
的开始(使用invoke_application)
• 将GUI Map文件和Script保存在同一目录,
将Script第一行使用GUI_load装入Script使
用到的Gui Map文件