用户打开首页后,有两种选择,40%可能性登录,其余不登录。登录的有两种随机选择,不登录也有两种选择,这时使用块能很简洁地解决这个问题。
通过块能够实现用户选择的过程,如图A.63所示。
虽然可以通过Run Logic包括Block来实现各种复杂的脚本运行策略,但是在某些情况下这种做法不但麻烦,而且缺乏足够的灵活性,如果需要用编程的方式来控制脚本运行的策略,又该如何做呢?如图A.64所示。
图A.64 复杂的用户行为逻辑
仔细分析以后会发现这一个逻辑与以前的逻辑不同之处在于存在一个概率循环的情况,只有当选择板块后随即到了不换板块,而在不换板块后才有10%的概率退出结束整个脚本。在这种情况下是无法通过默认的Run Logic选项来完成运行模拟的,这时我们就要使用进一步的编程调用方式了。
首先我们来熟悉一下Action之间的调用方式。在VuGen中录制的脚本都被放在一个函数中,例如:
Action()
{
Return 0;
}
整个脚本是由3个.C文件中的3个函数组成的。如果需要在Action()函数中调用其他文件的函数,只需要在代码中直接添加被调用的函数名即可(可以带形参),例如:
Action()
{
Vuser_init();
Return 0;
}
这样在运行Action()的时候,会调用一次Vuser_init()函数,通过这种方式可以完全替代Run Logic功能,从而实现代码级别的逻辑控制。
也可以在Action()外自己编写函数来帮助处理一些内容,例如:
int add(int x,int y)
{
Return (x+y);
}
Action()
{
Int z;
Z=add(1,3);
Lr_output_message("%d",z);
}
通过自定义add函数,我们可以在LR的脚本中直接使用,简化脚本的冗余。
那么我们如何解决随机的问题呢?可以通过在脚本中使用随机函数来解决。例如,我们需要模拟用户有30%的概率去执行一个操作,这里的30%是什么概念呢?
可以这样理解:如果随机生成一个1~100的数字,并且随机结果在1~30这个范围内,那么这就是30%的概率了。通过这个方法我们就可以实现随机操作的模拟了。
现在要模拟在Action中有30%的概率会调用vuser_init(),可以这样写:
Action()
{
int rowNum;
rowNum=rand()%100+1;
//使用rand()获得随机值,然后对100取余后加1,即可得到1~100的随机内容
if(rowNum<=30)//如果值小于30,那么就是30%以内的概率,则执行vuser_init()函数
vuser_init();
return 0;
}
所以如果我们要实现如图A.64所示这种复杂的用户行为逻辑,现在可以这样写。首先新建对应步骤的多个Action,然后在Run logic中将其删除只剩action作为主函数部分,接着在代码中完成调用关系,代码如下。
Action() { int randno; randno=rand()%100+1; if(randno<=40) login("cloud");//使用形参传递用户名 else unlogin(); return 0; } login(char *x) { //登录 //请求略 Lr_output_message(x);//输出形参传递值 viewforum(); return 0; } unlogin() { //不登录 //请求略 viewforum(); return 0; } viewforum() { //看板块 //请求略 selectforum(); return 0; } selectforum() { //选板块 int randno; randno=rand()%100+1; //请求略 if(randno<=30) viewforum(); else { randno=rand()%100+1; if (randno<=10) { quit(); } else if(randno<=40) { posttopic(); } else { viewtopic(); } } return 0; } viewtopic() { //看帖 int randno; randno=rand()%100+1; //请求略 if(randno<=60) viewtopic(); else replytopic(); return 0; } posttopic() { //回帖 //请求略 viewtopic(); return 0; } quit() { //退出 lr_exit(LR_EXIT_ITERATION_AND_CONTINUE ,LR_PASS); return 0; } replytopic() { //回帖 //请求略 selectforum(); return 0; } |
上面的代码实现了逻辑的规则但是并没有添加请求,添加请求时注意确保请求在变量定义后,在逻辑判断前。在代码中使用了一个新的函数叫作lr_exit,这个函数的作用是退出一个脚本、Action或迭代。在这里我们设置如果运行这个函数,会退出当前用户的这一次迭代进入下一次迭代(常量LR_EXIT_ITERATION_AND_CONTINUE表示),退出的用户状态为通过(常量LR_PASS)。
编程方式虽然能完全模拟Run Logic的运行策略,但是无法模拟Run上迭代产生的Starting Iteration和Ending Iteration所触发的迭代计数器,这个计数器会在参数化中经常使用。
在Run Logic中删除的脚本不会被运行,但是仍然可以通过编程的方式进行调用。
版权声明:51Testing软件测试网获作者授权连载本书部分章节。
任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责任。