0

これが繰り返しの質問である場合は申し訳ありません。答えが見つかりませんでした。(はい、チェックしましたが、LR 11.04 の RTFM はしませんでした。私が残したつかの間の正気を維持したいのです。)

loadrunner 内から Perl を呼び出すことができることは知っていますが、まだ例を見つけていません。Web_Reg_Save_Param_ex / Web_Reg-Save_Param_Regexp 関数の RegEx ロジックが Perl サブルーチンに移植されているため、それが可能であることはわかっています。

テストする (half-@$$ed) アプリケーションでやらなければならないことがかなりあるので、その方法を知る必要があります。

例は次のとおりです。

  • .NET アプリケーション - パラメーター値をすばやく簡単に探し出し、それらを LR の外でスライスして解析し、その値を LR に返すことができました。

  • 標準 Web アプリ - 誰かのサンドボックスへのサードパーティ呼び出しを行います。すべての情報は Base64 エンコーディングです。プレーンテキスト (応答で提供) を取得し、Base 64 にエンコードして、プライマリ システムに送信する必要があります。したがって、AUT はシステム A です。システム A がシステム B を呼び出し (302 応答)、システム B が応答すると、AUT はそのデータをシステム A に送り返し、データベースに保存します。(システム A とシステム B は同じベンダーのものなので、入札プロセスについて質問がありますが、それは OT です。)

私は優れたプログラマーですが、Perl には疎いという点で問題があります。したがって、この時点で座ってコーディングするだけでなく、清掃して書き直す必要があります。見つけた RegEx 情報を調べました (これまでのところ、 loadrunner で正規表現を使用するのが最善でした) が、これまでのところ、私がやろうとしていることには不十分です。

ソース:

{"text":"A*","value":"271"},  // This is just the pattern - it's repeated 320 times or so

コード スニペットの例:

web_reg_save_param_ex(
    "ParamName=Charity1",
    "LB={\"text\":\"", 
    "RB/RE=\",\"value\":\"([0-9]+)\"},", 
    "Ordinal=All",
    SEARCH_FILTERS,
    "Scope=Body",
    "IgnoreRedirections=Yes",
    "RequestUrl=*/Person.aspx*",
    LAST);

それが機能し、名前を返します(A*上記のソースから)。

web_reg_save_param_ex(
    "ParamName=Charity1",
    "LB/RE={\"text\":\"([A-Za-z0-9].+)\",\"value\":\"",
    "RB=\"},", 
    "Ordinal=All",
    SEARCH_FILTERS,
    "Scope=Body",
    "IgnoreRedirections=Yes",
    "RequestUrl=*/Person.aspx*",
    LAST);

これは私にはうまくいきません - 見つかったレコードの合計はゼロです。OK、1 つのエントリに「-」があり、いくつかはスペースがありますが、100% 失敗ですか? OTOH、リスト全体をキャプチャできたら、それをPerlに送信し、部分文字列を分割し、トリムされたきちんとした2つの値を返し、LoadRunner文字列として保存します(私は思う-LRは単一の戻り値以上を好みませんしかし、STRUCT を実行してその値を返すことも、メモリ空間へのポインタを返すこともでき、LR に参照されたメモリを STRUCT に読み込ませることもできます。)

問題は、AUT が両方の値をすぐに使用することが明らかになったため、後で値が送り返されたときに作業できないことです。明らかに、数値はテキストよりも重要です。

どんな提案でも大歓迎ですが、私は の使用を避けたいと思ってsystem()います - それは Base64 の質問に対する私が持っている回避策です (それはこれまで唯一の Perl 呼び出しであるはずでした)。M$必要なパッチが必要で、LoadRunner でファイルを開いて読み取ることができなくなりました (HP は「これはカスタム コードです。私たちはあなたを助けることはできません。そのため、M$パッチを削除してテストを実行しました。2010 年頃の C++ 再頒布可能パッケージでした。参考までに、このショップではまだ XP を実行しています。私のデスクには 4 GB の Core i5 があります... Win7 が付属しています。そして、Xtra Pathetic を実行しています。ここでは正気度が不足しています … )

// * ** * ** 最近のリビジョン:

LoadRunner 呼び出し (web_reg_save_param_regexp への) の変更は、RegEx をまっすぐにした後に機能しました。"Not Quote" RegExp がA*最初の値に対して を返さなかった理由は明らかではありませんが、なぜ が271表示されないのかがわかりました - 実際には簡単でした。終了値に同じ境界条件がありませんでした。最初の値、明らかに「Not Quote」*には、値に「」がある場合は含まれません。???

web_reg_save_param_regexp(
"ParamName=Charity_REGEX",
"RegExp={\"text\":\"([^\"]{1,8})\",\"value\":\"", 
"Ordinal=All",
SEARCH_FILTERS,
"Scope=Body",
"IgnoreRedirections=Yes",
"RequestUrl=*/Person.aspx*",
LAST);

