4Test 简明语法教程及SilkTest入门-----把压箱底的原创拿出来发
(把压箱底的原创拿出来发,只发到第四章)4Test 简明语法教程及SilkTest入门
by ryewhisky
Email: czcooper@gmail.com
第一篇:基本运算和概念
4test是干什么的,能找到这篇文章的估计都了解,我就不废话了,直接入题
4test的运算符:
4test的运算符基本上都和从左到右的,比如:::,->,(),[],* / % **, + -,== !=等等。
有几个是例外的,它们的运算顺序是从右到左的,比如:
@, ! ~ unary- unary+ ++ --
像++或--这种数学运算符,我们下面会讲到。
加减单目运算:(和c++像)
赋值形式为:
X=-5 // X被赋值为+5
X=+5 //X被赋值为-5
++自加和--自减方式和C++语言规则一样:
n=10
x=++n //运行完,x为11
或
N=10
y=n++ //运行完,y为10,n为11
数学运算:
+ -*/%表示的意义和C++语言中一样,分别是加,减,乘,取模,取余;
**求幂这个符号在C++语言中没有,似乎C语言中也每有这个符号,这个符号来自Fotran语言的求幂操作**,在4test语法中它的含义是也是求幂。
用+-进行的集合运算:
集合C=集合A+集合B //这表示集合C的成员为集合A和集合B的并集
集合A=集合C-集合B //这集合A由表示属于C但不属于B的的成员构成(相对补集的概念)
举例(书上的例子)
Red-{Green, Blue} //结果为Red
Red-{Red,Green, Blue} //结果为空
逻辑运算符:
&―――与
||――――或
!――――非
位运算符(Bitwise operators):
什么叫位运算?很简单,位(bit)就是单个的0或,和C++语言一样,有6种位运算:
& 与运算 //两个位置都为1时,结果为1,其他的结果都等于0
| 或运算 //两个位置只要有一个位置为1,则结果为1。
^ 异或运算 //两个位置不相等时,结果为1,否则为0
~ 非运算(求补) //取反,0变成1,1变成0
>> 右移运算 //算子从高位向低位移动
<< 左移运算 //算子从低位向高位移动
If条件语句:
格式如下
If (布尔表达式)
字句1
else
字句2
跟简洁的表达方式是: (布尔表达式)?字句1:字句2
是不是很熟悉,哈哈,基本每个语言都是这样的。
数组结构:
格式有以下几种:
{a,b} //元素之间用逗号隔开,比如 LIST MyList ={“a”,“b”}
{…} //下面跟字母要素,一行表示一个 ,如 SET Colors ={…}
Red
Green
<text> //这个就是后面跟的是文本, 关键字是text , 如LIST MyList =
<text>
A
“b”
c //最后一项指<tab>c,前面有个空格
[ 本帖最后由 ryewhisky 于 2007-8-16 19:00 编辑 ] 连接操作:
这个是指用+号把两个字符串或数组接起来, 前提是必须都是字符串或数组。
书上的例子:
//string concatenation
STRING sFirstName = “Bullwinkle”
STRING sLastName =“Moose”
// “ ” writes a space
STRING sFullName = sFirstName + “ ”+ sLastName
//prints : Bullwinkle Moose
Print (sFullName)
//list concatenation
LIST lsMelon = {…}
“watermelon”
“ cantaloupe”
LIST lsBerry = {…}
“strawberry”
“raspberry”
LIST lsFruit = lsMelon +lsBerry
Print (lsFruit)
//Prints
//{watermelon, cantaloupe, strawberry, raspberry}
类型转换操作:
格式
expr
表示把expr所表示的类型转换成[ ]里面的那种类型
例子:
testcase CastStringToInt()
STRING sName = “SilkTest”
Print( sName== 81) //强制转换成整形,这时候输入的是Silktest的首字母S的ASCII值
Member-of 操作:
这个就是OOP中的.的用法,取的对象的属性或服务,要结合面向对象语言的特点来了解,因为4test也是门面向对象的脚本语言,比如
TextEditor.Search.Find.Pick ()
又如取当前打开的文件的名字:
FileOpen.Filename.sValue = "test.txt"
引用(Reference operator):
这个就是用字符@指引的操作,格式是@expression,用来告诉编译器去哪里去数据,@后面可以接函数,方法,控件,字窗口或具体的值等多种形式,help里只列举了一个很简单的例子:
INTEGER i = RandInt (1,32)
@("Test{i}") ()
这个语句是让编译器去Test{}中去取数据,i没有确切的值,所以有可能是Test1或 Test2,,,, 下面是从枚举类型中引用的例子:
type COLOR is enum
>Red
>Green
>Blue
window DialogBox MyDialog
>CheckBox Red
>CheckBox Green
>CheckBox Blue
VOID MyFunction ()
>COLOR eColor
>for each eColor in ValuesOfEnum (COLOR)
MyDialog.@( eColor).SetState (TRUE)
Machine handle operator:
讲这个Machine hadle之前必需了解一下silktest中的所谓的Agent的概念,在ST的宣传稿中我们经常可以发现ST把整套工具分成两部分来讲了:
一方面是它的IDE,它ST的图形界面(GUI),可以用来开发,编辑,运行和调试4test文件。
另外一个就是Agent,它就是用来把4test脚本中的命令转换成GUI专用的命令的,可以把它理解为Agent就是IDE放出来放在AUT上面的解释测试脚本的程序,或在录制脚本时,把测试人员的动作转换成脚本回传给IDE的这么一个东西,可以把IDE看成是个Server。
IDE能够与Agent进行实时通讯,所以Agent和IDE是否在同一台PC上并不重要,测试时可以让IDE根据测试场景驱动多个Agent与它通讯。
在程序中有某句的句柄(handle),在我们这里机器也有机器的handle,就是测试环境中的机器的标签的意思(其实少的话,用计算机名足已),测试中全靠HMCACHINE值来识别机器。HMACHINE是4test的一种数据类型,以下是几个和HMACHINE相关的函数:
SetMachine()//把特定的机器设成当前活动的机器
GetMachine()//返回当前机器的HMACHINE值,这个值可能是通过Connect或SetMachine设置的
Connect () //连接某个特定的机器,并返回其HMACHINE值
看一个例子:
Example
HMACHINE target_machine // 定义了target_machine的类型为HMACHINE
HMACHINE host_machine // 定义了host computer的类型为HMACHINE
STRING sTarget = "sunfish"// sunfish为远程主机在网络中的计算机名
STRING sHost = "moonray" // moonray为本地主机在网络中的计算机名
host_machine = GetMachine () //获得本地主机的HMCHINE值
target_machine = Connect (sTarget) //获得远程主机的HMCHINE值
Print ("Active window on Target: ", Desktop.GetActive ()) //取得远程主机上正在运行的窗口
SetMachine (host_machine) //切换回本地主机,就是把本地主机设成当前机器
Print ("Active window on Host: ", Desktop.GetActive ()) //取得本地主机上正在运行的窗口
Disconnect (target_machine) // 断开远程主机
现在回到我们的Machine handle operator, 它有两种表达方式:
hMachine->distrib_func //箭号
和
distrib_func //[]号
其实都是让哪台机器干某哪种活的意思,如
TextEditor.Search.Find.Pick
["server"]doThis()
Scope resolution operator:
Shorthand assignment syntax: 第二篇:4Test语言和C语言对比
这个章节主要要说明一下4Test和C语言的不同之处。
ANYTYPE 类型:
首先出场的就是这种NB哄哄的类型,它可以囊括所有你想要的类型,因为它就是 any type,直译就是任何类型,NB吧!!
数组的初始化:
在C语言中,数组在初始化的时候是要指出元素的个数的,这是个具体的数值而不能是个变量,并且在C语言中当数组初始化后,数组的大小就不在改变;而在4test这么NB的语言当中,数组的大小是可以随时变化的,也就是它不管你在初始化的时候定义的是多大,它都可以在运行的过程中动态地去改变它。参见两个函数:ArrayResize ()和ArraySize(), 其中的ArraySize经常用来确认数组的大小在运行时是不是被改变了。
Boolean类型:
在4Test中存在Boolean类型,其值不是TURE就是FALSE;而在标准的C中(我说的是90标准C哦)是没有布尔类型的,据说C程序员觉得用int的1和0来表示会更快一些,因此C程序员们经常再用到bool表达时,会在前面加上define或直接使用1和0:
#define TRUE 1
#define FALSE 0
字符型char:
4Test中没有char类型来表示单独的字母,但有string类型,其实差不多。
枚举类型:
C语言中枚举就是一种类型,4test中enum更接近于一种c中说的struct(结构),说不清楚了,看例子大家就知道了。
在C中:
enum COLOR {red,white,blue}
4Test中:
type COLOR is enum
red
white
blue
然后COLOR就是一种类型了,所以还可以
COLORrcolor
Real,integer和number型:
在C中float和double到了4Test都变成了Real型了:
举例:
8.12
499.0
-6.7511
1e30
1.45e-10
在C中int,long,short和unsigned到了4test中就变成了integer只此一种,别无分店了。
在4Test中还有一种number型,它又包含了Real和Integer型,可以表示这两种类型能表达的数字。也就是在你拿不定主意用哪种类型时,number一用保准没错。KAO,我怎么觉得4Test尽出一些流氓的万能的类型呢??
关于指针:
哈哈,4test没有C中关于指针的任何概念,我知道TX们学C的时候一定饱受了指针的折磨,一会指针数组一会数组指针,一堂课下来基本上要疯掉好几个人的。Java号称也放弃了指针,可还是有人揪出来实际java只是换了个名字而已,其实在4test中有相同的地方,4Test用了@来引用变量或函数,有点像指针的概念。
Union联合体:
4test没这种概念。 循环语句:
在4Test中循环语句是这么写的:
for each item in expr
statement
相当于C中的:
for i = 1 to n step 5之类的,拷个例子大家就明白了。
testcase for eachExample ()
LIST OF STRING lsFruit = {...}
"apple"
"mango"
"kiwi"
STRING sFruit //定义了一个变量,这个变量将被赋予IsFruit中的值
for each sFruit in lsFruit
Print (sFruit)
// This script prints:
// apple
// mango
// kiwi
条件语句:
4test中没有while语句,但Switch语句却可以随便用
语法如下:
switch (expr) case case-value(s) statement [ case case-value(s) statement ]... [ default statement ]...
和C的switch语句最大的区别在于,在C中你不得不用break来结束每个statement,以便程序能跳出来,在4test中却不用这么麻烦。
例子如下:
testcase switchExample ()
INTEGER i
for i = 1 to 12
switch (i)
case 1 // Compares i to 1
Print (i, "Case 1")
case 2, 4 // Compares i to 2 and 4
Print (i, "Case 2, 4")
case 5 to 7 // Compares i to 5, 6, and 7
Print (i, "Case 5 to 7")
case 8 to 9, 11 to 12 // Compares i to 8,9,11,12
Print (i, "Case 8 to 9 and 11 to 12")
default // If i is none of the above
Print (i, "Default Case")
预处理:
4Test没有预处理机制 第三篇:Web测试参考
从这一篇起要用很长的篇幅来讲用ST做Web测试的一些内容。
Browser window declaration:
浏览器窗口声明是一种主窗口类(MainWin类),主窗口类一般可以从桌面调用或命令行直接调用。它和对话框类(DialogBox class)的一个主要的区别是主窗口类通常会有一个菜单bar。
浏览器窗口的声明一般包含以下东西:
• Cut, Copy, Paste, and Select All items on the Edit menu
• The following tool bar buttons: Back, Forward, Home, Reload, and Stop
• The Location combo box, which lists the current URL
• The Web browser's status bar, which is an object of class StatusBar
named Status. It contains a DynamicText object named Message. So to
access the status bar, you use the object Browser.Status.Message.
包含的Method有:
ClearCache method
CloseOthers method
GetActive method
GetReadyTime method
GetRealBrowser method
Invoke method
LoadPage method
SetBrowserSize method
SetDefaultFont method
SetRequiredOptions method
StopLoading method
WaitForReady method
BrowserAuthentication window declaration:
浏览器认证窗口是个对话框类(DialogBox class),认证声明的一个主要的应用是让程序去判断是否有认证窗口弹出,如果有的话,则让输入用户名和密码,然后消失。
if (BrowserAuthentication.Exists ())
BrowserAuthentication.UserName.SetText (sUserName)
BrowserAuthentication.Password.SetText (sPassword)
BrowserAuthentication.OK.Click ()
BrowserChild class:
浏览器子窗口类来源于AnyWin类, ST中Windows被广泛的用于描述一般的GUI对象,因此,按钮,滚动条,复选框都可以被认作上windows。AnyWin没有在往上的父类了。浏览器子默认窗口类默认的标识(tag)是网页的标题头(caption)。
BrowserErrorPage window declaration:
浏览器出错窗口类,这种类通常出现在指定的URL无法访问的时候,比如说弹出一个要求输入代理服务器的窗口,像这种要求输入代理服务器的窗口就是很典型的浏览器出错窗口。
通常这类的窗口标识都有“Error”字样,为了防止除了“Error”字样的情况,我们可以在Extend的目录下把BrowserErrorPage的标识改为“Error*“,这样就能识别到所有“Error”开头的窗体。
下面的例子显示了是否有出错页窗口弹出,如果有的话则调用一个处理函数。
if (BrowserErrorPage.Exists ())
AppError ("Unable to load ’{sLocation}’ -- {BrowserErrorPage.sCaption}")
BROWSERLOCATION data type:
BROWSERLOCATION 数据类型是STRING 或WINDOWS的别名。
BrowserMessage window declaration:
浏览器信息窗口类是一种对话框类(DialogBox),以下例子显示了是否有信息窗口弹出,如果有的话则打印出错信息并调用处理函数。
if (BrowserMessage.Exists ())
BrowserMessage.PrintMessage ()
AppError ("Unable to load ’{sLocation}’")
BrowserPage window declaration:
浏览页面类就是你定义的你要测的那一个web页面。
BrowserPageNotFound window declaration:
页面未找到页类就是你指定的当程序找不到URL指定的页面时返回的那个页面。这个页面只用在通过代理服务器的情况,如果不通过代理服务访问,浏览器会自动指定一个类似的页面。
if (BrowserPageNotFound.Exists ())
AppError ("Unable to load ’{sLocation}’ -- {BrowserPageNotFound.sCaption}")
BrowserSecurityInfo window declaration:
安全信息窗口, 这个例子显示当安全信息窗口弹出后,点YES继续。
if (BrowserSecurityInfo.Exists ())
BrowserSecurityInfo.Continue.Click ()
BROWSERTYPE data type:
浏览器类型用法如下
main ()
LIST OF BROWSERTYPE lbtType
BROWSERTYPE btType
lbtType = {explorer4, netscape4}
for each btType in lbtType
GetItemCount (btType)
testcase GetItemCount (BROWSERTYPE btType)
GMO.About.Click ()
INTEGER iCount
iCount = AboutPage.UsedList.GetItemCount ()
Print (btType)
Print ("Item count: {iCount}")
Explorer window declaration:
IE特有的
GetActive method (Browser)
返回当前页面值 第四篇:典型Web测试流程
这一篇里我们要来说明一下一个典型的Web流程是什么样的?
首先,需要在你ST上面配置一下你要测的Web Application:
Step:
1.新建一个项目Projet:
ST提供2种测试流程:基本流程(Basic)和数据驱动流程(Data Driven)。Basic就是由无到有建立一个测试流程,数据驱动流程就是从已有的Test Case中再拿出来跑一遍或改吧改吧当成新的case直接用了。我们选择Basic的,新建一个测试YAHOO网站的项目,项目名叫YahooTest
2.启动扩展Enabling Extensions
启动扩展文件主要是因为在测试网页应用程序时,还包括DCOM组件或ActiveX组件。
我们只需在IE上打开Yahoo主页,然后在ST上点击Enabling Extensions,此时会让你重开一次IE
3.指定Use Files
就是建一个对象定义文件testframe,后缀为inc,testframe是Scripts的基础,包含待测应用的所有对象。为GUI对象指定逻辑的,跨平台的窗口声明叫做 Identifier, Identifier 和实际的名称对应叫做 Tag. 除了Record的对象Testframe也可以包含自定义的Class,method.因为 Testframe指定是逻辑关系,所以在实际对象有所变更的时候不需要更改Scripts,只需要更改Testframe,方便代码维护.
说了这一大堆,你要做的就是在打开的YahooTest项目下,右击“Include/Frame”然后New File 选择testframe,在这个例子里我们新建的Testframe名为yahoo.inc,这个文件应该放在你的项目地下。(默认文件路径)
4. 创建测试计划TestPlan
一般来说一个Testplan应该包含下面两部分:
a. 对测试需求的概述
b. 设定测试需求和Testcase的对应关系
其他:
对AUT和测试方法的说明
对测试工作的设想和风险的说明
测试中个人责任的说明
测试准备
软件说明
TestPlan的版本信息
编写testplan的工具是Testplan Editor
我们新建一个Testplan叫yhplan.pln, 然后完善它并给developer或test engineer权限访问控制
5.录制脚本
设置Application state点,就是用来recovery system的
recording的时候可以按Ctrl+Atl来设置Verify点
录制完Testcase后,把.t文件连接到Testplan里面去
6. Run 脚本 先感谢一下share,然后再拜读sdlkfj3 感谢楼主 好好拜读一下 感谢楼主,收藏了 收藏
关于silktest脚本编辑
:loveliness:我是个silktest使用新手,想问下录制完脚本之后,编辑或者添加脚本应该把脚本放哪?还有一些变量等的声明放在哪个地方?希望能回答详细一点
先谢谢了 :lol 顶起来,方便大家查看 对我很实用 谢谢楼主 3,4 有用 很老的贴子,但对我帮助很大,谢谢
回复 5# 的帖子
纠正,不知道LZ用的是什么版本,我用2006 R2中有while语句哦[-] testcase whileExample ()
[ ] INTEGER i = 5
[-] while (i > 0)
[ ] print(i)
[ ] i=i-1
[ ] // This script prints:
[ ] // 5
[ ] // 4
[ ] // 3
[ ] // 2
[ ] // 1 感谢,内容少了点。不过很有用。谢谢分享
页:
[1]
2