MonkeyTalk:脚本、变量、参数化脚本、数据驱动脚本、RunIf命令、自定义命令、测试和验证、Suites、命令执行

脚本

将monkeytalk命令保存为.mt格式的文件

举例:

#simple script to login as joe

Input username EnterText joe-at-doe.com

Input password EnterText “I like cheese”

Button LOGIN Tap

在其他脚本里调用该脚本,可以用Script命令+文件名(该文件名作为monkeyID),例如:

Script login.mt Run

 

变量

脚本可能包含替代变量,通常被写为${name}形式或者其他monkeytalk命令指定的地方。也会包含内建变量,写为%{var}。内建变量是%{componentType},%{monkeyId}, %{action},还有一些参数,像%{1}, %{2}等,变量仅被用在命令的一部分,像componentType、monkeyID等。

例如,一个定义好的变量,可以用作参数:Input username EnterText ${usr}

用作参数和monkeyID:Input ${foo} EnterText ${bar}

用在命令的所有部分:${foo}${bar} ${baz}

变量可以被嵌入到文本,而不能嵌入到另一个变量,例如:

Input username EnterText ${usr}@example.com

但是,下面这种方式不合法:Inputusername EnterText ${foo${bar}}

 

参数化脚本

运用参数。一条命令可以用定义好的参数和默认值。

下面来参数化login.mt脚本:

Vars * Define usr=”default-at-example.com”pwd

Input username EnterText ${usr}

Input password EnterText ${pwd}

我们建立了两个定义的参数,${usr}和${pwd},${usr}指定默认值为default-at-example.com,而${pwd}的默认值未指定,因此,的它的默认值就是<pwd>,(尖括号内部的变量名称)。

我们可以这样调用参数化了的login.mt脚本:

Script login.mt Run joe-at-doe.com “I likecheese”

或者缺省参数,使用默认值,例如:

Script login.mt Run

或者,用*替代${usr}的默认值,例如:

Script login.mt Run * password1

变量被限制只能在定义它的脚本当中使用,因此,${usr}和${pwd}默认用于login.mt脚本中,但是,你在调用该脚本作为子脚本的时候,可以调用该变量。

 

数据驱动脚本

参数化脚本刚刚开始,monkeytalk允许全数据驱动脚本,只是用RunWith来代替Run,并且建立一个数据文件,作为第一个参数。

用我们的参数化脚本login.mt,我们首先写一个数据文件,credentials.csv,在csv文件里,写入,

joe-at-doe.com,”I like cheese”

alpha-at-beta.net,password1

Charlie-at-dog.org,abc123

第一行指定的变量名(正是在login.mt脚本前边Vars.Define命令中定义的单变量),后边的行,给出值。monkeytalk需要CSV文件用逗号区分列,并且含有空格的值,必须用双引号引起来。

现在我们可以像这样数据驱动我们的脚本:

Script login.mt RunWith credentials.csv

这样的话,将根据数据文件,一行运行一次login.mt脚本。因此在上面是例子中,根据credentials.csv文件,要运行三次login.mt脚本,即第一次usr = joe-at-doe.com 、pwd = "i like cheese",第二次usr = alpha-at-beta.net 、pwd = password1,第三次usr = charlie-at-dog.org 、 pwd = abc123

 

RunIf命令

用RunIf命令,我们可以在指定一个特定命令的时候,执行脚本。这个命令的用法是,如果有一个可验证命令已运行成功,那么运行一个特定的脚本。可以这样输入:

Script YourScript.mt RunIf [Verify Command]

这说明,在参数部分,这是一个独立的不在该脚本中的验证命令。一个脚本例子,如下:

Input usrname enterText Fred

Input password enterText SecurePassword

Button LOGIN tap

script logout.mt RunIf Label * Verify “Welcome,Fred!”

 

自定义命令

monkeytalk语言可以通过添加自定义命令直接进行扩展,自定义命令中可以包括自定义控件类型和自定义操作。将任何一个脚本保存时,文件名被分为两部分,形式如:<componentType>.<action>.mt,成为一个自定义命令。例如,如果我们创建一个名为user.login.mt的脚本,我们需要添加User控件类型,并且拥有Login操作。

我们调用新的自定义命令,可以用下列标准形式:

User * Login

并且我们可以通过monkeyID和参数:

User joe Login joepassword

自定义命令中用%{monkeyID}方式表示monkeyID,以便在执行时,可以找到monkeyID。下面有个用到user.login.mt并且有monkeyID的例子:

Vars * Define pwd=”password”

Input username enterText %{monkeyID}

Input password enterText ${pwd}

Button LOGIN tap

 

测试和验证

