MQL4でユニットテスト

MQL4用のユニットテストモジュールを作成したのでご紹介します。

ユニットテストとは?

ユニットテスト(単体テスト)とは、プログラムを構成する比較的小さな機能単位が、正しく動作することを検証するテストのことです。
今回作成したモジュールでは、一つの関数ごとに一つの機能としてテストすることを想定しています。
条件を変えて関数を実行し、全ての条件にて想定通りの正しい結果が得られるかを検証します。
もし正しくない結果が発生した場合は、その関数にはバグがある可能性が高いです。

準備

GithubからUnitTest.mqhをダウンロードしてください。

MT4のデータフォルダを開き、ダウンロードしたファイルをMQL4/Include/mql4_modules/UnitTestフォルダの中に保存します。

UnitTest.mqhの動作には、MQL4-EnvとMQL4-SymbolSearchが必要です。この2つをまだお持ちでない方は、こちらもGithubよりダウンロードしてください。

mql4のコード内でUnitTest.mqhをincludeしたら準備完了です。

#include <mql4_modules/UnitTest/UnitTest.mqh>

使い方

まず始めに、UnitTestクラスのインスタンスを作成します。この時テスト名を設定できます。設定したテスト名は、結果を出力する際に一緒に出力されるようになります。

UnitTest *test;

int OnInit()
{
   test = new UnitTest("テスト名");

   return(INIT_SUCCEEDED);
}

続いて、TestValueメソッドを実行してテストを実行していきます。第一引数に関数の実行結果、第二引数に想定される結果を渡します。

UnitTest *test;

int sum(int value1, int value2)
{
   return(value1 + value2);
}

int OnInit()
{
   test = new UnitTest("テスト名");

   int result = 0, expected = 0;

   // 正の値同士の検証
   result = sum(1, 2);
   expected = 3;
   test.TestValue(result, expected);

   // 負の値同士の検証
   result = sum(-1, -2);
   expected = -3;
   test.TestValue(result, expected);

   // 0同士の検証
   result = sum(0, 0);
   expected = 0;
   test.TestValue(result, expected);

   return(INIT_SUCCEEDED);
}

上記のコードは2つの値を足し合わせるだけの簡単な関数を検証するコードです。これほど単純な関数であればユニットテストの必要はないかもしれませんが、例だと思ってください。
検証が終わったら、インスタンスをdeleteします。deleteされた際に、テスト結果が出力されます。

UnitTest *test;

int sum(int value1, int value2)
{
   return(value1 + value2);
}

int OnInit()
{
   test = new UnitTest("テスト名");

   int result = 0, expected = 0;

   // 正の値同士の検証
   result = sum(1, 2);
   expected = 3;
   test.TestValue(result, expected);

   // 負の値同士の検証
   result = sum(-1, -2);
   expected = -3;
   test.TestValue(result, expected);

   // 0同士の検証
   result = sum(0, 0);
   expected = 0;
   test.TestValue(result, expected);

   // テスト結果を出力
   delete(test);

   return(INIT_SUCCEEDED);
}

上のサンプルではテストが3回実行されているので、3件中何件正しい結果だったかが出力されます。

基本的な使い方は以上です。
次回の記事でもう少し詳しい使い方について解説します。

arrow_upward