読者です 読者をやめる 読者になる 読者になる

DUnitでユニットテストを作成する

DelphiにはDUnitが含まれていて、ユニットテストを作成するのに使える。
以前使ったことはあるけど、書いていなかったので書いとく。
DelphiXE3で試した。

テストプロジェクトを作成する

テストを実行するテストランナーは、ビルドして実行ファイルの状態で実行することになるので、テスト用のプロジェクトをまずは作成する。
DUnitの場合、新規作成-その他-テストプロジェクトでウィザードを使って作成できる。
GUIでもCUIでもいいけど、今回はGUI

MyUnitTest.dpr
program MyUnitTest;

{$IFDEF CONSOLE_TESTRUNNER}
{$APPTYPE CONSOLE}
{$ENDIF}

uses
  DUnitTestRunner,
  uMyTest in 'uMyTest.pas';

{$R *.RES}

begin
  DUnitTestRunner.RunRegisteredTests;
end.

CONSOLE_TESTRUNNERのシンボルを指定するとCUIのテストランナーになる。

テスト対象のユニット

今回テストするユニットは以下のようなAdd関数。

uCalc.pas
unit uCalc;

interface

function Add(A, B: Integer): Integer;

implementation

function Add(A, B: Integer): Integer;
begin
  Result := A + B;
end;

end.

テストケースを作成する

関数が対象の場合、DelphiXE3の新規作成のテストケース作成のウィザードでは作れないっぽい。
なので、ユニットを追加して自分で書く。

uMyTest.pas
unit uMyTest;

interface

uses
  TestFramework, uCalc;

type
  TMyTestCase = class(TTestCase)
  published
    procedure TestAdd;
  end;

implementation

procedure TMyTestCase.TestAdd;
begin
  Check(uCalc.Add(10, 20) = 30);
end;

initialization

RegisterTest(TMyTestCase.Suite);

end.

initialization節でRegisterTestを呼び出して、テストケースを登録している。忘れがち。

実行結果

GUIの場合はアプリケーションを起動して、テスト開始のボタンをクリックすればテストが実行される。

感想

DUnitは相変わらずだなーという印象。OSXの場合はCUIのみサポートっぽい。
Jenkinsでテストの結果を集計したい場合はテスト結果のフォーマットを変えないといけないのかな。
SynopseのTSynTestCaseのほうが良さそうに見えるけど、どうだろうか?

2012/11/08追記

DUnitのソースコード読んでみたらいろいろ機能持ってることがわかった。TSynTestCaseより全然いい。なるほどがんばってらっしゃる。