web_reg_save_param_regexp(
"ParamName=Tenants_REGEX",
"RegExp=\",\"value\":\"([0-9]{1,3})\"}",
"Ordinal=All",
SEARCH_FILTERS,
"Scope=Body",
"IgnoreRedirections=Yes",
"RequestUrl=*/Person.aspx*",
LAST);
4

1 に答える 1

2

system() の外部 (perl コードを含む) のアイテムを呼び出す場合。perl 項目をファイルに出力し、それを再度読み込む必要がある場合があります。または、コードを DLL に配置し、lr_load_dll() を使用して呼び出すことができます。

base64 の課題ごとに、利用したい base64 関数がいくつかあります。現状のままで提供され、ご自身の責任で使用してください。このコードは、正常にエンコードおよびデコードする作業中のロードランナー仮想ユーザーから直接取得されたものです。

static const unsigned char base64_table[64] =
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";


unsigned char outbuf[BUFSIZE];

unsigned char * base64_encode(unsigned char *src, size_t len,
                              size_t *out_len)
{
        unsigned char *out, *pos;
        const unsigned char *end, *in;
        size_t olen;
        int line_len;

        olen = len * 4 / 3 + 4; /* 3-byte blocks to 4-byte */
        olen += olen / 72; /* line feeds */
        olen++; /* nul termination */
        if (olen >= BUFSIZE)
            {
            lr_message("ERROR:  required buffer size of %d versus fixed buffer of %d.\n",
                        olen, BUFSIZE);
            return NULL;
            }
        out = outbuf;

        end = src + len;
        in = src;
        pos = out;
        line_len = 0;
        while (end - in >= 3) {
                *pos++ = base64_table[in[0] >> 2];
                *pos++ = base64_table[((in[0] & 0x03) << 4) | (in[1] >> 4)];
                *pos++ = base64_table[((in[1] & 0x0f) << 2) | (in[2] >> 6)];
                *pos++ = base64_table[in[2] & 0x3f];
                in += 3;
                line_len += 4;
                if (line_len >= 72) {
                        *pos++ = '\n';
                        line_len = 0;
                }
        }

        if (end - in) {
                *pos++ = base64_table[in[0] >> 2];
                if (end - in == 1) {
                        *pos++ = base64_table[(in[0] & 0x03) << 4];
                        *pos++ = '=';
                } else {
                        *pos++ = base64_table[((in[0] & 0x03) << 4) |
                                              (in[1] >> 4)];
                        *pos++ = base64_table[(in[1] & 0x0f) << 2];
                }
                *pos++ = '=';
                line_len += 4;
        }

        if (line_len)
                *pos++ = '\n';

        *pos = '\0';
        if (out_len)
                *out_len = pos - out;
        return out;
}


unsigned char * base64_decode(unsigned char *src, size_t len,
                              size_t *out_len)
{
        unsigned char dtable[256], *out, *pos, in[4], block[4], tmp;
        size_t i, count, olen;

        memset(dtable, 0x80, 256);
        for (i = 0; i < sizeof(base64_table); i++)
                dtable[base64_table[i]] = i;
        dtable['='] = 0;

        /*for (i = 0;  i < 256;  i++)
            printf("%d ('%c')\t%d ('%c')\n", i, i, dtable[i], dtable[i]);*/

        count = 0;
        for (i = 0; i < len; i++) {
                if (dtable[src[i]] != 0x80)
                        count++;
        }

        //printf("count is %d\n", count);
        /*if (count % 4)
                return NULL;*/

        /*  handle code missing the ender equals - russelladd   */
        //if (count % 4)
                //printf("Input file with wrong number of valid characters.\n");
        for (i = 0;  i < count % 4;  i++)
            strcat(src, "=");

        count += (count % 4);
        /*  russelladd  */

        olen = count / 4 * 3;
        if (olen >= BUFSIZE)
            {
            lr_message("ERROR:  required buffer size of %d versus fixed buffer of %d.\n",
                        olen, BUFSIZE);
            return NULL;
            }
        pos = out = outbuf;

        count = 0;
        for (i = 0; i < len; i++) {
                tmp = dtable[src[i]];
                if (tmp == 0x80)
                        continue;

                in[count] = src[i];
                block[count] = tmp;
                count++;
                if (count == 4) {
                        *pos++ = (block[0] << 2) | (block[1] >> 4);
                        *pos++ = (block[1] << 4) | (block[2] >> 2);
                        *pos++ = (block[2] << 6) | block[3];
                        count = 0;
                }
        }

        if (pos > out) {
                if (in[2] == '=')
                        pos -= 2;
                else if (in[3] == '=')
                        pos--;
        }

        *out_len = pos - out;
        return out;
}
于 2013-03-22T19:58:14.923 に答える