2013-03-19 39 views
0

我有一个情况,只需要调用一次特定的API来初始化。此后线程可以调用其他方法。 在vuser_init.c,我有这样的:我可以将Loadrunner Vuser初始化为单例吗?

static volatile int initOnlyOnce = 0; 
static volatile int initComplete = 0; 
int iStatus; 

if (1!=initOnlyOnce) { 
     initOnlyOnce =1; 
     lr_output_message("Before, initComplete = %d", initComplete); 
     iStatus = Initialize(); // product API call 
     initComplete = 1; 
     lr_output_message("After, initComplete = %d", initComplete); 
     if (1 != iStatus) { 
      lr_error_message("Initialize returns %d on %s.",iStatus,szLoadGenerator); 
      srand(time(NULL)); 
     } 
    } 

当我运行的情况下,第一个线程打印两种,即随后

After, initComplete = 1 

,其余的

Before, initComplete = 0 

测试在该线程中正确完成。然而,下一个线程失败,“错误 - 存储器违反:异常ACCESS_VIOLATION接收到的”,因为它已被执行,而不完成初始化随后的方法或initComplete为0 其他每个线程的登录有“之前,initComplete = 0“作为最后一行。既然我已经定义了这些变量作为静态挥发,我预计第一线程中调用它,之后

initOnlyOnce = 1 

右随后的代码块不会再次进入。但是,似乎Vugen不是一个线程。每个vuser_init.c独立于正在运行的其他Vugens,所以尽管变量被声明为静态易失性,但状态并不共享。

是否有解决方法?我基本上想要一个vuser_init的单身前兆。

回答

1

我只想用虚拟用户数目可变,并检查,以查看是否数为1

PCODE(在init)

如果 {(虚拟用户变量== 1的值) 运行初始化代码; }

所以,你需要创建变量,然后可能分配一个虚拟用户来处理初始化,然后退出。将该用户放在一个组中,然后在其他用户启动之前甚至可以退出。

您可以添加调度VUSER_INIT()如果你想之前启动等功能。在右侧的函数列表中添加函数,然后进入运行时间设置,并计划您的函数在vuser_init()之前运行一次。

+0

感谢您的提示。我确实创建了2个组,并将它们添加到控制器上的场景中。对于初始化,我分配了1%的用户(100个中的1个),其余的用于实际运行。当我以这种方式运行时,第二组中出现了一些关于某些功能缺失的错误,令人费解。但是,智能LR能够先运行我的init组,然后运行下一个? – Jai 2013-03-19 22:36:31

+0

您可以在vuser init之前添加自己的init。此外,您可以添加逻辑,仅基于虚拟用户号码为一个用户运行此操作。 – 2013-03-20 13:03:54

1

执行LoadRunner的虚拟用户的方式不是那么容易理解,并要少得多的东西,你应该依靠。

在大多数情况下,似曾相识的正在运行的线程,在一个特殊的MMDRV过程。 MMDRV进程运行大约50个线程,然后LR引擎启动另一个MMDRV进程,再次运行50个线程。 (您也可以将VUsers作为一个进程运行,查看运行时设置)。

此外,如果有LoadGenerators在您的测试,这些都在不同的计算机上执行,并没有办法知道许多Vuser将如何在其他机器上运行的方式。

正如詹姆斯所说,使用VUserID作为“检查”是最好的选择在这里如果你想这样做的代码。要将VUserID作为一个名为“VUserID”的新参数并将其类型选为VUserID。您可以使用lr_eval_string("{VUserID}")与其他参数一样。

另一个选择是在一个脚本首先执行的模式下运行该场景,然后运行其他脚本。

相关问题