0

我有一个案例,一个特定的 API 只需要调用一次来初始化。此后线程可以调用其他方法。在 vuser_init.c 中,我有这个:

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));
       } 
    }

当我运行场景时,第一个线程打印两者,即

Before, initComplete = 0 

其次是

After, initComplete = 1

其余的测试是在该线程中正确完成的。但是,下一个线程因“错误 - 内存违规:收到异常 ACCESS_VIOLATION”而失败,因为它已执行后续方法而未完成 Initialize 或 initComplete 为 0。其他每个线程的日志具有“之前,initComplete = 0 " 作为最后一行。由于我已将这些变量定义为静态易失性,因此我希望

initOnlyOnce = 1

在第一个线程调用它之后立即不会再次输入此代码块。但是,似乎 Vugen 与线程不一样。每个 vuser_init.c 都独立于其他正在运行的 Vugens,因此尽管变量被声明为静态易失性,但状态不共享。

有解决方法吗?我本质上想要 vuser_init 的单例前体。

4

2 回答 2

1

我将只使用一个虚拟用户编号变量并检查该编号是否为 1。

PCODE(在初始化中)

If (Value of Virtual User variable == 1) { 运行初始化代码;}

因此,您需要创建变量,然后可能分配一个虚拟用户来仅处理初始化然后退出。将此用户单独放在一个组中,然后甚至可能在其他用户开始之前退出。

如果您愿意,您可以添加计划在 VUSER_INIT() 之前启动的其他函数。在右侧的函数列表中添加函数,然后进入运行时间设置并安排函数在 vuser_init() 之前运行一次。

于 2013-03-19T20:26:54.963 回答
1

LoadRunner 执行虚拟用户的方式并不那么容易理解,更不用说你应该依赖的东西了。

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

此外,如果您的测试中有 LoadGenerators,它们会在不同的计算机上执行,并且无法知道有多少 vuser 在其他计算机上运行。

正如 James 所说,如果您想在代码中执行此操作,则使用 VUserID 作为“检查”是最佳选择。获取 VUserID 作为一个名为“VUserID”的新参数,并选择类型为 VUserID。然后,您可以lr_eval_string("{VUserID}")像使用任何其他参数一样使用它。

另一种选择是以先执行一个脚本,然后执行其他脚本的模式运行场景。

于 2013-03-25T19:52:39.910 回答