BETA

DUnitXでのテスト方法

投稿日:2019-06-07
最終更新:2019-06-27

ネットで調べても、昔の方法しかのってなかったり、すんなりいかなかったのでまとめておく。

使用バージョン:10.2 Update3

インストール

VSoftTechnologies/DUnitX: Delphi Unit Test Framework からデータをcloneしてプロジェクトファイルを選択。ただし、開くのは直下にあるGroupプロジェクトではなく、「Expert」フォルダ内の「~.dproj」ファイル。プロジェクトマネージャに表示されている「~.bpl」を右クリックし、インストールを選択する。
インストール完了後、念の為RAD Studioを再起動。

ライブラリのパスを追加

そのままでは動かないので、パスを通す。意外と忘れられがち。私は完全に忘れていた。
メニューの「ツール」「オプション」を開き、左側ペインの「環境オプション」「Delphiオプション」「ライブラリ」の順にたどっていく。

クリックして表示された画面の「ライブラリ パス」にCloneしたフォルダを入れる。右側の「...」をクリックし、画面下部にあるフォルダアイコンをクリックしてCloneしたフォルダを選択した後、「追加」ボタンをクリックする。

これで準備完了。

プロジェクトの追加

テストを追加したいプロジェクトを開いた状態で、メニューの「ファイル」「新規作成」「その他...」の順で選択する。左側ペインから「Delphiプロジェクト」の中の「DUnitX」を選択し、「DUnitX Project」を選択する。

選択するとウィザードが表示される。基本は特に変更せずにOKで大丈夫かな?

完了後、一通りファイルを保存しておく。

テストコードの追加

テスト対象コードとして、以下のUnitをメイン側プロジェクトに追加。

unit CalcUnit;  

interface  

type  
  TCalc = class(TObject)  
    class function Add(x,y : Integer): Integer;  
  end;  

implementation  

{ TCalc }  

class function TCalc.Add(x, y: Integer): Integer;  
begin  
  Result := x + y;  
end;  

end.  

上記コードをテスト側プロジェクトから参照する。プロジェクトマネージャかのテストプロジェクトを右クリックし、「ソースの表示」をクリックする。

program Practice_TestUnit.Test;  

{$IFNDEF TESTINSIGHT}  
{$APPTYPE CONSOLE}  
{$ENDIF}  
{$STRONGLINKTYPES ON}  
uses  
  System.SysUtils,  
  {$IFDEF TESTINSIGHT}  
  TestInsight.DUnitX,  
  {$ELSE}  
  DUnitX.Loggers.Console,  
  DUnitX.Loggers.Xml.NUnit,  
  {$ENDIF }  
  DUnitX.TestFramework,  
  MainTestUnit in 'MainTestUnit.pas';  

{$IFNDEF TESTINSIGHT}  
// ---以下省略---  

上のソースコード例の16行目あたりを変更して参照を追加する。ファイル名は相対パスで指定する。

program Practice_TestUnit.Test;  

{$IFNDEF TESTINSIGHT}  
{$APPTYPE CONSOLE}  
{$ENDIF}  
{$STRONGLINKTYPES ON}  
uses  
  System.SysUtils,  
  {$IFDEF TESTINSIGHT}  
  TestInsight.DUnitX,  
  {$ELSE}  
  DUnitX.Loggers.Console,  
  DUnitX.Loggers.Xml.NUnit,  
  {$ENDIF }  
  DUnitX.TestFramework,  
  // ---変更ここから---  
  MainTestUnit in 'MainTestUnit.pas',  
  CalcUnit in '..\CalcUnit.pas';  
  // ---変更ここまで---  

{$IFNDEF TESTINSIGHT}  
// ---以下省略---  

登録完了後、自動生成されたテストコードを開いて編集する。ウィザード画面で下2つにチェックを入れていると次のようなソースコードになっている(1行目のUnit名は違うかも)
各解説はコメント参考に。

unit MainTestUnit;  

interface  

uses  
  DUnitX.TestFramework;  

type  
  // [TestFixture]属性をつけたクラスがテスト対象となる  
  [TestFixture]  
  TMyTestObject = class  
  public  
    [Setup]  
    procedure Setup;  // [Setup]属性をつけたメソッドは各テスト実行前に実行される  
    [TearDown]  
    procedure TearDown;  // [TearDown]属性を付けたメソッドは各テスト実行後に実行される  
    // [SetupFixture][TeardownFixture]はそれぞれ  
    // クラス内のテスト全体の実行前/実行後に1度だけ実行される  
    [Test]  
    procedure Test1;  // [Test]属性をつけたメソッドはテストとして識別される  
    [Test]  
    [TestCase('TestA','1,2')]  
    [TestCase('TestB','3,4')]  
    // [TestCase]属性では、テストのパターンを指定することが出来る  
    // 第1引数にテスト名を、第2引数に実行メソッドの引数を**文字列、カンマ区切り**で入力する  
    procedure Test2(const AValue1 : Integer;const AValue2 : Integer);  
  end;  

implementation  

// ---実装部分は省略、出力直後は空メソッド---  

initialization  
  TDUnitX.RegisterTestFixture(TMyTestObject);  
// テストクラスの登録  
// ITestRunner#UseRTTIプロパティをTrueにすると自動的に登録されるらしいが、  
// Trueの際に記述しても別に害は無さそうなのでそのままにする。  

end.  

上記コードを書き直して以下のようにしてみた。どうなるかも見たかったのでNGパターンも入れた。

unit MainTestUnit;  

interface  

uses  
  DUnitX.TestFramework;  

type  
  [TestFixture]  
  TMyTestObject = class  
  public  
    [Test]  
    [TestCase('Pattern 1', '1,2,3')]  
    [TestCase('Pattern 2', '4,5,9')]  
    [TestCase('Pattern NG', '4,5,6')]  
    procedure TestAdd(const valueX, valueY, expected: Integer);  
  end;  

implementation  

uses  
  CalcUnit;  

{ TMyTestObject }  

procedure TMyTestObject.TestAdd(const valueX, valueY, expected: Integer);  
begin  
  Assert.AreEqual(expected, TCalc.Add(valueX, valueY));  
end;  

initialization  
  TDUnitX.RegisterTestFixture(TMyTestObject);  

end.  

Assert.AreEqualが判定部分。その他のメソッドは DUnitX の概要 - RAD Studio を参照。

以上の状態で、テストプロジェクトをビルドし、テストプロジェクトを実行する。

期待していたとおりの結果が得られた。

まとめ

普段はVisual Studioで作業しているので手間がかかるイメージがどうしても拭えない。とはいえ、自分でテストもどきを作るよりは管理が楽なので、今後はガンガン活用していきたいところ。

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@maccyoの技術ブログ(予定) C#/VB.NET/Kotlin/Delphi

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう