ryewhisky 发表于 2007-8-16 18:43:58

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 编辑 ]

ryewhisky 发表于 2007-8-16 18:46:23

连接操作:

这个是指用+号把两个字符串或数组接起来, 前提是必须都是字符串或数组。
书上的例子:
//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,,,,

ryewhisky 发表于 2007-8-16 18:46:44

下面是从枚举类型中引用的例子:

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:

ryewhisky 发表于 2007-8-16 18:47:46

第二篇: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没这种概念。

ryewhisky 发表于 2007-8-16 18:49:02

循环语句:
在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没有预处理机制

ryewhisky 发表于 2007-8-16 18:49:20

第三篇: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)
返回当前页面值

ryewhisky 发表于 2007-8-16 18:50:10

第四篇:典型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 脚本

dolphincl 发表于 2007-8-23 16:41:45

先感谢一下share,然后再拜读sdlkfj3

northking 发表于 2007-12-12 17:27:51

感谢楼主   好好拜读一下

xuzhaozhe 发表于 2008-1-30 11:49:27

感谢楼主,收藏了

howwell 发表于 2008-3-5 14:30:40

收藏

03021217 发表于 2008-4-15 13:59:54

关于silktest脚本编辑

:loveliness:
我是个silktest使用新手,想问下录制完脚本之后,编辑或者添加脚本应该把脚本放哪?还有一些变量等的声明放在哪个地方?希望能回答详细一点
先谢谢了

jimmy_zjw 发表于 2008-4-17 16:28:22

:lol

tianxiang 发表于 2008-7-3 15:26:28

顶起来,方便大家查看

janeainer 发表于 2008-7-18 12:13:38

对我很实用

tracy-fmsi 发表于 2008-10-30 17:26:02

谢谢楼主

jhx800 发表于 2009-4-10 00:25:09

3,4 有用

xhhuang1618 发表于 2009-9-23 23:29:47

很老的贴子,但对我帮助很大,谢谢

june.diny 发表于 2010-5-13 11:12:08

回复 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

tlu_jj 发表于 2011-4-11 16:56:13

感谢,内容少了点。不过很有用。谢谢分享
页: [1] 2
查看完整版本: 4Test 简明语法教程及SilkTest入门-----把压箱底的原创拿出来发