一个测试,仅仅是在脚本中用Test来代替Script调用控件类型。测试报告根据JUnit-compatible xml标准格式被写入测试报告文件。

每一个命令的成功执行,验证了一些预期的UI(userinterface)组件的存在。此外,你可以用Verify方法,通过判断控件的真实值是否与预期的一致,来进行验证测试。首先,我们再次重写login.mt,这次包括Verify方法。如下:

Vars * Defineusr="default-at-example.com" pwd=name

Input username EnterText ${usr}

Input password EnterText ${pwd}

Button LOGIN Tap

Label welcome Verify "Welcome,${name}!"

Button LOGOUT Verify

现在,我们可以这样运行login.mt脚本,但提示一下,自从我们添加了第三个变量${name},来帮助验证是否登录成功,所以需要第三个参数。

Test login.mt Run joe-at-doe.com “I likecheese” “Joe Doe”

并且,我们可以数据驱动测试来达到预期效果,(再次提示,需要在credentials.csv文件中添加第三列数据):

Test login.mt RunWith credentials.csv

Verify

Verify操作使用与任何控件(除了脚本(script)和设备(device)),并被用来检验真实值和预期值是否一致。基本的形式中,verify有三部分参数:expectedValue, propPath, 和failMessage。

没有任何参数的时候,verify只验证改控件是否存在:

Button LOGIN Verify

仅有expectedValue的时候,Verify只验证该控件的值,这个值只是控件的逻辑值,(Button是值是label,Input的值是text,checkBox的值是on或者off,等等):

Button LOGIN Verify LOGIN

参数有expectedValue,加一个propPath的时候,Verify校验控件的属性。有些propPaths像是value和item是monkeytalk特定逻辑的参数路径,被用作支持跨平台(它们不以.开头)。特定平台的特定控件的参数路径,通常以.开头的。

校验IOS按钮的字体:

Button LOGIN Verify Helvetica.font.fontName

验证在AndroidRatingBar星星总数:

RatingBar reviewRating Verify 5 .numStars

并且如果验证失败,失败信息仅是额外提供作为反馈信息:

Input username Verify joe-at-doe.com value"bad username!!!"

更多用户使用手册学习

https://www.cloudmonkeymobile.com/monkeytalk-documentation/monkeytalk-user-guide/verifying-expected-values/using-verification-commands

 

Suites

monkeytalk脚本是一个suite,是一组可以在一起执行的tests。当一条test执行失败时,suite不会停止,而是转而执行下一条test。当所有的test都执行完时,xUnit-compatible报告就被生成,存放每条test的执行结果,执行test的数量,执行失败的数量,和错误个数。

Suites必须是以.mts为后缀名的文件,以用来跟scripts区分。

一个suite通过Test命令执行控件类型为“Test”的monkeytalkscripts脚本,将文件名作为脚本的MonkeyID,并且将Run或者RunWith作为操作。一个test命令(在一个suite中的)和一个Script命令(在一个script中)是一样的;Test只是为suite做些其他的“家务”。例如,一个简单的例子如下:

#login and logout

Test login.mt Run joe@doe.com JoeEsPaSsWoRd

Test logout.mt

只有suites包含Test命令,而scripts命令不包含test命令。相反,只有scripts包含Script命令,而suites没有Script命令。基本上,如果你想执行一个script,可以让Test在suite中执行,或者让Script在script中执行。

有时候,一组Tests共享一些依赖和清除的任务,那些且从开始一直到每个Test结束的时候都很烦人和易错的。

Suites允许“setup”和“teardown”脚本(分别在每个用例执行前后)作为Setup和Teardown控件类型,像Test命令一样使用。被定义为这种方式的任一个setup脚本在每个Test执行suite之前被执行。如果执行成功,Test将会被执行,继而teardown脚本被执行(不论Test是否执行成功)。

suites可以执行其他的suites,用Suite作为控件类型。

suites可以包含Test,Setup,Teardown和Suite作为控件类型,还有注释。

例如,myapp.mts如下:

# setup runs before every test

Setup login.mt Run joe@doe.com JoEsPaSsWoRd

# teardown runs after every test

TearDown logout.mt Run

# the tests...

Test add_contact.mt RunWith contacts.csv

Test remove_contact.mt RunWith contacts.csv

以上用到了Setup和Teardown命令,来指定在调用Test命令时,前后要运行的脚本。

 

命令执行

除了特别指定,monkeytalk命令会一直重试,直到超时。超时设置全局默认是2s,但可以通过timeout修饰语进行重写。

例如:

Button OK Tap %timeout=5000 %thinktime=2000%retrydelay=123

在点击OK按钮之前等待2秒,然后在5s超时范围内,每123ms之后重试一次。(从启动共7秒)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值