テスト値の修正 | IBM i 総合情報サイト

テスト値の修正


データベースにデータをロードするためにテストデータを生成するのであれば、2015年5月の記事“2つのテスト用ツール”で説明したFakerやウェブサイトgeneratedata.comのようなツールを使用したでしょう。しかし、配列テストの目的のために必要だったのは一連のランダムな値でしたので、これを行うためにIBM APIの CEERAN0擬似乱数ジェネレーターを使用しました。このAPIは、0と1の間の浮動小数点値を返します。それはちょっと奇妙に見えるかもしれませんが、この後すぐに分かるように私たちの目的には理想的です。

このAPIについてよく知らない人のために、ここでAPIをどのように使用したかについて簡単に説明します。

// Simple procedure to fill requested 
    // number of array entries with random
    //  values up to the specified maximum

    dcl-proc FillArray;

      dcl-pi  *N;
(A)     count  Int(10)  Const;
        max    Int(10)  Const;
      end-pi;

      dcl-s  i  int(10);

(B)   dcl-s  seed       int(10)  Inz;
      dcl-s  floatRand  float(8);

(C)   dcl-pr  CEERAN0  ExtProc;
        seed      Int(10);
        randNum   Float(8);
        feedback  Char(12) Options(*Omit);
      End-Pr;
      For i = 1 to count;
(D)     CEERAN0 ( seed: floatRand: *Omit);
(E)     valueArray(i) = floatRand * max;
      EndFor;
            
    End-proc FillArray;

FillArrayルーチン(A)へのプロシジャー・インタフェースは、2つのパラメーターを定義しています。最初の(count)は生成される値の数を指定し、2番目の(max)は生成される最大値を指定します。

(B)では、ジェネレーターのシード値(seed)、および生成された乱数を格納するフィールド(floatRand)という2つの作業フィールドを定義しました。seedはゼロに初期化され、これによりCEERAN0は現在の時刻をシード値として使用します。 正確に同じ一揃いの数値が(テスト目的のために)毎回生成されるようにしたい場合は、seedを(たとえば)1という定数に設定することでこれが保証されます。

(C)のCEERAN0プロトタイプでは3つのパラメーターが定義されていますが、その3番目のパラメーター(エラーフィードバック)は使用しないので、Options(* Omit)としています。通常こうしたAPIでは、このようなパラメーターを単に省略できます - つまり、Options(* NoPass)を使用しますが、このAPIはオプション・パラメーターをサポートしていません。ここで警告です:私達は単純に2つのパラメーターを渡すことが許される多くの例を見てきました。APIはエラーが発生した場合にだけ3番目のパラメーターの使用を試みるため、ほとんどのケースでそれらは正しく動作するように見えます。しかし、エラーが発生した場合は注意してください。何が起こっても不思議ではありません。(D)でAPIへの呼び出しが行われます。ここで注意すべき重要な点は、呼び出しによってseed値とfloatRand値の両方が変更されることです。seedが変更される理由は、次の呼び出しで適切なシード値が供給されるようにするためです。これがなければ、APIは同じ乱数を繰り返し返すかもしれません。

最後に(E)で、ランダムに生成された値を作成し格納します。これは、返された乱数(0と1の間の値)にテストデータで必要な最大値を乗算することで実現されます。理論的には、5,000個の値(各値の最大値は10,000)が生成されているので、1〜10,000の範囲で可能な各数値を検索すると50%のヒット率になるはずです。しかし、実際には、重複した値がいくつか生成される可能性があるため、実際のヒット率はもっと低くなります。

Copyright © IGUAZU