MQL4でユニットテスト(応用編)

前回紹介したMQL4用のユニットテストモジュールの使い方を更に詳しく紹介します。
前回の記事をまだ読んでない人は先に読んでおくのをおすすめします。
MQL4でユニットテスト

double型、float型のテスト

プログラムで小数を扱うと誤差が発生する場合があります。
この誤差のせいでTestValueメソッドを使って関数の実行結果と予想値を比較したときに、プログラムにミスが無くても値が一致しない場合があります。
そこでTestValueメソッドには浮動小数点値を指定した精度に丸めてて比較する機能を用意してあります。
この機能を使うには、第一引数に精度(小数点以下の桁数)を指定し、第二引数に関数の実行結果、第三引数に想定値を指定します。

UnitTest *test;

int getMA()
{
   double ma;
   ma = iMA(_Symbol, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 1);
   return(ma);
}

int OnInit()
{
   test = new UnitTest("getMA関数のテスト");

   double result = 0, expected = 0;

   result = getMA();
   expected = 1.234;

   // 小数点以下3桁に正規化して比較をおこなう。
   test.TestValue(3, result, expected);

   delete(test);

   return(INIT_SUCCEEDED);
}

複数の環境でテストする

Envモジュールの機能を使うことで複数の環境下での結果を一度にテストすることが可能です。
Envモジュールについてはこちらの記事を参考にしてください。
MQL4で環境設定ファイル

テストを実行したい環境設定ファイルを作成し、一つのフォルダに保存します。
UnitTestクラスのインスタンスを作成する際に、第二引数に環境設定ファイルのフォルダ名を指定します。
これにより環境設定ファイルを順番に読み込んでテストすることが可能となります。
loadNextEnvFileメソッドを実行するたびに、次のユニットテストが読み込まれます。
do while文を使うことで、簡単に実装することが可能です。

UnitTest *test;

int OnInit()
{
   test = new UnitTest("getMA関数のテスト", "UnitTest");

   double result = 0, expected = 0;

   do {
     result = sampleFunction(1);
     expected = 1;
     test.TestValue(result, expected);

     result = sampleFunction(-1);
     expected = -1;
     test.TestValue(result, expected);
   }
   while(test.loadNextEnvFile());

   delete(test);

   return(INIT_SUCCEEDED);
}
arrow_upward